aboutsummaryrefslogtreecommitdiffstats
path: root/src/java/org/apache/poi/ss/usermodel
diff options
context:
space:
mode:
authorPJ Fanning <fanningpj@apache.org>2020-05-15 19:46:17 +0000
committerPJ Fanning <fanningpj@apache.org>2020-05-15 19:46:17 +0000
commit9bddb8729eb517f18b47d4e9eb6ed5495631462d (patch)
treef12c6471d6e88b22417b91f7bf618dad12a5e05d /src/java/org/apache/poi/ss/usermodel
parent237d55b3e39f78161d55f411bad380b1acff38d6 (diff)
downloadpoi-9bddb8729eb517f18b47d4e9eb6ed5495631462d.tar.gz
poi-9bddb8729eb517f18b47d4e9eb6ed5495631462d.zip
[github-179] add an option for RangeCopier.copyRange() to clone styles. Thanks to xjlin0. This closes #179
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1877792 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'src/java/org/apache/poi/ss/usermodel')
-rw-r--r--src/java/org/apache/poi/ss/usermodel/RangeCopier.java28
1 files changed, 24 insertions, 4 deletions
diff --git a/src/java/org/apache/poi/ss/usermodel/RangeCopier.java b/src/java/org/apache/poi/ss/usermodel/RangeCopier.java
index 8409accc72..b9d42f61b9 100644
--- a/src/java/org/apache/poi/ss/usermodel/RangeCopier.java
+++ b/src/java/org/apache/poi/ss/usermodel/RangeCopier.java
@@ -19,6 +19,7 @@
package org.apache.poi.ss.usermodel;
+import java.util.HashMap;
import java.util.Map;
import org.apache.poi.ss.formula.FormulaShifter;
import org.apache.poi.ss.formula.ptg.Ptg;
@@ -46,10 +47,25 @@ public abstract class RangeCopier {
* 2.Paste source but only inside of destination borders.
* 3.If there is space left on right or bottom side of copy, process it as in step 2.
* @param tilePatternRange source range which should be copied in tiled manner
- * @param tileDestRange destination range, which should be overridden
+ * @param tileDestRange destination range, which should be overridden
*/
public void copyRange(CellRangeAddress tilePatternRange, CellRangeAddress tileDestRange) {
+ copyRange(tilePatternRange, tileDestRange, false, false);
+ }
+
+ /** Uses input pattern to tile destination region, overwriting existing content. Works in following manner :
+ * 1.Start from top-left of destination.
+ * 2.Paste source but only inside of destination borders.
+ * 3.If there is space left on right or bottom side of copy, process it as in step 2.
+ * @param tilePatternRange source range which should be copied in tiled manner
+ * @param tileDestRange destination range, which should be overridden
+ * @param copyStyles whether to copy the cell styles
+ * @param copyMergedRanges whether to copy merged ranges
+ * @since 4.1.3
+ */
+ public void copyRange(CellRangeAddress tilePatternRange, CellRangeAddress tileDestRange, boolean copyStyles, boolean copyMergedRanges) {
Sheet sourceCopy = sourceSheet.getWorkbook().cloneSheet(sourceSheet.getWorkbook().getSheetIndex(sourceSheet));
+ Map<Integer, CellStyle> styleMap = copyStyles ? new HashMap<Integer, CellStyle>() {} : null;
int sourceWidthMinus1 = tilePatternRange.getLastColumn() - tilePatternRange.getFirstColumn();
int sourceHeightMinus1 = tilePatternRange.getLastRow() - tilePatternRange.getFirstRow();
int rightLimitToCopy;
@@ -67,17 +83,21 @@ public abstract class RangeCopier {
tilePatternRange.getFirstRow(), bottomLimitToCopy,
tilePatternRange.getFirstColumn(), rightLimitToCopy
);
- copyRange(rangeToCopy, nextCellIndexInRowToCopy - rangeToCopy.getFirstColumn(), nextRowIndexToCopy - rangeToCopy.getFirstRow(), sourceCopy);
+ copyRange(rangeToCopy, nextCellIndexInRowToCopy - rangeToCopy.getFirstColumn(), nextRowIndexToCopy - rangeToCopy.getFirstRow(), sourceCopy, styleMap);
nextCellIndexInRowToCopy += widthToCopyMinus1 + 1;
} while (nextCellIndexInRowToCopy <= tileDestRange.getLastColumn());
nextRowIndexToCopy += heightToCopyMinus1 + 1;
} while (nextRowIndexToCopy <= tileDestRange.getLastRow());
+ if (copyMergedRanges) {
+ sourceSheet.getMergedRegions().forEach((mergedRangeAddress) -> destSheet.addMergedRegion(mergedRangeAddress));
+ }
+
int tempCopyIndex = sourceSheet.getWorkbook().getSheetIndex(sourceCopy);
sourceSheet.getWorkbook().removeSheetAt(tempCopyIndex);
}
- private void copyRange(CellRangeAddress sourceRange, int deltaX, int deltaY, Sheet sourceClone) { //NOSONAR, it's a bit complex but monolith method, does not make much sense to divide it
+ private void copyRange(CellRangeAddress sourceRange, int deltaX, int deltaY, Sheet sourceClone, Map<Integer, CellStyle> styleMap) { //NOSONAR, it's a bit complex but monolith method, does not make much sense to divide it
if(deltaX != 0)
horizontalFormulaShifter = FormulaShifter.createForColumnCopy(sourceSheet.getWorkbook().getSheetIndex(sourceSheet),
sourceSheet.getSheetName(), sourceRange.getFirstColumn(), sourceRange.getLastColumn(), deltaX, sourceSheet.getWorkbook().getSpreadsheetVersion());
@@ -105,7 +125,7 @@ public abstract class RangeCopier {
newCell = destRow.createCell(columnIndex + deltaX);
}
- cloneCellContent(sourceCell, newCell, null);
+ cloneCellContent(sourceCell, newCell, styleMap);
if(newCell.getCellType() == CellType.FORMULA)
adjustCellReferencesInsideFormula(newCell, destSheet, deltaX, deltaY);
}