From 64d98e787253180aa4001495b11bd6356ffecddc Mon Sep 17 00:00:00 2001 From: Yegor Kozlov Date: Wed, 20 Dec 2017 16:30:13 +0000 Subject: [PATCH] Bug 61869: updating a cell with shared formula produces an unreadable file git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1818818 13f79535-47bb-0310-9956-ffa450edef68 --- .../apache/poi/xssf/usermodel/XSSFCell.java | 19 +++++++--- .../poi/xssf/usermodel/TestXSSFCell.java | 33 +++++++++++++++++- test-data/spreadsheet/61869.xlsx | Bin 0 -> 8820 bytes 3 files changed, 46 insertions(+), 6 deletions(-) create mode 100644 test-data/spreadsheet/61869.xlsx diff --git a/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFCell.java b/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFCell.java index 574cecfc1..941e03711 100644 --- a/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFCell.java +++ b/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFCell.java @@ -558,21 +558,30 @@ public final class XSSFCell implements Cell { XSSFWorkbook wb = _row.getSheet().getWorkbook(); if (formula == null) { wb.onDeleteFormula(this); - if(_cell.isSetF()) { + if (_cell.isSetF()) { _cell.unsetF(); } return; } - if(wb.getCellFormulaValidation()) { + if (wb.getCellFormulaValidation()) { XSSFEvaluationWorkbook fpb = XSSFEvaluationWorkbook.create(wb); //validate through the FormulaParser FormulaParser.parse(formula, fpb, formulaType, wb.getSheetIndex(getSheet()), getRowIndex()); } - CTCellFormula f = CTCellFormula.Factory.newInstance(); - f.setStringValue(formula); - _cell.setF(f); + CTCellFormula f; + if (_cell.isSetF()) { + f = _cell.getF(); + f.setStringValue(formula); + if(f.getT() == STCellFormulaType.SHARED){ + getRow().getSheet().onReadCell(this); + } + } else { + f = CTCellFormula.Factory.newInstance(); + f.setStringValue(formula); + _cell.setF(f); + } if(_cell.isSetV()) { _cell.unsetV(); } diff --git a/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFCell.java b/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFCell.java index 01cd88033..0735456e5 100644 --- a/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFCell.java +++ b/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFCell.java @@ -48,6 +48,7 @@ import org.apache.poi.xssf.XSSFTestDataSamples; import org.apache.poi.xssf.model.SharedStringsTable; import org.junit.Test; import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTCell; +import org.openxmlformats.schemas.spreadsheetml.x2006.main.STCellFormulaType; import org.openxmlformats.schemas.spreadsheetml.x2006.main.STCellType; import static org.junit.Assert.*; @@ -670,4 +671,34 @@ public final class TestXSSFCell extends BaseTestXCell { destCell.setCellValue(true); } -} + + /** + * Bug 61869: updating a shared formula produces an unreadable file + */ + @Test + public void test61869() throws Exception { + try (XSSFWorkbook wb = XSSFTestDataSamples.openSampleWorkbook("61869.xlsx")) { + XSSFSheet sheet = wb.getSheetAt(0); + XSSFCell c2 = sheet.getRow(1).getCell(2); + assertEquals("SUM(A2,B2)", c2.getCellFormula()); + assertEquals(STCellFormulaType.SHARED, c2.getCTCell().getF().getT()); + assertEquals(0, c2.getCTCell().getF().getSi()); + XSSFCell c3 = sheet.getRow(2).getCell(2); + assertEquals(STCellFormulaType.SHARED, c3.getCTCell().getF().getT()); + assertEquals(0, c3.getCTCell().getF().getSi()); + assertEquals("SUM(A3,B3)", c3.getCellFormula()); + + assertEquals("SUM(A2,B2)", sheet.getSharedFormula(0).getStringValue()); + + c2.setCellFormula("SUM(A2:B2)"); + assertEquals(STCellFormulaType.SHARED, c2.getCTCell().getF().getT()); // c2 remains the master formula + + assertEquals("SUM(A2:B2)", sheet.getSharedFormula(0).getStringValue()); + assertEquals(STCellFormulaType.SHARED, c3.getCTCell().getF().getT()); + assertEquals(0, c3.getCTCell().getF().getSi()); + assertEquals("SUM(A3:B3)", c3.getCellFormula()); // formula in the follower cell is rebuilt + + } + + } +} \ No newline at end of file diff --git a/test-data/spreadsheet/61869.xlsx b/test-data/spreadsheet/61869.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..bc55a3a1c7bbf65af2c98afee907bf2a91da1859 GIT binary patch literal 8820 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 literal 0 HcmV?d00001