From 8fff795a4449c12a2b5ad2bc8aeb1708cf467b61 Mon Sep 17 00:00:00 2001 From: agrancaric Date: Mon, 19 Aug 2024 09:35:56 +0200 Subject: [PATCH] Limit quoting strings in excel to string that starts with one of formula characters --- .../nrich/excel/generator/PoiExcelReportGenerator.java | 9 +++++++-- .../excel/generator/PoiExcelReportGeneratorTest.java | 4 ++-- 2 files changed, 9 insertions(+), 4 deletions(-) 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 878fecc6..e4c0b68c 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 @@ -49,6 +49,8 @@ public class PoiExcelReportGenerator implements ExcelReportGenerator { private static final Pattern TEMPLATE_VARIABLE_PATTERN = Pattern.compile("\\$\\{(.*?)}"); + private static final List FORMULA_CHARACTER_LIST = List.of("=", "+", "-", "@"); + private final List cellValueConverterList; private final OutputStream outputStream; @@ -149,8 +151,11 @@ private void setCellValue(Cell cell, Object value, CellStyle style) { .orElse(null); if (converter == null) { - cell.setCellValue(value.toString()); - cell.getCellStyle().setQuotePrefixed(true); + String stringValue = value.toString(); + cell.setCellValue(stringValue); + if (stringValue != null && FORMULA_CHARACTER_LIST.stream().anyMatch(stringValue::startsWith)) { + cell.getCellStyle().setQuotePrefixed(true); + } } else { converter.setCellValue(cellHolder, value); 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 ba3f7aee..4002c491 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 @@ -90,10 +90,10 @@ void shouldExportDataToExcel() { Instant now = Instant.now().truncatedTo(ChronoUnit.DAYS); Object[] rowData = new Object[] { 1.1, "value", new Date(now.toEpochMilli()), ZonedDateTime.now().truncatedTo(ChronoUnit.DAYS), OffsetDateTime.now().truncatedTo(ChronoUnit.DAYS), now, now, 1, 1.5F, (short) 1, - LocalDate.now(), LocalDateTime.now().truncatedTo(ChronoUnit.DAYS), BigDecimal.valueOf(1.5), 10L, TestEnum.FIRST, TestEnum.SECOND, null + LocalDate.now(), LocalDateTime.now().truncatedTo(ChronoUnit.DAYS), BigDecimal.valueOf(1.5), 10L, TestEnum.FIRST, TestEnum.SECOND, null, "=123" }; // when resolving data from cells all dates are converted to instant, all decimal numbers are converted to double and all whole numbers are converted to integer - Object[] expectedRowData = new Object[] { 1.1, "value", now, now, now, now, now, 1, 1.5, 1, now, now, 1.5, 10, "First", "SECOND", null }; + Object[] expectedRowData = new Object[] { 1.1, "value", now, now, now, now, now, 1, 1.5, 1, now, now, 1.5, 10, "First", "SECOND", null, "=123" }; // when excelReportGenerator.writeRowData(rowData);