Java 8 и Apache POI 4.1.x здесь. Мне нужно:
- Прочитать в файле шаблона Excel, который содержит только одну строку предварительно стилизованных столбцов заголовка
- Записать
List<Fizz>
(список POJO) в новый файл Excel, который использует этот шаблон
Я делаю это потому, что в шаблоне Excel много сложных стилей, и поэтому просто использовать существующий в качестве входных данных шаблона было намного проще, чем я пытаясь вручную сгенерировать стили с помощью POI и CellUtil
.
У меня это отлично работает, например, так:
List<Fizz> fizzes = getSomehow();
InputStream inp = this.getClass().getClassLoader().getResource("my-template.xlsx").openStream();
Workbook workbook = WorkbookFactory.create(inp);
Sheet sheet = workbook.getSheetAt(0);
// the header is at row = 0 (0-based rows)
// so start writing the list on the row=1 (1st data/non-header row)
int rowNum = 1;
for (Fizz fizz : fizzes) {
Row nextRow = sheet.createRow(rowNum);
Cell itemNumber = nextRow.createCell(0);
itemNumber.setCellValue(fizz.getItemNumber());
Cell description = nextRow.createCell(1);
description.setCellValue(fizz.getDescription());
rowNum++;
}
// resize the columns appropriately
for (int c = 0; c < 2; c++) {
sheet.autoSizeColumn(c);
}
// export to file system
FileOutputStream fos = new FileOutputStream("some-output.xlsx");
workbook.write(fos);
fos.close();
inp.close();
workbook.close();
Все отлично работает, за одним исключением: часто Fizz#description
довольно длинный, иногда длиной в сотни символов. Поскольку в моем коде нет использования переноса текста, и поскольку я использую autoSizeColumn
для всех столбцов, POI устанавливает ширину столбца Description равной длине самого длинного описания.
Вместо этого я сейчас хочу остановить , используя autoSizeColumn
(я думаю!) И вместо этого:
Принудительно использовать выходной файл (в нашем случае "some-output.xlsx"
) ) Description ширина столбца, равная ширине столбца Description файла входного шаблона. Так что если столбец Description в my-template.xlsx
равен, скажем, 54, то я хочу, чтобы столбец Description some-output.xlsx
также был 54.
Если описание Fizz текущей строки слишком длинное для этой ширины, я Я хочу применить перенос текста так, чтобы столбец оставался фиксированным (опять же, в данном случае, 54), но чтобы описание вписывалось в него.
Я хотел бы сделать это для каждого столбца, и в идеале я хотел бы например, код для определения ширины каждого столбца в шаблоне. Я говорю, что, поскольку я хотел бы иметь возможность открывать шаблон в Excel, изменять его ширину вручную, сохранять его, затем повторно запускать мой код и получать его при этом изменении ширины.
Любые идеи о том, что я могу сделать, чтобы сделать sh это?