mirror of https://github.com/apache/poi.git
Bug 54206: ValueRecordsAggregate.updateFormulasAfterRowShift doesn't update shared formulas
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1416917 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
d3170f4e94
commit
022b06d172
|
@ -34,6 +34,7 @@
|
|||
|
||||
<changes>
|
||||
<release version="4.0-beta1" date="2013-??-??">
|
||||
<action dev="poi-developers" type="fix">54206 - Ensure that shared formuals are updated when shifting rows in a spreadsheet</action>
|
||||
<action dev="poi-developers" type="fix">Synchronize table headers with parent sheet in XSSF</action>
|
||||
<action dev="poi-developers" type="fix">54210 - Fixed rendering text in flipped shapes in PPT2PNG and PPTX2PNG</action>
|
||||
</release>
|
||||
|
|
|
@ -292,10 +292,12 @@ public final class ValueRecordsAggregate implements Iterable<CellValueRecordInte
|
|||
for (int j = 0; j < rowCells.length; j++) {
|
||||
CellValueRecordInterface cell = rowCells[j];
|
||||
if (cell instanceof FormulaRecordAggregate) {
|
||||
FormulaRecord fr = ((FormulaRecordAggregate)cell).getFormulaRecord();
|
||||
Ptg[] ptgs = fr.getParsedExpression(); // needs clone() inside this getter?
|
||||
FormulaRecordAggregate fra = (FormulaRecordAggregate)cell;
|
||||
Ptg[] ptgs = fra.getFormulaTokens(); // needs clone() inside this getter?
|
||||
Ptg[] ptgs2 = ((FormulaRecordAggregate)cell).getFormulaRecord().getParsedExpression(); // needs clone() inside this getter?
|
||||
|
||||
if (shifter.adjustFormula(ptgs, currentExternSheetIndex)) {
|
||||
fr.setParsedExpression(ptgs);
|
||||
fra.setParsedExpression(ptgs);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -2617,7 +2617,8 @@ public class XSSFSheet extends POIXMLDocumentPart implements Sheet {
|
|||
* @param sid shared group index
|
||||
* @return a CTCellFormula bean holding shared formula or <code>null</code> if not found
|
||||
*/
|
||||
CTCellFormula getSharedFormula(int sid){
|
||||
@Internal
|
||||
public CTCellFormula getSharedFormula(int sid){
|
||||
return sharedFormulas.get(sid);
|
||||
}
|
||||
|
||||
|
|
|
@ -28,10 +28,7 @@ import org.apache.poi.ss.formula.FormulaShifter;
|
|||
import org.apache.poi.ss.formula.ptg.Ptg;
|
||||
import org.apache.poi.ss.formula.ptg.AreaPtg;
|
||||
import org.apache.poi.ss.formula.ptg.AreaErrPtg;
|
||||
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTCell;
|
||||
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTCellFormula;
|
||||
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTConditionalFormatting;
|
||||
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTCfRule;
|
||||
import org.openxmlformats.schemas.spreadsheetml.x2006.main.*;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.ArrayList;
|
||||
|
@ -156,9 +153,15 @@ public final class XSSFRowShifter {
|
|||
String shiftedFormula = shiftFormula(row, formula, shifter);
|
||||
if (shiftedFormula != null) {
|
||||
f.setStringValue(shiftedFormula);
|
||||
if(f.getT() == STCellFormulaType.SHARED){
|
||||
int si = (int)f.getSi();
|
||||
CTCellFormula sf = row.getSheet().getSharedFormula(si);
|
||||
sf.setStringValue(shiftedFormula);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
if (f.isSetRef()) { //Range of cells which the formula applies to.
|
||||
String ref = f.getRef();
|
||||
String shiftedRef = shiftFormula(row, ref, shifter);
|
||||
|
|
|
@ -21,6 +21,7 @@ import junit.framework.TestCase;
|
|||
|
||||
import org.apache.poi.ss.ITestDataProvider;
|
||||
import org.apache.poi.ss.util.CellRangeAddress;
|
||||
import org.apache.poi.ss.util.CellReference;
|
||||
|
||||
/**
|
||||
* Tests row shifting capabilities.
|
||||
|
@ -41,8 +42,6 @@ public abstract class BaseTestSheetShiftRows extends TestCase {
|
|||
* After each shift, writes the workbook to file and reads back to
|
||||
* check. This ensures that if some changes code that breaks
|
||||
* writing or what not, they realize it.
|
||||
*
|
||||
* @param sampleName the sample file to test against
|
||||
*/
|
||||
public final void testShiftRows(){
|
||||
// Read initial file in
|
||||
|
@ -324,4 +323,61 @@ public abstract class BaseTestSheetShiftRows extends TestCase {
|
|||
assertEquals(expectedValue, cell.getNumericCellValue(), 0.0);
|
||||
assertEquals(expectedFormula, cell.getCellFormula());
|
||||
}
|
||||
|
||||
public final void testShiftSharedFormulasBug54206() {
|
||||
Workbook wb = _testDataProvider.openSampleWorkbook("54206." + _testDataProvider.getStandardFileNameExtension());
|
||||
|
||||
Sheet sheet = wb.getSheetAt(0);
|
||||
assertEquals("SUMIF($B$19:$B$82,$B4,G$19:G$82)", sheet.getRow(3).getCell(6).getCellFormula());
|
||||
assertEquals("SUMIF($B$19:$B$82,$B4,H$19:H$82)", sheet.getRow(3).getCell(7).getCellFormula());
|
||||
assertEquals("SUMIF($B$19:$B$82,$B4,I$19:I$82)", sheet.getRow(3).getCell(8).getCellFormula());
|
||||
|
||||
assertEquals("SUMIF($B$19:$B$82,$B15,G$19:G$82)", sheet.getRow(14).getCell(6).getCellFormula());
|
||||
assertEquals("SUMIF($B$19:$B$82,$B15,H$19:H$82)", sheet.getRow(14).getCell(7).getCellFormula());
|
||||
assertEquals("SUMIF($B$19:$B$82,$B15,I$19:I$82)", sheet.getRow(14).getCell(8).getCellFormula());
|
||||
|
||||
// now the whole block G4L:15
|
||||
for(int i = 3; i <= 14; i++){
|
||||
for(int j = 6; j <= 8; j++){
|
||||
String col = CellReference.convertNumToColString(j);
|
||||
String expectedFormula = "SUMIF($B$19:$B$82,$B"+(i+1)+","+col+"$19:"+col+"$82)";
|
||||
assertEquals(expectedFormula, sheet.getRow(i).getCell(j).getCellFormula());
|
||||
}
|
||||
}
|
||||
|
||||
assertEquals("SUM(G24:I24)", sheet.getRow(23).getCell(9).getCellFormula());
|
||||
assertEquals("SUM(G25:I25)", sheet.getRow(24).getCell(9).getCellFormula());
|
||||
assertEquals("SUM(G26:I26)", sheet.getRow(25).getCell(9).getCellFormula());
|
||||
|
||||
sheet.shiftRows(24, sheet.getLastRowNum(), 4, true, false);
|
||||
|
||||
assertEquals("SUMIF($B$19:$B$86,$B4,G$19:G$86)", sheet.getRow(3).getCell(6).getCellFormula());
|
||||
assertEquals("SUMIF($B$19:$B$86,$B4,H$19:H$86)", sheet.getRow(3).getCell(7).getCellFormula());
|
||||
assertEquals("SUMIF($B$19:$B$86,$B4,I$19:I$86)", sheet.getRow(3).getCell(8).getCellFormula());
|
||||
|
||||
assertEquals("SUMIF($B$19:$B$86,$B15,G$19:G$86)", sheet.getRow(14).getCell(6).getCellFormula());
|
||||
assertEquals("SUMIF($B$19:$B$86,$B15,H$19:H$86)", sheet.getRow(14).getCell(7).getCellFormula());
|
||||
assertEquals("SUMIF($B$19:$B$86,$B15,I$19:I$86)", sheet.getRow(14).getCell(8).getCellFormula());
|
||||
|
||||
// now the whole block G4L:15
|
||||
for(int i = 3; i <= 14; i++){
|
||||
for(int j = 6; j <= 8; j++){
|
||||
String col = CellReference.convertNumToColString(j);
|
||||
String expectedFormula = "SUMIF($B$19:$B$86,$B"+(i+1)+","+col+"$19:"+col+"$86)";
|
||||
assertEquals(expectedFormula, sheet.getRow(i).getCell(j).getCellFormula());
|
||||
}
|
||||
}
|
||||
|
||||
assertEquals("SUM(G24:I24)", sheet.getRow(23).getCell(9).getCellFormula());
|
||||
|
||||
// shifted rows
|
||||
assertTrue( sheet.getRow(24) == null || sheet.getRow(24).getCell(9) == null);
|
||||
assertTrue( sheet.getRow(25) == null || sheet.getRow(25).getCell(9) == null);
|
||||
assertTrue( sheet.getRow(26) == null || sheet.getRow(26).getCell(9) == null);
|
||||
assertTrue( sheet.getRow(27) == null || sheet.getRow(27).getCell(9) == null);
|
||||
|
||||
assertEquals("SUM(G29:I29)", sheet.getRow(28).getCell(9).getCellFormula());
|
||||
assertEquals("SUM(G30:I30)", sheet.getRow(29).getCell(9).getCellFormula());
|
||||
|
||||
}
|
||||
}
|
Binary file not shown.
Binary file not shown.
Loading…
Reference in New Issue