You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@poi.apache.org by on...@apache.org on 2017/11/04 07:17:44 UTC
svn commit: r1814256 - in /poi/trunk/src:
java/org/apache/poi/hssf/record/aggregates/
java/org/apache/poi/hssf/usermodel/helpers/
java/org/apache/poi/ss/usermodel/helpers/
ooxml/java/org/apache/poi/xssf/usermodel/helpers/
Author: onealj
Date: Sat Nov 4 07:17:44 2017
New Revision: 1814256
URL: http://svn.apache.org/viewvc?rev=1814256&view=rev
Log:
bug 61474, github #81: add ColumnShifter interface; deduplicate some code in RowShifter, CFRecordsAggregate
Added:
poi/trunk/src/java/org/apache/poi/hssf/usermodel/helpers/HSSFColumnShifter.java
- copied, changed from r1814255, poi/trunk/src/java/org/apache/poi/hssf/usermodel/helpers/HSSFRowShifter.java
poi/trunk/src/java/org/apache/poi/ss/usermodel/helpers/BaseRowColShifter.java
- copied, changed from r1814255, poi/trunk/src/java/org/apache/poi/ss/usermodel/helpers/RowShifter.java
poi/trunk/src/java/org/apache/poi/ss/usermodel/helpers/ColumnShifter.java
- copied, changed from r1814255, poi/trunk/src/java/org/apache/poi/ss/usermodel/helpers/RowShifter.java
poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/helpers/XSSFColumnShifter.java
- copied, changed from r1814255, poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/helpers/XSSFRowShifter.java
poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/helpers/XSSFRowColShifter.java
- copied, changed from r1814255, poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/helpers/XSSFRowShifter.java
Modified:
poi/trunk/src/java/org/apache/poi/hssf/record/aggregates/CFRecordsAggregate.java
poi/trunk/src/java/org/apache/poi/hssf/usermodel/helpers/HSSFRowShifter.java
poi/trunk/src/java/org/apache/poi/ss/usermodel/helpers/RowShifter.java
poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/helpers/XSSFRowShifter.java
Modified: poi/trunk/src/java/org/apache/poi/hssf/record/aggregates/CFRecordsAggregate.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/record/aggregates/CFRecordsAggregate.java?rev=1814256&r1=1814255&r2=1814256&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/hssf/record/aggregates/CFRecordsAggregate.java (original)
+++ poi/trunk/src/java/org/apache/poi/hssf/record/aggregates/CFRecordsAggregate.java Sat Nov 4 07:17:44 2017
@@ -29,9 +29,8 @@ import org.apache.poi.hssf.record.CFRule
import org.apache.poi.hssf.record.CFRuleRecord;
import org.apache.poi.hssf.record.Record;
import org.apache.poi.ss.formula.FormulaShifter;
-import org.apache.poi.ss.formula.ptg.AreaErrPtg;
-import org.apache.poi.ss.formula.ptg.AreaPtg;
import org.apache.poi.ss.formula.ptg.Ptg;
+import org.apache.poi.ss.usermodel.helpers.BaseRowColShifter;
import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.util.POILogFactory;
import org.apache.poi.util.POILogger;
@@ -223,7 +222,7 @@ public final class CFRecordsAggregate ex
boolean changed = false;
List<CellRangeAddress> temp = new ArrayList<>();
for (CellRangeAddress craOld : cellRanges) {
- CellRangeAddress craNew = shiftRange(shifter, craOld, currentExternSheetIx);
+ CellRangeAddress craNew = BaseRowColShifter.shiftRange(shifter, craOld, currentExternSheetIx);
if (craNew == null) {
changed = true;
continue;
@@ -264,23 +263,4 @@ public final class CFRecordsAggregate ex
}
return true;
}
-
- private static CellRangeAddress shiftRange(FormulaShifter shifter, CellRangeAddress cra, int currentExternSheetIx) {
- // FormulaShifter works well in terms of Ptgs - so convert CellRangeAddress to AreaPtg (and back) here
- AreaPtg aptg = new AreaPtg(cra.getFirstRow(), cra.getLastRow(), cra.getFirstColumn(), cra.getLastColumn(), false, false, false, false);
- Ptg[] ptgs = { aptg, };
-
- if (!shifter.adjustFormula(ptgs, currentExternSheetIx)) {
- return cra;
- }
- Ptg ptg0 = ptgs[0];
- if (ptg0 instanceof AreaPtg) {
- AreaPtg bptg = (AreaPtg) ptg0;
- return new CellRangeAddress(bptg.getFirstRow(), bptg.getLastRow(), bptg.getFirstColumn(), bptg.getLastColumn());
- }
- if (ptg0 instanceof AreaErrPtg) {
- return null;
- }
- throw new IllegalStateException("Unexpected shifted ptg class (" + ptg0.getClass().getName() + ")");
- }
}
Copied: poi/trunk/src/java/org/apache/poi/hssf/usermodel/helpers/HSSFColumnShifter.java (from r1814255, poi/trunk/src/java/org/apache/poi/hssf/usermodel/helpers/HSSFRowShifter.java)
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/usermodel/helpers/HSSFColumnShifter.java?p2=poi/trunk/src/java/org/apache/poi/hssf/usermodel/helpers/HSSFColumnShifter.java&p1=poi/trunk/src/java/org/apache/poi/hssf/usermodel/helpers/HSSFRowShifter.java&r1=1814255&r2=1814256&rev=1814256&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/hssf/usermodel/helpers/HSSFRowShifter.java (original)
+++ poi/trunk/src/java/org/apache/poi/hssf/usermodel/helpers/HSSFColumnShifter.java Sat Nov 4 07:17:44 2017
@@ -20,29 +20,29 @@ package org.apache.poi.hssf.usermodel.he
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.ss.formula.FormulaShifter;
import org.apache.poi.ss.formula.eval.NotImplementedException;
-import org.apache.poi.ss.usermodel.Row;
-import org.apache.poi.ss.usermodel.helpers.RowShifter;
-import org.apache.poi.util.Internal;
+import org.apache.poi.ss.usermodel.helpers.ColumnShifter;
+import org.apache.poi.util.Beta;
import org.apache.poi.util.NotImplemented;
import org.apache.poi.util.POILogFactory;
import org.apache.poi.util.POILogger;
/**
- * Helper for shifting rows up or down
- *
- * When possible, code should be implemented in the RowShifter abstract class to avoid duplication with {@link org.apache.poi.xssf.usermodel.helpers.XSSFRowShifter}
+ * Helper for shifting columns up or down
*/
-public final class HSSFRowShifter extends RowShifter {
- private static final POILogger logger = POILogFactory.getLogger(HSSFRowShifter.class);
+// non-Javadoc: When possible, code should be implemented in the ColumnShifter abstract class to avoid duplication with
+// {@link org.apache.poi.xssf.usermodel.helpers.XSSFColumnShifter}
+@Beta
+public final class HSSFColumnShifter extends ColumnShifter {
+ private static final POILogger logger = POILogFactory.getLogger(HSSFColumnShifter.class);
- public HSSFRowShifter(HSSFSheet sh) {
+ public HSSFColumnShifter(HSSFSheet sh) {
super(sh);
}
@Override
@NotImplemented
public void updateNamedRanges(FormulaShifter formulaShifter) {
- throw new NotImplementedException("HSSFRowShifter.updateNamedRanges");
+ throw new NotImplementedException("HSSFColumnShifter.updateNamedRanges");
}
@Override
@@ -52,13 +52,6 @@ public final class HSSFRowShifter extend
}
@Override
- @Internal
- @NotImplemented
- public void updateRowFormulas(Row row, FormulaShifter formulaShifter) {
- throw new NotImplementedException("updateRowFormulas");
- }
-
- @Override
@NotImplemented
public void updateConditionalFormatting(FormulaShifter formulaShifter) {
throw new NotImplementedException("updateConditionalFormatting");
Modified: poi/trunk/src/java/org/apache/poi/hssf/usermodel/helpers/HSSFRowShifter.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/usermodel/helpers/HSSFRowShifter.java?rev=1814256&r1=1814255&r2=1814256&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/hssf/usermodel/helpers/HSSFRowShifter.java (original)
+++ poi/trunk/src/java/org/apache/poi/hssf/usermodel/helpers/HSSFRowShifter.java Sat Nov 4 07:17:44 2017
@@ -29,9 +29,9 @@ import org.apache.poi.util.POILogger;
/**
* Helper for shifting rows up or down
- *
- * When possible, code should be implemented in the RowShifter abstract class to avoid duplication with {@link org.apache.poi.xssf.usermodel.helpers.XSSFRowShifter}
*/
+// non-Javadoc: When possible, code should be implemented in the RowShifter abstract class to avoid duplication with
+// {@link org.apache.poi.xssf.usermodel.helpers.XSSFRowShifter}
public final class HSSFRowShifter extends RowShifter {
private static final POILogger logger = POILogFactory.getLogger(HSSFRowShifter.class);
Copied: poi/trunk/src/java/org/apache/poi/ss/usermodel/helpers/BaseRowColShifter.java (from r1814255, poi/trunk/src/java/org/apache/poi/ss/usermodel/helpers/RowShifter.java)
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/ss/usermodel/helpers/BaseRowColShifter.java?p2=poi/trunk/src/java/org/apache/poi/ss/usermodel/helpers/BaseRowColShifter.java&p1=poi/trunk/src/java/org/apache/poi/ss/usermodel/helpers/RowShifter.java&r1=1814255&r2=1814256&rev=1814256&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/ss/usermodel/helpers/RowShifter.java (original)
+++ poi/trunk/src/java/org/apache/poi/ss/usermodel/helpers/BaseRowColShifter.java Sat Nov 4 07:17:44 2017
@@ -17,128 +17,38 @@
package org.apache.poi.ss.usermodel.helpers;
-import java.util.ArrayList;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
import org.apache.poi.ss.formula.FormulaShifter;
-import org.apache.poi.ss.usermodel.Row;
-import org.apache.poi.ss.usermodel.Sheet;
+import org.apache.poi.ss.formula.ptg.AreaErrPtg;
+import org.apache.poi.ss.formula.ptg.AreaPtg;
+import org.apache.poi.ss.formula.ptg.Ptg;
import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.util.Internal;
/**
- * Helper for shifting rows up or down
- *
- * This abstract class exists to consolidate duplicated code between XSSFRowShifter and HSSFRowShifter (currently methods sprinkled throughout HSSFSheet)
+ * Class for code common to {@link RowShifter} and {@link ColumnShifter}
+ * Helper for shifting rows up or down and columns left and right
*/
-public abstract class RowShifter {
- protected final Sheet sheet;
+@Internal
+public abstract class BaseRowColShifter {
- public RowShifter(Sheet sh) {
- sheet = sh;
- }
+ public static CellRangeAddress shiftRange(FormulaShifter formulaShifter, CellRangeAddress cra, int currentExternSheetIx) {
+ // FormulaShifter works well in terms of Ptgs - so convert CellRangeAddress to AreaPtg (and back) here
+ AreaPtg aptg = new AreaPtg(cra.getFirstRow(), cra.getLastRow(), cra.getFirstColumn(), cra.getLastColumn(), false, false, false, false);
+ Ptg[] ptgs = { aptg, };
- /**
- * Shifts, grows, or shrinks the merged regions due to a row shift.
- * Merged regions that are completely overlaid by shifting will be deleted.
- *
- * @param startRow the row to start shifting
- * @param endRow the row to end shifting
- * @param n the number of rows to shift
- * @return an array of affected merged regions, doesn't contain deleted ones
- */
- public List<CellRangeAddress> shiftMergedRegions(int startRow, int endRow, int n) {
- List<CellRangeAddress> shiftedRegions = new ArrayList<>();
- Set<Integer> removedIndices = new HashSet<>();
- //move merged regions completely if they fall within the new region boundaries when they are shifted
- int size = sheet.getNumMergedRegions();
- for (int i = 0; i < size; i++) {
- CellRangeAddress merged = sheet.getMergedRegion(i);
-
- // remove merged region that are replaced by the shifting,
- // i.e. where the area includes something in the overwritten area
- if(removalNeeded(merged, startRow, endRow, n)) {
- removedIndices.add(i);
- continue;
- }
-
- boolean inStart = (merged.getFirstRow() >= startRow || merged.getLastRow() >= startRow);
- boolean inEnd = (merged.getFirstRow() <= endRow || merged.getLastRow() <= endRow);
-
- //don't check if it's not within the shifted area
- if (!inStart || !inEnd) {
- continue;
- }
-
- //only shift if the region outside the shifted rows is not merged too
- if (!merged.containsRow(startRow - 1) && !merged.containsRow(endRow + 1)) {
- merged.setFirstRow(merged.getFirstRow() + n);
- merged.setLastRow(merged.getLastRow() + n);
- //have to remove/add it back
- shiftedRegions.add(merged);
- removedIndices.add(i);
- }
- }
-
- if(!removedIndices.isEmpty()) {
- sheet.removeMergedRegions(removedIndices);
+ if (!formulaShifter.adjustFormula(ptgs, currentExternSheetIx)) {
+ return cra;
}
-
- //read so it doesn't get shifted again
- for (CellRangeAddress region : shiftedRegions) {
- sheet.addMergedRegion(region);
+ Ptg ptg0 = ptgs[0];
+ if (ptg0 instanceof AreaPtg) {
+ AreaPtg bptg = (AreaPtg) ptg0;
+ return new CellRangeAddress(bptg.getFirstRow(), bptg.getLastRow(), bptg.getFirstColumn(), bptg.getLastColumn());
}
- return shiftedRegions;
- }
-
- private boolean removalNeeded(CellRangeAddress merged, int startRow, int endRow, int n) {
- final int movedRows = endRow - startRow + 1;
-
- // build a range of the rows that are overwritten, i.e. the target-area, but without
- // rows that are moved along
- final CellRangeAddress overwrite;
- if(n > 0) {
- // area is moved down => overwritten area is [endRow + n - movedRows, endRow + n]
- overwrite = new CellRangeAddress(Math.max(endRow + 1, endRow + n - movedRows), endRow + n, 0, 0);
- } else {
- // area is moved up => overwritten area is [startRow + n, startRow + n + movedRows]
- overwrite = new CellRangeAddress(startRow + n, Math.min(startRow - 1, startRow + n + movedRows), 0, 0);
+ if (ptg0 instanceof AreaErrPtg) {
+ return null;
}
-
- // if the merged-region and the overwritten area intersect, we need to remove it
- return merged.intersects(overwrite);
+ throw new IllegalStateException("Unexpected shifted ptg class (" + ptg0.getClass().getName() + ")");
}
- /**
- * Updated named ranges
- */
- public abstract void updateNamedRanges(FormulaShifter formulaShifter);
-
- /**
- * Update formulas.
- */
- public abstract void updateFormulas(FormulaShifter formulaShifter);
-
- /**
- * Update the formulas in specified row using the formula shifting policy specified by shifter
- *
- * @param row the row to update the formulas on
- * @param formulaShifter the formula shifting policy
- */
- @Internal
- public abstract void updateRowFormulas(Row row, FormulaShifter formulaShifter);
-
- public abstract void updateConditionalFormatting(FormulaShifter formulaShifter);
-
- /**
- * Shift the Hyperlink anchors (not the hyperlink text, even if the hyperlink
- * is of type LINK_DOCUMENT and refers to a cell that was shifted). Hyperlinks
- * do not track the content they point to.
- *
- * @param formulaShifter the formula shifting policy
- */
- public abstract void updateHyperlinks(FormulaShifter formulaShifter);
-
}
Copied: poi/trunk/src/java/org/apache/poi/ss/usermodel/helpers/ColumnShifter.java (from r1814255, poi/trunk/src/java/org/apache/poi/ss/usermodel/helpers/RowShifter.java)
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/ss/usermodel/helpers/ColumnShifter.java?p2=poi/trunk/src/java/org/apache/poi/ss/usermodel/helpers/ColumnShifter.java&p1=poi/trunk/src/java/org/apache/poi/ss/usermodel/helpers/RowShifter.java&r1=1814255&r2=1814256&rev=1814256&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/ss/usermodel/helpers/RowShifter.java (original)
+++ poi/trunk/src/java/org/apache/poi/ss/usermodel/helpers/ColumnShifter.java Sat Nov 4 07:17:44 2017
@@ -23,33 +23,33 @@ import java.util.List;
import java.util.Set;
import org.apache.poi.ss.formula.FormulaShifter;
-import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.util.CellRangeAddress;
-import org.apache.poi.util.Internal;
+import org.apache.poi.util.Beta;
/**
- * Helper for shifting rows up or down
- *
- * This abstract class exists to consolidate duplicated code between XSSFRowShifter and HSSFRowShifter (currently methods sprinkled throughout HSSFSheet)
+ * Helper for shifting columns up or down
*/
-public abstract class RowShifter {
+// non-Javadoc: This abstract class exists to consolidate duplicated code between XSSFColumnShifter and HSSFColumnShifter
+// (currently methods sprinkled throughout HSSFSheet)
+@Beta
+public abstract class ColumnShifter extends BaseRowColShifter {
protected final Sheet sheet;
- public RowShifter(Sheet sh) {
+ public ColumnShifter(Sheet sh) {
sheet = sh;
}
/**
- * Shifts, grows, or shrinks the merged regions due to a row shift.
+ * Shifts, grows, or shrinks the merged regions due to a column shift.
* Merged regions that are completely overlaid by shifting will be deleted.
*
- * @param startRow the row to start shifting
- * @param endRow the row to end shifting
- * @param n the number of rows to shift
+ * @param startColumn the column to start shifting
+ * @param endColumn the column to end shifting
+ * @param n the number of columns to shift
* @return an array of affected merged regions, doesn't contain deleted ones
*/
- public List<CellRangeAddress> shiftMergedRegions(int startRow, int endRow, int n) {
+ public List<CellRangeAddress> shiftMergedRegions(int startColumn, int endColumn, int n) {
List<CellRangeAddress> shiftedRegions = new ArrayList<>();
Set<Integer> removedIndices = new HashSet<>();
//move merged regions completely if they fall within the new region boundaries when they are shifted
@@ -59,23 +59,23 @@ public abstract class RowShifter {
// remove merged region that are replaced by the shifting,
// i.e. where the area includes something in the overwritten area
- if(removalNeeded(merged, startRow, endRow, n)) {
+ if(removalNeeded(merged, startColumn, endColumn, n)) {
removedIndices.add(i);
continue;
}
- boolean inStart = (merged.getFirstRow() >= startRow || merged.getLastRow() >= startRow);
- boolean inEnd = (merged.getFirstRow() <= endRow || merged.getLastRow() <= endRow);
+ boolean inStart = (merged.getFirstColumn() >= startColumn || merged.getLastColumn() >= startColumn);
+ boolean inEnd = (merged.getFirstColumn() <= endColumn || merged.getLastColumn() <= endColumn);
//don't check if it's not within the shifted area
if (!inStart || !inEnd) {
continue;
}
- //only shift if the region outside the shifted rows is not merged too
- if (!merged.containsRow(startRow - 1) && !merged.containsRow(endRow + 1)) {
- merged.setFirstRow(merged.getFirstRow() + n);
- merged.setLastRow(merged.getLastRow() + n);
+ //only shift if the region outside the shifted columns is not merged too
+ if (!merged.containsColumn(startColumn - 1) && !merged.containsColumn(endColumn + 1)) {
+ merged.setFirstColumn(merged.getFirstColumn() + n);
+ merged.setLastColumn(merged.getLastColumn() + n);
//have to remove/add it back
shiftedRegions.add(merged);
removedIndices.add(i);
@@ -93,18 +93,18 @@ public abstract class RowShifter {
return shiftedRegions;
}
- private boolean removalNeeded(CellRangeAddress merged, int startRow, int endRow, int n) {
- final int movedRows = endRow - startRow + 1;
+ private boolean removalNeeded(CellRangeAddress merged, int startColumn, int endColumn, int n) {
+ final int movedColumns = endColumn - startColumn + 1;
- // build a range of the rows that are overwritten, i.e. the target-area, but without
- // rows that are moved along
+ // build a range of the columns that are overwritten, i.e. the target-area, but without
+ // columns that are moved along
final CellRangeAddress overwrite;
if(n > 0) {
- // area is moved down => overwritten area is [endRow + n - movedRows, endRow + n]
- overwrite = new CellRangeAddress(Math.max(endRow + 1, endRow + n - movedRows), endRow + n, 0, 0);
+ // area is moved down => overwritten area is [endColumn + n - movedColumns, endColumn + n]
+ overwrite = new CellRangeAddress(Math.max(endColumn + 1, endColumn + n - movedColumns), endColumn + n, 0, 0);
} else {
- // area is moved up => overwritten area is [startRow + n, startRow + n + movedRows]
- overwrite = new CellRangeAddress(startRow + n, Math.min(startRow - 1, startRow + n + movedRows), 0, 0);
+ // area is moved up => overwritten area is [startColumn + n, startColumn + n + movedColumns]
+ overwrite = new CellRangeAddress(startColumn + n, Math.min(startColumn - 1, startColumn + n + movedColumns), 0, 0);
}
// if the merged-region and the overwritten area intersect, we need to remove it
@@ -121,14 +121,6 @@ public abstract class RowShifter {
*/
public abstract void updateFormulas(FormulaShifter formulaShifter);
- /**
- * Update the formulas in specified row using the formula shifting policy specified by shifter
- *
- * @param row the row to update the formulas on
- * @param formulaShifter the formula shifting policy
- */
- @Internal
- public abstract void updateRowFormulas(Row row, FormulaShifter formulaShifter);
public abstract void updateConditionalFormatting(FormulaShifter formulaShifter);
Modified: poi/trunk/src/java/org/apache/poi/ss/usermodel/helpers/RowShifter.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/ss/usermodel/helpers/RowShifter.java?rev=1814256&r1=1814255&r2=1814256&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/ss/usermodel/helpers/RowShifter.java (original)
+++ poi/trunk/src/java/org/apache/poi/ss/usermodel/helpers/RowShifter.java Sat Nov 4 07:17:44 2017
@@ -30,10 +30,12 @@ import org.apache.poi.util.Internal;
/**
* Helper for shifting rows up or down
- *
- * This abstract class exists to consolidate duplicated code between XSSFRowShifter and HSSFRowShifter (currently methods sprinkled throughout HSSFSheet)
*/
-public abstract class RowShifter {
+// non-Javadoc: This abstract class exists to consolidate duplicated code between
+// {@link org.apache.poi.hssf.usermodel.helpers.HSSFRowShifter} and
+// {@link org.apache.poi.xssf.usermodel.helpers.XSSFRowShifter}
+// (currently methods sprinkled throughout HSSFSheet)
+public abstract class RowShifter extends BaseRowColShifter {
protected final Sheet sheet;
public RowShifter(Sheet sh) {
Copied: poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/helpers/XSSFColumnShifter.java (from r1814255, poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/helpers/XSSFRowShifter.java)
URL: http://svn.apache.org/viewvc/poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/helpers/XSSFColumnShifter.java?p2=poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/helpers/XSSFColumnShifter.java&p1=poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/helpers/XSSFRowShifter.java&r1=1814255&r2=1814256&rev=1814256&view=diff
==============================================================================
--- poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/helpers/XSSFRowShifter.java (original)
+++ poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/helpers/XSSFColumnShifter.java Sat Nov 4 07:17:44 2017
@@ -17,231 +17,55 @@
package org.apache.poi.xssf.usermodel.helpers;
-import java.util.ArrayList;
-import java.util.List;
-
-import org.apache.poi.ss.formula.FormulaParseException;
-import org.apache.poi.ss.formula.FormulaParser;
-import org.apache.poi.ss.formula.FormulaRenderer;
-import org.apache.poi.ss.formula.FormulaShifter;
-import org.apache.poi.ss.formula.FormulaType;
-import org.apache.poi.ss.formula.ptg.AreaErrPtg;
-import org.apache.poi.ss.formula.ptg.AreaPtg;
-import org.apache.poi.ss.formula.ptg.Ptg;
-import org.apache.poi.ss.usermodel.Cell;
-import org.apache.poi.ss.usermodel.Hyperlink;
-import org.apache.poi.ss.usermodel.Name;
-import org.apache.poi.ss.usermodel.Row;
-import org.apache.poi.ss.usermodel.Sheet;
-import org.apache.poi.ss.usermodel.Workbook;
-import org.apache.poi.ss.usermodel.helpers.RowShifter;
-import org.apache.poi.ss.util.CellRangeAddress;
-import org.apache.poi.util.Internal;
+import org.apache.poi.ss.formula.*;
+import org.apache.poi.ss.formula.eval.NotImplementedException;
+import org.apache.poi.ss.usermodel.*;
+import org.apache.poi.ss.usermodel.helpers.ColumnShifter;
+import org.apache.poi.util.Beta;
+import org.apache.poi.util.NotImplemented;
import org.apache.poi.util.POILogFactory;
import org.apache.poi.util.POILogger;
-import org.apache.poi.xssf.usermodel.XSSFCell;
-import org.apache.poi.xssf.usermodel.XSSFEvaluationWorkbook;
-import org.apache.poi.xssf.usermodel.XSSFHyperlink;
-import org.apache.poi.xssf.usermodel.XSSFRow;
-import org.apache.poi.xssf.usermodel.XSSFSheet;
-import org.apache.poi.xssf.usermodel.XSSFWorkbook;
-import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTCell;
-import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTCellFormula;
-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 org.openxmlformats.schemas.spreadsheetml.x2006.main.STCellFormulaType;
+import org.apache.poi.xssf.usermodel.*;
/**
- * Helper for shifting rows up or down
- *
- * When possible, code should be implemented in the RowShifter abstract class to avoid duplication with {@link org.apache.poi.hssf.usermodel.helpers.HSSFRowShifter}
+ * Helper for shifting columns up or down
*/
-public final class XSSFRowShifter extends RowShifter {
- private static final POILogger logger = POILogFactory.getLogger(XSSFRowShifter.class);
+// non-Javadoc: When possible, code should be implemented in the ColumnShifter abstract class to avoid duplication with
+// {@link org.apache.poi.hssf.usermodel.helpers.HSSFColumnShifter}
+@Beta
+public final class XSSFColumnShifter extends ColumnShifter {
+ private static final POILogger logger = POILogFactory.getLogger(XSSFColumnShifter.class);
- public XSSFRowShifter(XSSFSheet sh) {
+ public XSSFColumnShifter(XSSFSheet sh) {
super(sh);
}
/**
* Updated named ranges
*/
+ @NotImplemented
@Override
public void updateNamedRanges(FormulaShifter formulaShifter) {
- Workbook wb = sheet.getWorkbook();
- XSSFEvaluationWorkbook fpb = XSSFEvaluationWorkbook.create((XSSFWorkbook) wb);
- for (Name name : wb.getAllNames()) {
- String formula = name.getRefersToFormula();
- int sheetIndex = name.getSheetIndex();
- final int rowIndex = -1; //don't care, named ranges are not allowed to include structured references
-
- Ptg[] ptgs = FormulaParser.parse(formula, fpb, FormulaType.NAMEDRANGE, sheetIndex, rowIndex);
- if (formulaShifter.adjustFormula(ptgs, sheetIndex)) {
- String shiftedFmla = FormulaRenderer.toFormulaString(fpb, ptgs);
- name.setRefersToFormula(shiftedFmla);
- }
- }
+ throw new NotImplementedException("updateNamedRanges");
}
/**
* Update formulas.
*/
+ @NotImplemented
@Override
public void updateFormulas(FormulaShifter formulaShifter) {
- //update formulas on the parent sheet
- updateSheetFormulas(sheet, formulaShifter);
-
- //update formulas on other sheets
- Workbook wb = sheet.getWorkbook();
- for (Sheet sh : wb) {
- if (sheet == sh) continue;
- updateSheetFormulas(sh, formulaShifter);
- }
- }
-
- private void updateSheetFormulas(Sheet sh, FormulaShifter formulashifter) {
- for (Row r : sh) {
- XSSFRow row = (XSSFRow) r;
- updateRowFormulas(row, formulashifter);
- }
- }
-
- /**
- * Update the formulas in specified row using the formula shifting policy specified by shifter
- *
- * @param row the row to update the formulas on
- * @param formulaShifter the formula shifting policy
- */
- @Internal
- @Override
- public void updateRowFormulas(Row row, FormulaShifter formulaShifter) {
- XSSFSheet sheet = (XSSFSheet) row.getSheet();
- for (Cell c : row) {
- XSSFCell cell = (XSSFCell) c;
-
- CTCell ctCell = cell.getCTCell();
- if (ctCell.isSetF()) {
- CTCellFormula f = ctCell.getF();
- String formula = f.getStringValue();
- if (formula.length() > 0) {
- String shiftedFormula = shiftFormula(row, formula, formulaShifter);
- if (shiftedFormula != null) {
- f.setStringValue(shiftedFormula);
- if(f.getT() == STCellFormulaType.SHARED){
- int si = (int)f.getSi();
- CTCellFormula sf = sheet.getSharedFormula(si);
- sf.setStringValue(shiftedFormula);
- updateRefInCTCellFormula(row, formulaShifter, sf);
- }
- }
-
- }
-
- //Range of cells which the formula applies to.
- updateRefInCTCellFormula(row, formulaShifter, f);
- }
-
- }
+ throw new NotImplementedException("updateFormulas");
}
- private void updateRefInCTCellFormula(Row row, FormulaShifter formulaShifter, CTCellFormula f) {
- if (f.isSetRef()) { //Range of cells which the formula applies to.
- String ref = f.getRef();
- String shiftedRef = shiftFormula(row, ref, formulaShifter);
- if (shiftedRef != null) f.setRef(shiftedRef);
- }
- }
-
- /**
- * Shift a formula using the supplied FormulaShifter
- *
- * @param row the row of the cell this formula belongs to. Used to get a reference to the parent workbook.
- * @param formula the formula to shift
- * @param formulaShifter the FormulaShifter object that operates on the parsed formula tokens
- * @return the shifted formula if the formula was changed,
- * <code>null</code> if the formula wasn't modified
- */
- private static String shiftFormula(Row row, String formula, FormulaShifter formulaShifter) {
- Sheet sheet = row.getSheet();
- Workbook wb = sheet.getWorkbook();
- int sheetIndex = wb.getSheetIndex(sheet);
- final int rowIndex = row.getRowNum();
- XSSFEvaluationWorkbook fpb = XSSFEvaluationWorkbook.create((XSSFWorkbook) wb);
-
- try {
- Ptg[] ptgs = FormulaParser.parse(formula, fpb, FormulaType.CELL, sheetIndex, rowIndex);
- String shiftedFmla = null;
- if (formulaShifter.adjustFormula(ptgs, sheetIndex)) {
- shiftedFmla = FormulaRenderer.toFormulaString(fpb, ptgs);
- }
- return shiftedFmla;
- } catch (FormulaParseException fpe) {
- // Log, but don't change, rather than breaking
- logger.log(POILogger.WARN, "Error shifting formula on row ", row.getRowNum(), fpe);
- return formula;
- }
+ private void updateSheetFormulas(Sheet sh, FormulaShifter formulaShifter) {
+ throw new NotImplementedException("updateSheetFormulas");
}
+ @NotImplemented
@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<CellRangeAddress> 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<CellRangeAddress> 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<String> 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);
- }
- }
- }
- }
+ throw new NotImplementedException("updateConditionalformatting");
}
/**
@@ -253,40 +77,7 @@ public final class XSSFRowShifter extend
*/
@Override
public void updateHyperlinks(FormulaShifter formulaShifter) {
- int sheetIndex = sheet.getWorkbook().getSheetIndex(sheet);
- List<? extends Hyperlink> hyperlinkList = sheet.getHyperlinkList();
-
- for (Hyperlink hyperlink : hyperlinkList) {
- XSSFHyperlink xhyperlink = (XSSFHyperlink) hyperlink;
- String cellRef = xhyperlink.getCellRef();
- CellRangeAddress cra = CellRangeAddress.valueOf(cellRef);
- CellRangeAddress shiftedRange = shiftRange(formulaShifter, cra, sheetIndex);
- if (shiftedRange != null && shiftedRange != cra) {
- // shiftedRange should not be null. If shiftedRange is null, that means
- // that a hyperlink wasn't deleted at the beginning of shiftRows when
- // identifying rows that should be removed because they will be overwritten
- xhyperlink.setCellReference(shiftedRange.formatAsString());
- }
- }
- }
-
- private static CellRangeAddress shiftRange(FormulaShifter formulaShifter, CellRangeAddress cra, int currentExternSheetIx) {
- // FormulaShifter works well in terms of Ptgs - so convert CellRangeAddress to AreaPtg (and back) here
- AreaPtg aptg = new AreaPtg(cra.getFirstRow(), cra.getLastRow(), cra.getFirstColumn(), cra.getLastColumn(), false, false, false, false);
- Ptg[] ptgs = { aptg, };
-
- if (!formulaShifter.adjustFormula(ptgs, currentExternSheetIx)) {
- return cra;
- }
- Ptg ptg0 = ptgs[0];
- if (ptg0 instanceof AreaPtg) {
- AreaPtg bptg = (AreaPtg) ptg0;
- return new CellRangeAddress(bptg.getFirstRow(), bptg.getLastRow(), bptg.getFirstColumn(), bptg.getLastColumn());
- }
- if (ptg0 instanceof AreaErrPtg) {
- return null;
- }
- throw new IllegalStateException("Unexpected shifted ptg class (" + ptg0.getClass().getName() + ")");
+ XSSFRowColShifter.updateHyperlinks(sheet, formulaShifter);
}
}
Copied: poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/helpers/XSSFRowColShifter.java (from r1814255, poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/helpers/XSSFRowShifter.java)
URL: http://svn.apache.org/viewvc/poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/helpers/XSSFRowColShifter.java?p2=poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/helpers/XSSFRowColShifter.java&p1=poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/helpers/XSSFRowShifter.java&r1=1814255&r2=1814256&rev=1814256&view=diff
==============================================================================
--- poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/helpers/XSSFRowShifter.java (original)
+++ poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/helpers/XSSFRowColShifter.java Sat Nov 4 07:17:44 2017
@@ -17,245 +17,30 @@
package org.apache.poi.xssf.usermodel.helpers;
-import java.util.ArrayList;
-import java.util.List;
-
-import org.apache.poi.ss.formula.FormulaParseException;
-import org.apache.poi.ss.formula.FormulaParser;
-import org.apache.poi.ss.formula.FormulaRenderer;
-import org.apache.poi.ss.formula.FormulaShifter;
-import org.apache.poi.ss.formula.FormulaType;
-import org.apache.poi.ss.formula.ptg.AreaErrPtg;
-import org.apache.poi.ss.formula.ptg.AreaPtg;
-import org.apache.poi.ss.formula.ptg.Ptg;
-import org.apache.poi.ss.usermodel.Cell;
-import org.apache.poi.ss.usermodel.Hyperlink;
-import org.apache.poi.ss.usermodel.Name;
-import org.apache.poi.ss.usermodel.Row;
-import org.apache.poi.ss.usermodel.Sheet;
-import org.apache.poi.ss.usermodel.Workbook;
-import org.apache.poi.ss.usermodel.helpers.RowShifter;
+import org.apache.poi.ss.formula.*;
+import org.apache.poi.ss.usermodel.*;
+import org.apache.poi.ss.usermodel.helpers.BaseRowColShifter;
import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.util.Internal;
import org.apache.poi.util.POILogFactory;
import org.apache.poi.util.POILogger;
-import org.apache.poi.xssf.usermodel.XSSFCell;
-import org.apache.poi.xssf.usermodel.XSSFEvaluationWorkbook;
-import org.apache.poi.xssf.usermodel.XSSFHyperlink;
-import org.apache.poi.xssf.usermodel.XSSFRow;
-import org.apache.poi.xssf.usermodel.XSSFSheet;
-import org.apache.poi.xssf.usermodel.XSSFWorkbook;
-import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTCell;
-import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTCellFormula;
-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 org.openxmlformats.schemas.spreadsheetml.x2006.main.STCellFormulaType;
+import org.apache.poi.xssf.usermodel.*;
+
+import java.util.List;
/**
- * Helper for shifting rows up or down
- *
- * When possible, code should be implemented in the RowShifter abstract class to avoid duplication with {@link org.apache.poi.hssf.usermodel.helpers.HSSFRowShifter}
+ * Class for code common to {@link XSSFRowShifter} and {@link XSSFColumnShifter}
*/
-public final class XSSFRowShifter extends RowShifter {
- private static final POILogger logger = POILogFactory.getLogger(XSSFRowShifter.class);
-
- public XSSFRowShifter(XSSFSheet sh) {
- super(sh);
- }
-
- /**
- * Updated named ranges
- */
- @Override
- public void updateNamedRanges(FormulaShifter formulaShifter) {
- Workbook wb = sheet.getWorkbook();
- XSSFEvaluationWorkbook fpb = XSSFEvaluationWorkbook.create((XSSFWorkbook) wb);
- for (Name name : wb.getAllNames()) {
- String formula = name.getRefersToFormula();
- int sheetIndex = name.getSheetIndex();
- final int rowIndex = -1; //don't care, named ranges are not allowed to include structured references
+@Internal
+/*private*/ final class XSSFRowColShifter extends BaseRowColShifter {
+ private static final POILogger logger = POILogFactory.getLogger(XSSFRowColShifter.class);
- Ptg[] ptgs = FormulaParser.parse(formula, fpb, FormulaType.NAMEDRANGE, sheetIndex, rowIndex);
- if (formulaShifter.adjustFormula(ptgs, sheetIndex)) {
- String shiftedFmla = FormulaRenderer.toFormulaString(fpb, ptgs);
- name.setRefersToFormula(shiftedFmla);
- }
- }
- }
-
- /**
- * Update formulas.
- */
- @Override
- public void updateFormulas(FormulaShifter formulaShifter) {
- //update formulas on the parent sheet
- updateSheetFormulas(sheet, formulaShifter);
-
- //update formulas on other sheets
- Workbook wb = sheet.getWorkbook();
- for (Sheet sh : wb) {
- if (sheet == sh) continue;
- updateSheetFormulas(sh, formulaShifter);
- }
- }
-
- private void updateSheetFormulas(Sheet sh, FormulaShifter formulashifter) {
- for (Row r : sh) {
- XSSFRow row = (XSSFRow) r;
- updateRowFormulas(row, formulashifter);
- }
- }
-
- /**
- * Update the formulas in specified row using the formula shifting policy specified by shifter
- *
- * @param row the row to update the formulas on
- * @param formulaShifter the formula shifting policy
- */
- @Internal
- @Override
- public void updateRowFormulas(Row row, FormulaShifter formulaShifter) {
- XSSFSheet sheet = (XSSFSheet) row.getSheet();
- for (Cell c : row) {
- XSSFCell cell = (XSSFCell) c;
-
- CTCell ctCell = cell.getCTCell();
- if (ctCell.isSetF()) {
- CTCellFormula f = ctCell.getF();
- String formula = f.getStringValue();
- if (formula.length() > 0) {
- String shiftedFormula = shiftFormula(row, formula, formulaShifter);
- if (shiftedFormula != null) {
- f.setStringValue(shiftedFormula);
- if(f.getT() == STCellFormulaType.SHARED){
- int si = (int)f.getSi();
- CTCellFormula sf = sheet.getSharedFormula(si);
- sf.setStringValue(shiftedFormula);
- updateRefInCTCellFormula(row, formulaShifter, sf);
- }
- }
-
- }
-
- //Range of cells which the formula applies to.
- updateRefInCTCellFormula(row, formulaShifter, f);
- }
-
- }
- }
+ private XSSFRowColShifter() { /*no instances for static classes*/}
- private void updateRefInCTCellFormula(Row row, FormulaShifter formulaShifter, CTCellFormula f) {
- if (f.isSetRef()) { //Range of cells which the formula applies to.
- String ref = f.getRef();
- String shiftedRef = shiftFormula(row, ref, formulaShifter);
- if (shiftedRef != null) f.setRef(shiftedRef);
- }
- }
-
- /**
- * Shift a formula using the supplied FormulaShifter
- *
- * @param row the row of the cell this formula belongs to. Used to get a reference to the parent workbook.
- * @param formula the formula to shift
- * @param formulaShifter the FormulaShifter object that operates on the parsed formula tokens
- * @return the shifted formula if the formula was changed,
- * <code>null</code> if the formula wasn't modified
- */
- private static String shiftFormula(Row row, String formula, FormulaShifter formulaShifter) {
- Sheet sheet = row.getSheet();
- Workbook wb = sheet.getWorkbook();
- int sheetIndex = wb.getSheetIndex(sheet);
- final int rowIndex = row.getRowNum();
- XSSFEvaluationWorkbook fpb = XSSFEvaluationWorkbook.create((XSSFWorkbook) wb);
-
- try {
- Ptg[] ptgs = FormulaParser.parse(formula, fpb, FormulaType.CELL, sheetIndex, rowIndex);
- String shiftedFmla = null;
- if (formulaShifter.adjustFormula(ptgs, sheetIndex)) {
- shiftedFmla = FormulaRenderer.toFormulaString(fpb, ptgs);
- }
- return shiftedFmla;
- } catch (FormulaParseException fpe) {
- // Log, but don't change, rather than breaking
- logger.log(POILogger.WARN, "Error shifting formula on row ", row.getRowNum(), fpe);
- return formula;
- }
- }
-
- @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<CellRangeAddress> 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<CellRangeAddress> 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<String> 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);
- }
- }
- }
- }
- }
-
- /**
- * Shift the Hyperlink anchors (not the hyperlink text, even if the hyperlink
- * is of type LINK_DOCUMENT and refers to a cell that was shifted). Hyperlinks
- * do not track the content they point to.
- *
- * @param formulaShifter
- */
- @Override
- public void updateHyperlinks(FormulaShifter formulaShifter) {
+ /*package*/ static void updateHyperlinks(Sheet sheet, FormulaShifter formulaShifter) {
int sheetIndex = sheet.getWorkbook().getSheetIndex(sheet);
List<? extends Hyperlink> hyperlinkList = sheet.getHyperlinkList();
-
+
for (Hyperlink hyperlink : hyperlinkList) {
XSSFHyperlink xhyperlink = (XSSFHyperlink) hyperlink;
String cellRef = xhyperlink.getCellRef();
@@ -270,23 +55,5 @@ public final class XSSFRowShifter extend
}
}
- private static CellRangeAddress shiftRange(FormulaShifter formulaShifter, CellRangeAddress cra, int currentExternSheetIx) {
- // FormulaShifter works well in terms of Ptgs - so convert CellRangeAddress to AreaPtg (and back) here
- AreaPtg aptg = new AreaPtg(cra.getFirstRow(), cra.getLastRow(), cra.getFirstColumn(), cra.getLastColumn(), false, false, false, false);
- Ptg[] ptgs = { aptg, };
-
- if (!formulaShifter.adjustFormula(ptgs, currentExternSheetIx)) {
- return cra;
- }
- Ptg ptg0 = ptgs[0];
- if (ptg0 instanceof AreaPtg) {
- AreaPtg bptg = (AreaPtg) ptg0;
- return new CellRangeAddress(bptg.getFirstRow(), bptg.getLastRow(), bptg.getFirstColumn(), bptg.getLastColumn());
- }
- if (ptg0 instanceof AreaErrPtg) {
- return null;
- }
- throw new IllegalStateException("Unexpected shifted ptg class (" + ptg0.getClass().getName() + ")");
- }
}
Modified: poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/helpers/XSSFRowShifter.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/helpers/XSSFRowShifter.java?rev=1814256&r1=1814255&r2=1814256&view=diff
==============================================================================
--- poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/helpers/XSSFRowShifter.java (original)
+++ poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/helpers/XSSFRowShifter.java Sat Nov 4 07:17:44 2017
@@ -25,11 +25,8 @@ import org.apache.poi.ss.formula.Formula
import org.apache.poi.ss.formula.FormulaRenderer;
import org.apache.poi.ss.formula.FormulaShifter;
import org.apache.poi.ss.formula.FormulaType;
-import org.apache.poi.ss.formula.ptg.AreaErrPtg;
-import org.apache.poi.ss.formula.ptg.AreaPtg;
import org.apache.poi.ss.formula.ptg.Ptg;
import org.apache.poi.ss.usermodel.Cell;
-import org.apache.poi.ss.usermodel.Hyperlink;
import org.apache.poi.ss.usermodel.Name;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
@@ -41,7 +38,6 @@ import org.apache.poi.util.POILogFactory
import org.apache.poi.util.POILogger;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFEvaluationWorkbook;
-import org.apache.poi.xssf.usermodel.XSSFHyperlink;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
@@ -54,9 +50,9 @@ import org.openxmlformats.schemas.spread
/**
* Helper for shifting rows up or down
- *
- * When possible, code should be implemented in the RowShifter abstract class to avoid duplication with {@link org.apache.poi.hssf.usermodel.helpers.HSSFRowShifter}
*/
+// non-Javadoc: When possible, code should be implemented in the RowShifter abstract class to avoid duplication with
+// {@link org.apache.poi.hssf.usermodel.helpers.HSSFRowShifter}
public final class XSSFRowShifter extends RowShifter {
private static final POILogger logger = POILogFactory.getLogger(XSSFRowShifter.class);
@@ -253,40 +249,8 @@ public final class XSSFRowShifter extend
*/
@Override
public void updateHyperlinks(FormulaShifter formulaShifter) {
- int sheetIndex = sheet.getWorkbook().getSheetIndex(sheet);
- List<? extends Hyperlink> hyperlinkList = sheet.getHyperlinkList();
-
- for (Hyperlink hyperlink : hyperlinkList) {
- XSSFHyperlink xhyperlink = (XSSFHyperlink) hyperlink;
- String cellRef = xhyperlink.getCellRef();
- CellRangeAddress cra = CellRangeAddress.valueOf(cellRef);
- CellRangeAddress shiftedRange = shiftRange(formulaShifter, cra, sheetIndex);
- if (shiftedRange != null && shiftedRange != cra) {
- // shiftedRange should not be null. If shiftedRange is null, that means
- // that a hyperlink wasn't deleted at the beginning of shiftRows when
- // identifying rows that should be removed because they will be overwritten
- xhyperlink.setCellReference(shiftedRange.formatAsString());
- }
- }
+ XSSFRowColShifter.updateHyperlinks(sheet, formulaShifter);
}
- private static CellRangeAddress shiftRange(FormulaShifter formulaShifter, CellRangeAddress cra, int currentExternSheetIx) {
- // FormulaShifter works well in terms of Ptgs - so convert CellRangeAddress to AreaPtg (and back) here
- AreaPtg aptg = new AreaPtg(cra.getFirstRow(), cra.getLastRow(), cra.getFirstColumn(), cra.getLastColumn(), false, false, false, false);
- Ptg[] ptgs = { aptg, };
-
- if (!formulaShifter.adjustFormula(ptgs, currentExternSheetIx)) {
- return cra;
- }
- Ptg ptg0 = ptgs[0];
- if (ptg0 instanceof AreaPtg) {
- AreaPtg bptg = (AreaPtg) ptg0;
- return new CellRangeAddress(bptg.getFirstRow(), bptg.getLastRow(), bptg.getFirstColumn(), bptg.getLastColumn());
- }
- if (ptg0 instanceof AreaErrPtg) {
- return null;
- }
- throw new IllegalStateException("Unexpected shifted ptg class (" + ptg0.getClass().getName() + ")");
- }
}
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@poi.apache.org
For additional commands, e-mail: commits-help@poi.apache.org