From 5fa54d8b4a257b7195f53c4a336239729d779553 Mon Sep 17 00:00:00 2001 From: Jimmy Liu Jia <1365121844@qq.com> Date: Sat, 17 Oct 2026 00:38:37 +0800 Subject: [PATCH] Escape conditional formatting formulas in worksheet XML --- .../ConditionalFormattingExpressionRule.java | 2 +- .../dhatim/fastexcel/PoiCompatibilityTest.java | 15 +++++++++++++++ 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/fastexcel-writer/src/main/java/org/dhatim/fastexcel/ConditionalFormattingExpressionRule.java b/fastexcel-writer/src/main/java/org/dhatim/fastexcel/ConditionalFormattingExpressionRule.java index 52368781..13c6cd1e 100644 --- a/fastexcel-writer/src/main/java/org/dhatim/fastexcel/ConditionalFormattingExpressionRule.java +++ b/fastexcel-writer/src/main/java/org/dhatim/fastexcel/ConditionalFormattingExpressionRule.java @@ -30,7 +30,7 @@ public ConditionalFormattingExpressionRule(String expression, boolean stopIfTrue public void write(Writer w) throws IOException { w .append("") - .append("").append(expression).append("") + .append("").appendEscaped(expression).append("") .append(""); } } diff --git a/fastexcel-writer/src/test/java/org/dhatim/fastexcel/PoiCompatibilityTest.java b/fastexcel-writer/src/test/java/org/dhatim/fastexcel/PoiCompatibilityTest.java index 67b3debf..91339f48 100644 --- a/fastexcel-writer/src/test/java/org/dhatim/fastexcel/PoiCompatibilityTest.java +++ b/fastexcel-writer/src/test/java/org/dhatim/fastexcel/PoiCompatibilityTest.java @@ -809,6 +809,21 @@ void hasValidCellConditionalFormatting() throws Exception { assertTrue(cellRange.formatAsString().equals("A1")); } + @Test + void conditionalFormattingExpressionIsEscaped() throws Exception { + String formula = "IF(A1<5,A1&\"x\",\"\")"; + byte[] data = writeWorkbook(wb -> { + Worksheet ws = wb.newWorksheet("Worksheet 1"); + ws.style(0, 0).fillColor("FF8800").set(new ConditionalFormattingExpressionRule(formula, true)); + }); + + try (XSSFWorkbook workbook = new XSSFWorkbook(new ByteArrayInputStream(data))) { + XSSFConditionalFormattingRule rule = workbook.getSheetAt(0) + .getSheetConditionalFormatting().getConditionalFormattingAt(0).getRule(0); + assertEquals(formula, rule.getFormula1()); + } + } + @Test void hasValidRangeConditionalFormatting() throws Exception { byte[] data = writeWorkbook(wb -> {