mirror of https://github.com/apache/poi.git
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
808ec42570
commit
a96d86bfe8
|
@ -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();
|
||||||
}
|
}
|
||||||
|
|
|
@ -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.
Loading…
Reference in New Issue