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
This commit is contained in:
Yegor Kozlov 2017-12-20 16:30:13 +00:00
parent 12f82dd617
commit 64d98e7872
3 changed files with 46 additions and 6 deletions

View File

@ -558,21 +558,30 @@ public final class XSSFCell implements Cell {
XSSFWorkbook wb = _row.getSheet().getWorkbook(); XSSFWorkbook wb = _row.getSheet().getWorkbook();
if (formula == null) { if (formula == null) {
wb.onDeleteFormula(this); wb.onDeleteFormula(this);
if(_cell.isSetF()) { if (_cell.isSetF()) {
_cell.unsetF(); _cell.unsetF();
} }
return; return;
} }
if(wb.getCellFormulaValidation()) { if (wb.getCellFormulaValidation()) {
XSSFEvaluationWorkbook fpb = XSSFEvaluationWorkbook.create(wb); XSSFEvaluationWorkbook fpb = XSSFEvaluationWorkbook.create(wb);
//validate through the FormulaParser //validate through the FormulaParser
FormulaParser.parse(formula, fpb, formulaType, wb.getSheetIndex(getSheet()), getRowIndex()); FormulaParser.parse(formula, fpb, formulaType, wb.getSheetIndex(getSheet()), getRowIndex());
} }
CTCellFormula f = CTCellFormula.Factory.newInstance(); CTCellFormula f;
f.setStringValue(formula); if (_cell.isSetF()) {
_cell.setF(f); 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()) { if(_cell.isSetV()) {
_cell.unsetV(); _cell.unsetV();
} }

View File

@ -48,6 +48,7 @@ import org.apache.poi.xssf.XSSFTestDataSamples;
import org.apache.poi.xssf.model.SharedStringsTable; import org.apache.poi.xssf.model.SharedStringsTable;
import org.junit.Test; import org.junit.Test;
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTCell; 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 org.openxmlformats.schemas.spreadsheetml.x2006.main.STCellType;
import static org.junit.Assert.*; import static org.junit.Assert.*;
@ -670,4 +671,34 @@ public final class TestXSSFCell extends BaseTestXCell {
destCell.setCellValue(true); 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
}
}
}

Binary file not shown.