From 3aa03459a7db618daafef8c78977309fd25104cf Mon Sep 17 00:00:00 2001 From: PJ Fanning Date: Wed, 28 Jul 2021 09:36:37 +0000 Subject: [PATCH] [bug-65464] fix issue where shared formulas can be corrupted git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1891849 13f79535-47bb-0310-9956-ffa450edef68 --- .../apache/poi/xssf/usermodel/XSSFSheet.java | 27 ++++++++-------- .../poi/xssf/usermodel/TestXSSFBugs.java | 29 +++++++++++++----- test-data/spreadsheet/bug65464.xlsx | Bin 0 -> 13664 bytes 3 files changed, 37 insertions(+), 19 deletions(-) create mode 100644 test-data/spreadsheet/bug65464.xlsx diff --git a/poi-ooxml/src/main/java/org/apache/poi/xssf/usermodel/XSSFSheet.java b/poi-ooxml/src/main/java/org/apache/poi/xssf/usermodel/XSSFSheet.java index 3ff4fc70e4..a631b5f22b 100644 --- a/poi-ooxml/src/main/java/org/apache/poi/xssf/usermodel/XSSFSheet.java +++ b/poi-ooxml/src/main/java/org/apache/poi/xssf/usermodel/XSSFSheet.java @@ -4619,18 +4619,21 @@ public class XSSFSheet extends POIXMLDocumentPart implements Sheet { DONE: for(int i = cell.getRowIndex(); i <= ref.getLastRow(); i++){ XSSFRow row = getRow(i); - if(row != null) for(int j = cell.getColumnIndex(); j <= ref.getLastColumn(); j++){ - XSSFCell nextCell = row.getCell(j); - if(nextCell != null && nextCell != cell && nextCell.getCellType() == CellType.FORMULA){ - CTCellFormula nextF = nextCell.getCTCell().getF(); - nextF.setStringValue(nextCell.getCellFormula(evalWb)); - CellRangeAddress nextRef = new CellRangeAddress( - nextCell.getRowIndex(), ref.getLastRow(), - nextCell.getColumnIndex(), ref.getLastColumn()); - nextF.setRef(nextRef.formatAsString()); - - sharedFormulas.put(Math.toIntExact(nextF.getSi()), nextF); - break DONE; + if(row != null) { + for(int j = cell.getColumnIndex(); j <= ref.getLastColumn(); j++){ + XSSFCell nextCell = row.getCell(j); + if(nextCell != null && nextCell != cell && nextCell.getCellType() == CellType.FORMULA) { + CTCellFormula nextF = nextCell.getCTCell().getF(); + nextF.setStringValue(nextCell.getCellFormula(evalWb)); + nextF.setT(STCellFormulaType.SHARED); //https://bz.apache.org/bugzilla/show_bug.cgi?id=65464 + CellRangeAddress nextRef = new CellRangeAddress( + nextCell.getRowIndex(), ref.getLastRow(), + nextCell.getColumnIndex(), ref.getLastColumn()); + nextF.setRef(nextRef.formatAsString()); + + sharedFormulas.put(Math.toIntExact(nextF.getSi()), nextF); + break DONE; + } } } } diff --git a/poi-ooxml/src/test/java/org/apache/poi/xssf/usermodel/TestXSSFBugs.java b/poi-ooxml/src/test/java/org/apache/poi/xssf/usermodel/TestXSSFBugs.java index 450f02b7af..ea5803bc90 100644 --- a/poi-ooxml/src/test/java/org/apache/poi/xssf/usermodel/TestXSSFBugs.java +++ b/poi-ooxml/src/test/java/org/apache/poi/xssf/usermodel/TestXSSFBugs.java @@ -117,13 +117,7 @@ import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.CsvSource; import org.junit.jupiter.params.provider.EnumSource; import org.junit.jupiter.params.provider.ValueSource; -import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTCalcCell; -import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTCols; -import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTDefinedName; -import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTDefinedNames; -import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTMergeCell; -import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTMergeCells; -import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTWorksheet; +import org.openxmlformats.schemas.spreadsheetml.x2006.main.*; import org.openxmlformats.schemas.spreadsheetml.x2006.main.impl.CTFontImpl; import org.xml.sax.InputSource; import org.xml.sax.SAXParseException; @@ -3544,4 +3538,25 @@ public final class TestXSSFBugs extends BaseTestBugzillaIssues { assertEquals(HorizontalAlignment.LEFT, cellLeft.getCellStyle().getAlignment()); } } + + @Test + void test65464() throws IOException { + try (XSSFWorkbook wb = openSampleWorkbook("bug65464.xlsx")) { + XSSFSheet sheet = wb.getSheet("SheetWithSharedFormula"); + XSSFCell v15 = sheet.getRow(14).getCell(21); + XSSFCell v16 = sheet.getRow(15).getCell(21); + assertEquals("U15/R15", v15.getCellFormula()); + assertEquals(STCellFormulaType.SHARED, v15.getCTCell().getF().getT()); + assertEquals("U16/R16", v16.getCellFormula()); + assertEquals(STCellFormulaType.NORMAL, v16.getCTCell().getF().getT()); //anomaly in original file + int calcChainSize = wb.getCalculationChain().getCTCalcChain().sizeOfCArray(); + + v15.removeFormula(); + assertEquals(CellType.NUMERIC, v15.getCellType(), "V15 is no longer a function"); + assertNull(v15.getCTCell().getF(), "V15 xmlbeans function removed"); + assertEquals("U16/R16", v16.getCellFormula()); + assertEquals(STCellFormulaType.SHARED, v16.getCTCell().getF().getT()); + assertEquals(calcChainSize - 1, wb.getCalculationChain().getCTCalcChain().sizeOfCArray()); + } + } } diff --git a/test-data/spreadsheet/bug65464.xlsx b/test-data/spreadsheet/bug65464.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..48eccea2209159b329e0c97709fac823cff4e666 GIT binary patch literal 13664 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 literal 0 HcmV?d00001 -- 2.39.5