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:
parent
12f82dd617
commit
64d98e7872
@ -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();
|
||||
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();
|
||||
}
|
||||
|
@ -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
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
}
|
BIN
test-data/spreadsheet/61869.xlsx
Normal file
BIN
test-data/spreadsheet/61869.xlsx
Normal file
Binary file not shown.
Loading…
Reference in New Issue
Block a user