Ниже приведена демонстрация того, как импортировать (читать) и экспортировать (записывать) файлы Excel (формат .xlsx) с использованием Apache POI.
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>5.2.0</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>5.2.0</version>
</dependency>
Откройте файл Excel, прочитайте данные и распечатайте содержимое на консоль:
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
public class ExcelReaderExample {
public static void main(String[] args) {
// Укажите путь к файлу Excel для чтения
String filePath = "path/to/your/excel/file.xlsx";
// Открыть файл с помощью FileInputStream
try (FileInputStream fis = new FileInputStream(new File(filePath))) {
// Создать объект рабочей книги
Workbook workbook = new XSSFWorkbook(fis);
// Получите первый рабочий лист (Sheet), индекс начинается с 0.
Sheet sheet = workbook.getSheetAt(0);
// Перебрать каждую строку рабочего листа
for (Row row : sheet) {
// Перебирать каждую ячейку в строке
for (Cell cell : row) {
// Прочитайте содержимое ячейки и распечатайте на консоли.
System.out.print(getCellValue(cell) + "\t");
}
// Разрыв строки после каждой прочитанной строки
System.out.println();
}
// Когда работа будет завершена, закройте книгу (фактически в этом примере это не требуется, поскольку используется попытка с ресурсами).
// workbook.close();
} catch (IOException e) {
// Обработка исключений, которые могут возникнуть при чтении файла
e.printStackTrace();
}
}
// Вспомогательный метод: получение значения ячейки на основе типа ячейки.
private static String getCellValue(Cell cell) {
DataFormatter formatter = new DataFormatter(); // Создайте объект форматирования для обработки различных типов данных.
return formatter.formatCellValue(cell); // Возвращает отформатированное содержимое ячейки
}
}
Обратите внимание, что метод getCellValue использует класс DataFormatter, чтобы гарантировать, что независимо от типа данных, содержащихся в ячейке (например, число, дата или текст), ее строковое представление возвращается в соответствующем формате.
При использовании Apache POI для записи файла Excel в формате .xlsx вам необходимо создать объект XSSFWorkbook, представляющий всю книгу, а затем создать в нем объект XSSFSheet, представляющий рабочий лист. Затем вы создаете строки и ячейки на листе и устанавливаете их значения. Наконец, книга записывается в файловую систему.
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import java.io.FileOutputStream;
import java.io.IOException;
public class ExcelWriterExample {
public static void main(String[] args) {
// Создать новую книгу
Workbook workbook = new XSSFWorkbook();
// Создайте рабочий лист (Лист) с именем «MySheet».
Sheet sheet = workbook.createSheet("MySheet");
// Создайте строки в существующем рабочем листе (отсчет начинается с 0)
Row row = sheet.createRow(0);
// Создайте ячейки (считая от 0) в существующей строке и задайте значение
Cell cell = row.createCell(0);
cell.setCellValue("Hello");
// Создайте еще одну ячейку и установите значение
Cell cell2 = row.createCell(1);
cell2.setCellValue("World");
// Строки и ячейки также можно создавать в цепочке.
sheet.createRow(1).createCell(0).setCellValue("Apache");
sheet.getRow(1).createCell(1).setCellValue("POI");
// Запись в файловую систему
try (FileOutputStream fos = new FileOutputStream("path/to/your/excel/file.xlsx")) {
workbook.write(fos);
} catch (IOException e) {
e.printStackTrace();
}
// Закройте книгу (в этом примере это не требуется, поскольку используется попытка с ресурсами).
// workbook.close();
System.out.println("Excel file written successfully.");
}
}
Одним из основных улучшений EasyExcel является внедрение стратегий «разделения чтения и записи» и «отложенной загрузки» при обработке больших данных. В частности, EasyExcel произвел следующие оптимизации:
Хотя EasyExcel выполнил множество оптимизаций на основе POI, он по-прежнему использует некоторые основные компоненты POI для обработки основных деталей файлов XLSX. Таким образом, при использовании EasyExcel вы все равно можете видеть тень POI, особенно при работе с некоторыми сложными функциями Excel. Однако EasyExcel предоставляет более эффективное и лаконичное решение для большинства распространенных задач чтения и записи Excel.
В ваш проект добавлена зависимость easyExcel. Если вы используете Maven, вы можете добавить в файл pom.xml следующие зависимости:
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>последняя версия</version> <!-- Пожалуйста, замените фактический номер последней версии. -->
</dependency>
Используйте API чтения easyExcel и укажите индекс листа для чтения (отсчет начинается с 0, индекс второго листа равен 1).
Реализуйте прослушиватель для обработки считанных строк данных и пакетной записи данных в базу данных в этом прослушивателе.
import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.alibaba.excel.read.builder.ExcelReaderBuilder;
import com.alibaba.excel.read.builder.ExcelReaderSheetBuilder;
import com.alibaba.excel.read.metadata.ReadSheet;
import java.util.ArrayList;
import java.util.List;
// Класс модели данных
class DataModel {
private String column1;
private String column2;
// ... Другие поля
// Опустить методы получения и установки
}
// Класс для чтения Excel и записи в базу данных
public class ExcelReaderToDB {
// Имитированный метод пакетной записи в базу данных
private void batchInsertToDB(List<DataModel> dataList) {
// Это должен быть код, который фактически записывает данные Воли в базу данных.
// Здесь мы делаем только моделирование распечатки
System.out.println("Inserting batch of " + dataList.size() + " rows to DB...");
for (DataModel data : dataList) {
System.out.println(data);
}
}
// Как читать файлы Excel
public void readExcelFile(String filePath) {
// Индекс второго листа равен 1.
int sheetIndex = 1;
// Чтение файла Excel
ExcelReaderBuilder readerBuilder = EasyExcel.read(filePath);
ExcelReaderSheetBuilder sheetBuilder = readerBuilder.sheet(sheetIndex);
// Чтение данных и регистрация прослушивателей
sheetBuilder.registerReadListener(new AnalysisEventListener<DataModel>() {
// Используется для кэширования считанных данных
private List<DataModel> cachedDataList = new ArrayList<>();
// Этот метод вызывается при чтении каждой строки данных
@Override
public void invoke(DataModel dataModel, AnalysisContext analysisContext) {
cachedDataList.add(dataModel);
// При считывании определенного объема данных можно выполнить пакетную запись в базу данных.
// Здесь предполагается, что мы записываем в базу данных каждый раз, когда читаем 100 строк данных.
if (cachedDataList.size() >= 100) {
batchInsertToDB(cachedDataList);
// Очистить кеш
cachedDataList.clear();
}
}
// Этот метод будет вызван после завершения всего анализа данных.
@Override
public void doAfterAllAnalysed(AnalysisContext analysisContext) {
// Воля Остальные данные записываются в базу данных
if (!cachedDataList.isEmpty()) {
batchInsertToDB(cachedDataList);
cachedDataList.clear();
}
}
});
// Начать читать
sheetBuilder.build();
readerBuilder.build().read();
}
public static void main(String[] args) {
String filePath = "path/to/your/excel/file.xlsx";
ExcelReaderToDB excelReader = new ExcelReaderToDB();
excelReader.readExcelFile(filePath);
}
}
Определите класс модели для представления данных, которые вы хотите записать. Создайте класс модели данных для сопоставления столбцов данных в таблице Excel и используйте аннотации easyExcel для определения связи заголовка таблицы и сопоставления полей.
Напишите метод для создания объекта записи Excel и заполнения данных в файл Excel.
import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.write.metadata.WriteSheet;
import com.alibaba.excel.annotation.ExcelProperty;
import java.util.ArrayList;
import java.util.List;
// Класс модели данных,Используйте аннотации для определения связей сопоставления заголовков и полей.
public class DataModel {
// Сопоставление имен заголовков и полей
@ExcelProperty("имя")
private String name;
@ExcelProperty("возраст")
private Integer age;
// Опустить методы получения и установки
// Конструктор
public DataModel(String name, Integer age) {
this.name = name;
this.age = age;
}
}
// Класс для экспорта данных в Excel
public class ExcelExporter {
// смоделированные данные
private List<DataModel> getData() {
List<DataModel> list = new ArrayList<>();
list.add(new DataModel("Чжан Сан", 20));
list.add(new DataModel("Ли Си", 22));
list.add(new DataModel("Оборудование", 24));
return list;
}
// Экспорт данных в файл Excel
public void exportToExcel(String filePath) {
// Создать объект записи
EasyExcel.write(filePath, DataModel.class)
.sheet("Sheet1") // Установить имя листа
.doWrite(getData()); // Запись данных
}
public static void main(String[] args) {
String filePath = "path/to/your/excel/file.xlsx";
ExcelExporter exporter = new ExcelExporter();
exporter.exportToExcel(filePath);
}
}
Apache POI предоставляет богатый и гибкий API, который позволяет разработчикам работать с файлами Excel различными способами. Однако из-за его обширных и сложных функций кривая обучения API относительно крутая, и новичкам может потребоваться некоторое время, чтобы ознакомиться с ним.
Для сравнения, дизайн API easyExcel более краток и интуитивно понятен. Он предоставляет упрощенные методы для решения распространенных задач, что позволяет разработчикам выполнять задачи быстрее. Кроме того, easyExcel также поддерживает расширенные функции, такие как пользовательские стратегии чтения и записи, асинхронная обработка и проверка данных. Эти функции доступны разработчикам через простые API, что повышает простоту использования.
Apache POI и easyExcel — отличные библиотеки Java для обработки файлов Excel. Apache POI, известный своей полнотой и гибкостью, обеспечивает полную поддержку файлов Excel. Однако при обработке больших файлов могут возникнуть проблемы с производительностью и высокое потребление памяти. Напротив, easyExcel оптимизирован для обработки больших файлов, обеспечивая более высокую производительность и меньшее потребление памяти. Кроме того, API-интерфейс easyExcel проще и удобнее в использовании, что позволяет разработчикам более эффективно выполнять задачи.
Выбирая, какую библиотеку использовать, разработчики должны принимать решение, исходя из потребностей проекта и размера файла. Если вашему проекту необходимо обрабатывать большие файлы Excel и предъявляются высокие требования к производительности и потреблению памяти, easyExcel может оказаться лучшим выбором. А если проект требует комплексных функций обработки файлов Excel и не имеет высоких требований к производительности, то Apache POI также станет хорошим выбором.
Навыки обновляются благодаря обмену ими, и каждый раз, когда я получаю новые знания, мое сердце переполняется радостью. Искренне приглашаем вас подписаться на публичный аккаунт 『
код тридцать пять
』 , для получения дополнительной технической информации.