From: Javen O'Neal Date: Sat, 4 Nov 2017 07:58:41 +0000 (+0000) Subject: bug 61474, github #81: implement updateConditionalFormatting for ColumnShifter X-Git-Tag: REL_4_0_0_FINAL~392 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=0f14370c21bc3d03d497d8152d843c5907f6a1cf;p=poi.git bug 61474, github #81: implement updateConditionalFormatting for ColumnShifter git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1814259 13f79535-47bb-0310-9956-ffa450edef68 --- diff --git a/src/ooxml/java/org/apache/poi/xssf/usermodel/helpers/XSSFColumnShifter.java b/src/ooxml/java/org/apache/poi/xssf/usermodel/helpers/XSSFColumnShifter.java index b6643541ae..b6c23b6c86 100644 --- a/src/ooxml/java/org/apache/poi/xssf/usermodel/helpers/XSSFColumnShifter.java +++ b/src/ooxml/java/org/apache/poi/xssf/usermodel/helpers/XSSFColumnShifter.java @@ -61,10 +61,9 @@ public final class XSSFColumnShifter extends ColumnShifter { throw new NotImplementedException("updateSheetFormulas"); } - @NotImplemented @Override public void updateConditionalFormatting(FormulaShifter formulaShifter) { - throw new NotImplementedException("updateConditionalformatting"); + XSSFRowColShifter.updateConditionalFormatting(sheet, formulaShifter); } /** diff --git a/src/ooxml/java/org/apache/poi/xssf/usermodel/helpers/XSSFRowColShifter.java b/src/ooxml/java/org/apache/poi/xssf/usermodel/helpers/XSSFRowColShifter.java index 399363185c..4b165ba623 100644 --- a/src/ooxml/java/org/apache/poi/xssf/usermodel/helpers/XSSFRowColShifter.java +++ b/src/ooxml/java/org/apache/poi/xssf/usermodel/helpers/XSSFRowColShifter.java @@ -26,7 +26,11 @@ import org.apache.poi.util.Internal; import org.apache.poi.util.POILogFactory; import org.apache.poi.util.POILogger; import org.apache.poi.xssf.usermodel.*; +import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTCfRule; +import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTConditionalFormatting; +import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTWorksheet; +import java.util.ArrayList; import java.util.List; /** @@ -57,6 +61,67 @@ import java.util.List; } } + /*package*/ static void updateConditionalFormatting(Sheet sheet, FormulaShifter formulaShifter) { + XSSFSheet xsheet = (XSSFSheet) sheet; + XSSFWorkbook wb = xsheet.getWorkbook(); + int sheetIndex = wb.getSheetIndex(sheet); + final int rowIndex = -1; //don't care, structured references not allowed in conditional formatting + + XSSFEvaluationWorkbook fpb = XSSFEvaluationWorkbook.create(wb); + CTWorksheet ctWorksheet = xsheet.getCTWorksheet(); + CTConditionalFormatting[] conditionalFormattingArray = ctWorksheet.getConditionalFormattingArray(); + // iterate backwards due to possible calls to ctWorksheet.removeConditionalFormatting(j) + for (int j = conditionalFormattingArray.length - 1; j >= 0; j--) { + CTConditionalFormatting cf = conditionalFormattingArray[j]; + + ArrayList cellRanges = new ArrayList<>(); + for (Object stRef : cf.getSqref()) { + String[] regions = stRef.toString().split(" "); + for (String region : regions) { + cellRanges.add(CellRangeAddress.valueOf(region)); + } + } + + boolean changed = false; + List temp = new ArrayList<>(); + for (CellRangeAddress craOld : cellRanges) { + CellRangeAddress craNew = shiftRange(formulaShifter, craOld, sheetIndex); + if (craNew == null) { + changed = true; + continue; + } + temp.add(craNew); + if (craNew != craOld) { + changed = true; + } + } + + if (changed) { + int nRanges = temp.size(); + if (nRanges == 0) { + ctWorksheet.removeConditionalFormatting(j); + continue; + } + List refs = new ArrayList<>(); + for(CellRangeAddress a : temp) refs.add(a.formatAsString()); + cf.setSqref(refs); + } + + for(CTCfRule cfRule : cf.getCfRuleArray()){ + String[] formulaArray = cfRule.getFormulaArray(); + for (int i = 0; i < formulaArray.length; i++) { + String formula = formulaArray[i]; + Ptg[] ptgs = FormulaParser.parse(formula, fpb, FormulaType.CELL, sheetIndex, rowIndex); + if (formulaShifter.adjustFormula(ptgs, sheetIndex)) { + String shiftedFmla = FormulaRenderer.toFormulaString(fpb, ptgs); + cfRule.setFormulaArray(i, shiftedFmla); + } + } + } + } + } + + /*package*/ static void updateHyperlinks(Sheet sheet, FormulaShifter formulaShifter) { int sheetIndex = sheet.getWorkbook().getSheetIndex(sheet); List hyperlinkList = sheet.getHyperlinkList(); diff --git a/src/ooxml/java/org/apache/poi/xssf/usermodel/helpers/XSSFRowShifter.java b/src/ooxml/java/org/apache/poi/xssf/usermodel/helpers/XSSFRowShifter.java index 402bd612e8..c32c98db0e 100644 --- a/src/ooxml/java/org/apache/poi/xssf/usermodel/helpers/XSSFRowShifter.java +++ b/src/ooxml/java/org/apache/poi/xssf/usermodel/helpers/XSSFRowShifter.java @@ -169,63 +169,7 @@ public final class XSSFRowShifter extends RowShifter { @Override public void updateConditionalFormatting(FormulaShifter formulaShifter) { - XSSFSheet xsheet = (XSSFSheet) sheet; - XSSFWorkbook wb = xsheet.getWorkbook(); - int sheetIndex = wb.getSheetIndex(sheet); - final int rowIndex = -1; //don't care, structured references not allowed in conditional formatting - - XSSFEvaluationWorkbook fpb = XSSFEvaluationWorkbook.create(wb); - CTWorksheet ctWorksheet = xsheet.getCTWorksheet(); - CTConditionalFormatting[] conditionalFormattingArray = ctWorksheet.getConditionalFormattingArray(); - // iterate backwards due to possible calls to ctWorksheet.removeConditionalFormatting(j) - for (int j = conditionalFormattingArray.length - 1; j >= 0; j--) { - CTConditionalFormatting cf = conditionalFormattingArray[j]; - - ArrayList cellRanges = new ArrayList<>(); - for (Object stRef : cf.getSqref()) { - String[] regions = stRef.toString().split(" "); - for (String region : regions) { - cellRanges.add(CellRangeAddress.valueOf(region)); - } - } - - boolean changed = false; - List temp = new ArrayList<>(); - for (CellRangeAddress craOld : cellRanges) { - CellRangeAddress craNew = shiftRange(formulaShifter, craOld, sheetIndex); - if (craNew == null) { - changed = true; - continue; - } - temp.add(craNew); - if (craNew != craOld) { - changed = true; - } - } - - if (changed) { - int nRanges = temp.size(); - if (nRanges == 0) { - ctWorksheet.removeConditionalFormatting(j); - continue; - } - List refs = new ArrayList<>(); - for(CellRangeAddress a : temp) refs.add(a.formatAsString()); - cf.setSqref(refs); - } - - for(CTCfRule cfRule : cf.getCfRuleArray()){ - String[] formulaArray = cfRule.getFormulaArray(); - for (int i = 0; i < formulaArray.length; i++) { - String formula = formulaArray[i]; - Ptg[] ptgs = FormulaParser.parse(formula, fpb, FormulaType.CELL, sheetIndex, rowIndex); - if (formulaShifter.adjustFormula(ptgs, sheetIndex)) { - String shiftedFmla = FormulaRenderer.toFormulaString(fpb, ptgs); - cfRule.setFormulaArray(i, shiftedFmla); - } - } - } - } + XSSFRowColShifter.updateConditionalFormatting(sheet, formulaShifter); } /**