Научитесь добавлять новые строки в таблицу 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.

Данные могут быть в любой форме. Для простоты у нас есть следующая модель, содержащая данные.
public class BusinessEntity {private String firstName;private String lastName;private String age;//constructors, getters and setters}
Хотя мы можем написать логику по мере необходимости, здесь мы создаем общий Object[], который передадим в функцию утилиты. Значения в массиве объектов сопоставляются с ячейками в строке в порядке индекса.

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. Обратите внимание, что форматирование значений ячеек выходит за рамки этого руководства.

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