diff --git a/nrich-excel-api/src/main/java/net/croz/nrich/excel/api/request/CreateExcelReportRequest.java b/nrich-excel-api/src/main/java/net/croz/nrich/excel/api/request/CreateExcelReportRequest.java index 301bc73f4..523079458 100644 --- a/nrich-excel-api/src/main/java/net/croz/nrich/excel/api/request/CreateExcelReportRequest.java +++ b/nrich-excel-api/src/main/java/net/croz/nrich/excel/api/request/CreateExcelReportRequest.java @@ -65,6 +65,11 @@ public class CreateExcelReportRequest { */ private final MultiRowDataProvider multiRowDataProvider; + /** + * Determines if column size should be calculated based on content. + */ + private final boolean autoSizeColumns; + /** * Creates {@link CreateExcelReportRequest} Builder instance from flat data. * diff --git a/nrich-excel-api/src/main/java/net/croz/nrich/excel/api/request/CreateReportGeneratorRequest.java b/nrich-excel-api/src/main/java/net/croz/nrich/excel/api/request/CreateReportGeneratorRequest.java index e64600d3b..df2624aab 100644 --- a/nrich-excel-api/src/main/java/net/croz/nrich/excel/api/request/CreateReportGeneratorRequest.java +++ b/nrich-excel-api/src/main/java/net/croz/nrich/excel/api/request/CreateReportGeneratorRequest.java @@ -54,4 +54,9 @@ public class CreateReportGeneratorRequest { */ private final int firstRowIndex; + /** + * Determines if column size should be calculated based on content. + */ + private final boolean autoSizeColumns; + } diff --git a/nrich-excel/README.md b/nrich-excel/README.md index a00a1117d..9e1e4e69d 100644 --- a/nrich-excel/README.md +++ b/nrich-excel/README.md @@ -128,6 +128,7 @@ public class ExampleReportService { .batchSize(10) .outputStream(outputStream) .templatePath("classpath:excel/template.xlsx") + .autoSizeColumns(true) .firstRowIndex(3) .build(); diff --git a/nrich-excel/src/main/java/net/croz/nrich/excel/generator/PoiExcelReportGenerator.java b/nrich-excel/src/main/java/net/croz/nrich/excel/generator/PoiExcelReportGenerator.java index dba5611c1..345a498c3 100644 --- a/nrich-excel/src/main/java/net/croz/nrich/excel/generator/PoiExcelReportGenerator.java +++ b/nrich-excel/src/main/java/net/croz/nrich/excel/generator/PoiExcelReportGenerator.java @@ -29,6 +29,7 @@ import org.apache.poi.ss.usermodel.CreationHelper; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Sheet; +import org.apache.poi.xssf.streaming.SXSSFSheet; import org.apache.poi.xssf.streaming.SXSSFWorkbook; import org.apache.poi.xssf.usermodel.XSSFWorkbook; import org.springframework.util.Assert; @@ -54,7 +55,7 @@ public class PoiExcelReportGenerator implements ExcelReportGenerator { private final SXSSFWorkbook workbook; - private final Sheet sheet; + private final SXSSFSheet sheet; private final CreationHelper creationHelper; @@ -62,16 +63,22 @@ public class PoiExcelReportGenerator implements ExcelReportGenerator { private final Map, CellStyle> defaultStyleMap; + private final boolean autoSizeColumns; + private int currentRowNumber; private boolean templateOpen = true; public PoiExcelReportGenerator(List cellValueConverterList, OutputStream outputStream, InputStream template, List templateVariableList, - List typeDataFormatList, List columnDataFormatList, int startIndex) { + List typeDataFormatList, List columnDataFormatList, int startIndex, boolean autoSizeColumns) { this.cellValueConverterList = cellValueConverterList; this.outputStream = outputStream; this.workbook = initializeWorkBookWithTemplate(template, templateVariableList); this.sheet = workbook.getSheetAt(0); + this.autoSizeColumns = autoSizeColumns; + if (autoSizeColumns) { + this.sheet.trackAllColumnsForAutoSizing(); + } this.creationHelper = workbook.getCreationHelper(); this.cellStyleMap = createStyleMap(columnDataFormatList); this.defaultStyleMap = createDefaultStyleMap(typeDataFormatList); @@ -97,6 +104,7 @@ public void writeRowData(Object... reportDataList) { @SneakyThrows @Override public void flush() { + autoSizeColumnsIfRequired(); workbook.write(outputStream); this.templateOpen = false; } @@ -181,4 +189,11 @@ private Map, CellStyle> createDefaultStyleMap(List type .filter(typeDataFormat -> typeDataFormat.getDataFormat() != null) .collect(Collectors.toMap(TypeDataFormat::getType, value -> createCellStyle(value.getDataFormat()))); } + + private void autoSizeColumnsIfRequired() { + if (autoSizeColumns) { + int numberOfColumns = this.sheet.getRow(this.sheet.getLastRowNum()).getLastCellNum(); + IntStream.range(0, numberOfColumns + 1).forEach(sheet::autoSizeColumn); + } + } } diff --git a/nrich-excel/src/main/java/net/croz/nrich/excel/generator/PoiExcelReportGeneratorFactory.java b/nrich-excel/src/main/java/net/croz/nrich/excel/generator/PoiExcelReportGeneratorFactory.java index cc1856444..4edbcb432 100644 --- a/nrich-excel/src/main/java/net/croz/nrich/excel/generator/PoiExcelReportGeneratorFactory.java +++ b/nrich-excel/src/main/java/net/croz/nrich/excel/generator/PoiExcelReportGeneratorFactory.java @@ -48,7 +48,8 @@ public ExcelReportGenerator createReportGenerator(CreateReportGeneratorRequest r InputStream template = resolveTemplate(request.getTemplatePath()); return new PoiExcelReportGenerator( - cellValueConverterList, request.getOutputStream(), template, request.getTemplateVariableList(), typeDataFormatList, request.getColumnDataFormatList(), request.getFirstRowIndex() + cellValueConverterList, request.getOutputStream(), template, request.getTemplateVariableList(), typeDataFormatList, request.getColumnDataFormatList(), request.getFirstRowIndex(), + request.isAutoSizeColumns() ); } diff --git a/nrich-excel/src/main/java/net/croz/nrich/excel/service/DefaultExcelReportService.java b/nrich-excel/src/main/java/net/croz/nrich/excel/service/DefaultExcelReportService.java index 5d7616246..820f7f921 100644 --- a/nrich-excel/src/main/java/net/croz/nrich/excel/service/DefaultExcelReportService.java +++ b/nrich-excel/src/main/java/net/croz/nrich/excel/service/DefaultExcelReportService.java @@ -70,6 +70,7 @@ private CreateReportGeneratorRequest toCreateReportGeneratorRequest(CreateExcelR .outputStream(reportRequest.getOutputStream()) .templatePath(reportRequest.getTemplatePath()) .templateVariableList(reportRequest.getTemplateVariableList()) + .autoSizeColumns(reportRequest.isAutoSizeColumns()) .build(); } } diff --git a/nrich-excel/src/test/java/net/croz/nrich/excel/generator/PoiExcelReportGeneratorTest.java b/nrich-excel/src/test/java/net/croz/nrich/excel/generator/PoiExcelReportGeneratorTest.java index 527582b0b..ba3f7aee8 100644 --- a/nrich-excel/src/test/java/net/croz/nrich/excel/generator/PoiExcelReportGeneratorTest.java +++ b/nrich-excel/src/test/java/net/croz/nrich/excel/generator/PoiExcelReportGeneratorTest.java @@ -80,7 +80,7 @@ void setup() { outputStream = new ByteArrayOutputStream(); excelReportGenerator = new PoiExcelReportGenerator( - cellValueConverterList, outputStream, template, templateVariableList, typeDataFormatList, columnDataFormatList, TEMPLATE_DATA_FIRST_ROW_INDEX + cellValueConverterList, outputStream, template, templateVariableList, typeDataFormatList, columnDataFormatList, TEMPLATE_DATA_FIRST_ROW_INDEX, false ); } diff --git a/nrich-excel/src/test/java/net/croz/nrich/excel/testutil/ExcelReportRequestGeneratingUtil.java b/nrich-excel/src/test/java/net/croz/nrich/excel/testutil/ExcelReportRequestGeneratingUtil.java index d11f9d4db..07e2c98eb 100644 --- a/nrich-excel/src/test/java/net/croz/nrich/excel/testutil/ExcelReportRequestGeneratingUtil.java +++ b/nrich-excel/src/test/java/net/croz/nrich/excel/testutil/ExcelReportRequestGeneratingUtil.java @@ -34,6 +34,7 @@ public static CreateExcelReportRequest createExcelReportRequest(Object[][] rowDa .batchSize(batchSize) .outputStream(outputStream) .templatePath(TEMPLATE_PATH) + .autoSizeColumns(true) .firstRowIndex(firstRowIndex).build(); }