Apache POI: добавление строк в существующий файл Excel

Научитесь добавлять новые строки в таблицу Excel на Java с помощью Apache POI. В этом примере мы научимся подготавливать данные(для записи), а затем добавлять новые строки после последней строки в существующей таблице.

1. Знаток

Добавьте последнюю версию org.apache.poi:poi и org.apache.poi:poi-ooxml в приложение, если она еще не добавлена.

<dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>5.2.2</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>5.2.2</version></dependency>

2. Основные классы и методы

POI использует следующие классы для чтения и записи данных:

  • XSSFWorkbook: представляет собой рабочую книгу Excel.
  • Лист: представляет лист в рабочей книге.
  • Строка: представляет строку на листе.
  • Ячейка: представляет ячейку в любой строке.

Чтобы записать или добавить записи на лист, нам необходимо использовать следующие методы:

  • workbook.getSheetAt(index) или workbook.getSheet(name) получает лист по его индексу или имени. Индекс начинается с 0.
  • sheet.getLastRowNum() возвращает номер последней строки в листе. Помогает в случае добавления новых строк.
  • sheet.createRow(num) создает новую строку на указанном листе.
  • row.createCell(num) создает новую ячейку в указанной строке.
  • cell.setCellValue(val) устанавливает значение в указанной ячейке.

См. также: Чтение и запись файлов Excel на Java

3. Добавление строк к существующему листу

Используя описанные выше методы, мы добавим новые строки в следующую таблицу Excel.

Apache POI: добавление строк в существующий файл Excel0

Данные могут быть в любой форме. Для простоты у нас есть следующая модель, содержащая данные.

public class BusinessEntity {private String firstName;private String lastName;private String age;//constructors, getters and setters}

Хотя мы можем написать логику по мере необходимости, здесь мы создаем общий Object[], который передадим в функцию утилиты. Значения в массиве объектов сопоставляются с ячейками в строке в порядке индекса.

Apache POI: добавление строк в существующий файл Excel1
private static Map<Integer, Object[]> prepareData(int rowNum, List<BusinessEntity> recordsToWrite) {Map<Integer, Object[]> data = new HashMap<>();for(BusinessEntity entity : recordsToWrite) {rowNum++;data.put(rowNum, new Object[]{rowNum,entity.getFirstName(),entity.getLastName(),entity.getAge()});}return data;}

Ниже приведена служебная функция для записи записей в Excel.

  • В качестве параметров метода он принимает путь к файлу и записи.
  • Затем он вызывает prepareData() для создания массива объектов.
  • Наконец, массив объектов итерируется, и значения ячеек заполняются на основе индексов в массиве.
  • Правильная строка для добавления данных вычисляется с помощью функции sheet.getLastRowNum() и прибавления к ней 1.

Обратите внимание, что функция проверяет тип данных для значений в массиве объектов, чтобы мы могли вызвать соответствующий метод setCellValue().

public static void appendRows(List<BusinessEntity> recordsToWrite, File file)throws IOException, InvalidFormatException {XSSFWorkbook workbook = new XSSFWorkbook(new FileInputStream(file));Sheet sheet = workbook.getSheetAt(0);int rowNum = sheet.getLastRowNum() + 1;Map<Integer, Object[]> data = prepareData(rowNum, recordsToWrite);Set<Integer> keySet = data.keySet();for(Integer key : keySet) {Row row = sheet.createRow(rowNum++);Object[] objArr = data.get(key);int cellNum = 0;for(Object obj : objArr) {Cell cell = row.createCell(cellNum++);if(obj instanceof String)cell.setCellValue((String) obj);else if(obj instanceof Integer)cell.setCellValue((Integer) obj);}}try {FileOutputStream out = new FileOutputStream(file);workbook.write(out);out.close();} catch(Exception e) {e.printStackTrace();}}

4. Демонстрация

Чтобы запустить демо, мы создадим несколько записей и передадим их служебной функции appendRows() вместе с путем к файлу.

public static void main(String[] args) {File file = new File("C:\\temp\\data.xlsx");List<BusinessEntity> recordsToWrite = List.of(new BusinessEntity("Charles", "Babej", 60),new BusinessEntity("John", "Doe", 70),new BusinessEntity("Loreum", "Ipsum", 80));try {appendRows(recordsToWrite, file);} catch(IOException | InvalidFormatException e) {e.printStackTrace();}}

Проверьте добавленные строки в файле Excel. Обратите внимание, что форматирование значений ячеек выходит за рамки этого руководства.

Apache POI: добавление строк в существующий файл Excel2

5. Заключение

В этом уроке Apache POI мы научились добавлять новые строки в существующий лист Excel, создав несколько служебных функций. Я предложу вам поиграть с кодом для лучшего понимания.

Исходный код на Github

Прокрутить вверх