Author: fanningpj
Date: Wed Feb 14 20:30:01 2018
New Revision: 1824266

URL: http://svn.apache.org/viewvc?rev=1824266&view=rev
Log:
[github-94] Add Range Copier. Thanks to Dragan Jovanović. This closes #94

Added:
    poi/trunk/src/java/org/apache/poi/hssf/usermodel/HSSFRangeCopier.java   
(with props)
    poi/trunk/src/java/org/apache/poi/ss/usermodel/RangeCopier.java   (with 
props)
    poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFRangeCopier.java 
  (with props)
    
poi/trunk/src/ooxml/testcases/org/apache/poi/ss/usermodel/TestXSSFRangeCopier.java
   (with props)
    
poi/trunk/src/testcases/org/apache/poi/hssf/usermodel/TestHSSFRangeCopier.java  
 (with props)
    poi/trunk/src/testcases/org/apache/poi/ss/usermodel/TestRangeCopier.java   
(with props)
    poi/trunk/test-data/spreadsheet/tile-range-test.xls   (with props)
    poi/trunk/test-data/spreadsheet/tile-range-test.xlsx   (with props)
Modified:
    
poi/trunk/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFSheetShiftColumns.java
    
poi/trunk/src/ooxml/testcases/org/apache/poi/xssf/usermodel/helpers/TestXSSFColumnShifting.java
    
poi/trunk/src/testcases/org/apache/poi/hssf/usermodel/TestHSSFSheetShiftColumns.java
    
poi/trunk/src/testcases/org/apache/poi/ss/usermodel/BaseTestSheetShiftColumns.java

Added: poi/trunk/src/java/org/apache/poi/hssf/usermodel/HSSFRangeCopier.java
URL: 
http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/usermodel/HSSFRangeCopier.java?rev=1824266&view=auto
==============================================================================
--- poi/trunk/src/java/org/apache/poi/hssf/usermodel/HSSFRangeCopier.java 
(added)
+++ poi/trunk/src/java/org/apache/poi/hssf/usermodel/HSSFRangeCopier.java Wed 
Feb 14 20:30:01 2018
@@ -0,0 +1,42 @@
+/*
+ *  ====================================================================
+ *    Licensed to the Apache Software Foundation (ASF) under one or more
+ *    contributor license agreements.  See the NOTICE file distributed with
+ *    this work for additional information regarding copyright ownership.
+ *    The ASF licenses this file to You under the Apache License, Version 2.0
+ *    (the "License"); you may not use this file except in compliance with
+ *    the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *    Unless required by applicable law or agreed to in writing, software
+ *    distributed under the License is distributed on an "AS IS" BASIS,
+ *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *    See the License for the specific language governing permissions and
+ *    limitations under the License.
+ * ====================================================================
+ */
+
+package org.apache.poi.hssf.usermodel;
+
+import org.apache.poi.hssf.record.aggregates.FormulaRecordAggregate;
+import org.apache.poi.ss.formula.ptg.Ptg;
+import org.apache.poi.ss.usermodel.Cell;
+import org.apache.poi.ss.usermodel.RangeCopier;
+import org.apache.poi.ss.usermodel.Sheet;
+import org.apache.poi.util.Beta;
+
+@Beta
+public class HSSFRangeCopier extends RangeCopier {
+    public HSSFRangeCopier(Sheet sourceSheet, Sheet destSheet) {
+        super(sourceSheet, destSheet);
+    }
+
+    protected void adjustCellReferencesInsideFormula(Cell cell, Sheet 
destSheet, int deltaX, int deltaY) {
+        FormulaRecordAggregate fra = 
(FormulaRecordAggregate)((HSSFCell)cell).getCellValueRecord();
+        int destSheetIndex = destSheet.getWorkbook().getSheetIndex(destSheet);
+        Ptg[] ptgs = fra.getFormulaTokens();
+        if(adjustInBothDirections(ptgs, destSheetIndex, deltaX, deltaY))
+            fra.setParsedExpression(ptgs);
+    }
+}

Propchange: 
poi/trunk/src/java/org/apache/poi/hssf/usermodel/HSSFRangeCopier.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: poi/trunk/src/java/org/apache/poi/ss/usermodel/RangeCopier.java
URL: 
http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/ss/usermodel/RangeCopier.java?rev=1824266&view=auto
==============================================================================
--- poi/trunk/src/java/org/apache/poi/ss/usermodel/RangeCopier.java (added)
+++ poi/trunk/src/java/org/apache/poi/ss/usermodel/RangeCopier.java Wed Feb 14 
20:30:01 2018
@@ -0,0 +1,159 @@
+/*
+ *  ====================================================================
+ *    Licensed to the Apache Software Foundation (ASF) under one or more
+ *    contributor license agreements.  See the NOTICE file distributed with
+ *    this work for additional information regarding copyright ownership.
+ *    The ASF licenses this file to You under the Apache License, Version 2.0
+ *    (the "License"); you may not use this file except in compliance with
+ *    the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *    Unless required by applicable law or agreed to in writing, software
+ *    distributed under the License is distributed on an "AS IS" BASIS,
+ *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *    See the License for the specific language governing permissions and
+ *    limitations under the License.
+ * ====================================================================
+ */
+
+package org.apache.poi.ss.usermodel;
+
+import java.util.Map;
+import org.apache.poi.ss.formula.FormulaShifter;
+import org.apache.poi.ss.formula.ptg.Ptg;
+import org.apache.poi.ss.util.CellRangeAddress;
+import org.apache.poi.util.Beta;
+
+@Beta
+public abstract class RangeCopier {
+    private Sheet sourceSheet;
+    private Sheet destSheet;
+    private FormulaShifter horizontalFormulaShifter;
+    private FormulaShifter verticalFormulaShifter;
+
+    public RangeCopier(Sheet sourceSheet, Sheet destSheet) {
+        this.sourceSheet = sourceSheet;
+        this.destSheet = destSheet;
+    }
+    public RangeCopier(Sheet sheet) {
+        this(sheet, sheet);
+    }
+    /** 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
+     */
+    public void copyRange(CellRangeAddress tilePatternRange, CellRangeAddress 
tileDestRange) {
+        Sheet sourceCopy = 
sourceSheet.getWorkbook().cloneSheet(sourceSheet.getWorkbook().getSheetIndex(sourceSheet));
+        int sourceWidthMinus1 = tilePatternRange.getLastColumn() - 
tilePatternRange.getFirstColumn();
+        int sourceHeightMinus1 = tilePatternRange.getLastRow() - 
tilePatternRange.getFirstRow();
+        int rightLimitToCopy; 
+        int bottomLimitToCopy;
+
+        int nextRowIndexToCopy = tileDestRange.getFirstRow();
+        do { 
+            int nextCellIndexInRowToCopy = tileDestRange.getFirstColumn();
+            int heightToCopyMinus1 = Math.min(sourceHeightMinus1, 
tileDestRange.getLastRow() - nextRowIndexToCopy);
+            bottomLimitToCopy = tilePatternRange.getFirstRow() + 
heightToCopyMinus1;
+            do { 
+                int widthToCopyMinus1 = Math.min(sourceWidthMinus1, 
tileDestRange.getLastColumn() - nextCellIndexInRowToCopy);
+                rightLimitToCopy = tilePatternRange.getFirstColumn() + 
widthToCopyMinus1;
+                CellRangeAddress rangeToCopy = new CellRangeAddress(
+                        tilePatternRange.getFirstRow(),     bottomLimitToCopy,
+                        tilePatternRange.getFirstColumn(),  rightLimitToCopy 
+                       );
+                copyRange(rangeToCopy, nextCellIndexInRowToCopy - 
rangeToCopy.getFirstColumn(), nextRowIndexToCopy - rangeToCopy.getFirstRow(), 
sourceCopy);
+                nextCellIndexInRowToCopy += widthToCopyMinus1 + 1; 
+            } while (nextCellIndexInRowToCopy <= 
tileDestRange.getLastColumn());
+            nextRowIndexToCopy += heightToCopyMinus1 + 1;
+        } while (nextRowIndexToCopy <= tileDestRange.getLastRow());
+        
+        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
+        if(deltaX != 0)
+            horizontalFormulaShifter = 
FormulaShifter.createForColumnCopy(sourceSheet.getWorkbook().getSheetIndex(sourceSheet),
 
+                    sourceSheet.getSheetName(), sourceRange.getFirstColumn(), 
sourceRange.getLastColumn(), deltaX, 
sourceSheet.getWorkbook().getSpreadsheetVersion());
+        if(deltaY != 0)
+            verticalFormulaShifter = 
FormulaShifter.createForRowCopy(sourceSheet.getWorkbook().getSheetIndex(sourceSheet),
 
+                    sourceSheet.getSheetName(), sourceRange.getFirstRow(), 
sourceRange.getLastRow(), deltaY, 
sourceSheet.getWorkbook().getSpreadsheetVersion());
+        
+        for(int rowNo = sourceRange.getFirstRow(); rowNo <= 
sourceRange.getLastRow(); rowNo++) {   
+            Row sourceRow = sourceClone.getRow(rowNo); // copy from source 
copy, original source might be overridden in process!
+            for (int columnIndex = sourceRange.getFirstColumn(); columnIndex 
<= sourceRange.getLastColumn(); columnIndex++) {  
+                Cell sourceCell = sourceRow.getCell(columnIndex);
+                if(sourceCell == null)
+                    continue;
+                Row destRow = destSheet.getRow(rowNo + deltaY);
+                if(destRow == null)
+                    destRow = destSheet.createRow(rowNo + deltaY);
+                
+                Cell newCell = destRow.getCell(columnIndex + deltaX);
+                if(newCell != null)
+                    newCell.setCellType(sourceCell.getCellType());
+                else newCell = destRow.createCell(columnIndex + deltaX, 
sourceCell.getCellType());
+
+                cloneCellContent(sourceCell, newCell, null);
+                if(newCell.getCellType() == CellType.FORMULA)
+                    adjustCellReferencesInsideFormula(newCell, destSheet, 
deltaX, deltaY);
+            }
+        }
+    }
+    
+    protected abstract void adjustCellReferencesInsideFormula(Cell cell, Sheet 
destSheet, int deltaX, int deltaY); // this part is different for HSSF and XSSF
+    
+    protected boolean adjustInBothDirections(Ptg[] ptgs, int sheetIndex, int 
deltaX, int deltaY) {
+        boolean adjustSucceeded = true;
+        if(deltaY != 0)
+            adjustSucceeded = verticalFormulaShifter.adjustFormula(ptgs, 
sheetIndex); 
+        if(deltaX != 0)
+            adjustSucceeded = adjustSucceeded && 
horizontalFormulaShifter.adjustFormula(ptgs, sheetIndex);
+        return adjustSucceeded;
+    }
+    
+    // TODO clone some more properties ? 
+    public static void cloneCellContent(Cell srcCell, Cell destCell, 
Map<Integer, CellStyle> styleMap) {   
+         if(styleMap != null) {   
+             if(srcCell.getSheet().getWorkbook() == 
destCell.getSheet().getWorkbook()){   
+                 destCell.setCellStyle(srcCell.getCellStyle());   
+             } else {
+                 int stHashCode = srcCell.getCellStyle().hashCode();   
+                 CellStyle newCellStyle = styleMap.get(stHashCode);   
+                 if(newCellStyle == null){   
+                     newCellStyle = 
destCell.getSheet().getWorkbook().createCellStyle();   
+                     newCellStyle.cloneStyleFrom(srcCell.getCellStyle());   
+                     styleMap.put(stHashCode, newCellStyle);   
+                 }   
+                 destCell.setCellStyle(newCellStyle);   
+             }   
+         }   
+         switch(srcCell.getCellType()) {   
+             case STRING:   
+                 destCell.setCellValue(srcCell.getStringCellValue());   
+                 break;   
+             case NUMERIC:
+                 destCell.setCellValue(srcCell.getNumericCellValue());   
+                 break;   
+             case BLANK:   
+                 destCell.setCellType(CellType.BLANK);   
+                 break;   
+             case BOOLEAN:   
+                 destCell.setCellValue(srcCell.getBooleanCellValue());   
+                 break;   
+             case ERROR:   
+                 destCell.setCellErrorValue(srcCell.getErrorCellValue());   
+                 break;   
+             case FORMULA: 
+                 String oldFormula = srcCell.getCellFormula();
+                 destCell.setCellFormula(oldFormula);   
+                 break;   
+             default:   
+                 break;   
+         }   
+     }
+}

Propchange: poi/trunk/src/java/org/apache/poi/ss/usermodel/RangeCopier.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: 
poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFRangeCopier.java
URL: 
http://svn.apache.org/viewvc/poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFRangeCopier.java?rev=1824266&view=auto
==============================================================================
--- poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFRangeCopier.java 
(added)
+++ poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFRangeCopier.java 
Wed Feb 14 20:30:01 2018
@@ -0,0 +1,46 @@
+/*
+ *  ====================================================================
+ *    Licensed to the Apache Software Foundation (ASF) under one or more
+ *    contributor license agreements.  See the NOTICE file distributed with
+ *    this work for additional information regarding copyright ownership.
+ *    The ASF licenses this file to You under the Apache License, Version 2.0
+ *    (the "License"); you may not use this file except in compliance with
+ *    the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *    Unless required by applicable law or agreed to in writing, software
+ *    distributed under the License is distributed on an "AS IS" BASIS,
+ *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *    See the License for the specific language governing permissions and
+ *    limitations under the License.
+ * ====================================================================
+ */
+
+package org.apache.poi.xssf.usermodel;
+
+import org.apache.poi.ss.formula.FormulaParser;
+import org.apache.poi.ss.formula.FormulaRenderer;
+import org.apache.poi.ss.formula.FormulaType;
+import org.apache.poi.ss.formula.ptg.Ptg;
+import org.apache.poi.ss.usermodel.Cell;
+import org.apache.poi.ss.usermodel.RangeCopier;
+import org.apache.poi.ss.usermodel.Sheet;
+import org.apache.poi.util.Beta;
+
+@Beta
+public class XSSFRangeCopier extends RangeCopier {
+
+    public XSSFRangeCopier(Sheet sourceSheet, Sheet destSheet){
+        super(sourceSheet, destSheet);
+    }
+
+    protected void adjustCellReferencesInsideFormula(Cell cell, Sheet 
destSheet, int deltaX, int deltaY){
+        XSSFWorkbook hostWorkbook = (XSSFWorkbook) destSheet.getWorkbook();
+        XSSFEvaluationWorkbook fpb = 
XSSFEvaluationWorkbook.create(hostWorkbook); 
+        Ptg[] ptgs = FormulaParser.parse(cell.getCellFormula(), fpb, 
FormulaType.CELL, 0);
+        int destSheetIndex = hostWorkbook.getSheetIndex(destSheet);
+        if(adjustInBothDirections(ptgs, destSheetIndex, deltaX, deltaY))
+            cell.setCellFormula(FormulaRenderer.toFormulaString(fpb, ptgs));
+    }
+}

Propchange: 
poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFRangeCopier.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: 
poi/trunk/src/ooxml/testcases/org/apache/poi/ss/usermodel/TestXSSFRangeCopier.java
URL: 
http://svn.apache.org/viewvc/poi/trunk/src/ooxml/testcases/org/apache/poi/ss/usermodel/TestXSSFRangeCopier.java?rev=1824266&view=auto
==============================================================================
--- 
poi/trunk/src/ooxml/testcases/org/apache/poi/ss/usermodel/TestXSSFRangeCopier.java
 (added)
+++ 
poi/trunk/src/ooxml/testcases/org/apache/poi/ss/usermodel/TestXSSFRangeCopier.java
 Wed Feb 14 20:30:01 2018
@@ -0,0 +1,56 @@
+/*
+ *  ====================================================================
+ *    Licensed to the Apache Software Foundation (ASF) under one or more
+ *    contributor license agreements.  See the NOTICE file distributed with
+ *    this work for additional information regarding copyright ownership.
+ *    The ASF licenses this file to You under the Apache License, Version 2.0
+ *    (the "License"); you may not use this file except in compliance with
+ *    the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *    Unless required by applicable law or agreed to in writing, software
+ *    distributed under the License is distributed on an "AS IS" BASIS,
+ *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *    See the License for the specific language governing permissions and
+ *    limitations under the License.
+ * ====================================================================
+ */
+
+package org.apache.poi.ss.usermodel;
+
+import static org.junit.Assert.assertEquals;
+
+import org.apache.poi.xssf.XSSFITestDataProvider;
+import org.apache.poi.xssf.XSSFTestDataSamples;
+import org.apache.poi.xssf.usermodel.XSSFRangeCopier;
+import org.apache.poi.xssf.usermodel.XSSFRow;
+import org.apache.poi.xssf.usermodel.XSSFWorkbook;
+import org.junit.Before;
+import org.junit.Test;
+
+public class TestXSSFRangeCopier extends TestRangeCopier {
+    public TestXSSFRangeCopier() {
+        super(); 
+        workbook = new XSSFWorkbook();
+        testDataProvider = XSSFITestDataProvider.instance; 
+    }
+
+    @Before
+    public void init() {
+        workbook = 
XSSFTestDataSamples.openSampleWorkbook("tile-range-test.xlsx");
+        initSheets();
+        rangeCopier = new XSSFRangeCopier(sheet1, sheet1);
+        transSheetRangeCopier = new XSSFRangeCopier(sheet1, sheet2);
+    }
+
+    @Test // XSSF only. HSSF version wouldn't be so simple. And also this test 
is contained in following, more complex tests, so it's not really important.
+    public void copyRow() {
+        Row existingRow = sheet1.getRow(4);
+        XSSFRow newRow = (XSSFRow)sheet1.getRow(5);
+        CellCopyPolicy policy = new CellCopyPolicy();
+        newRow.copyRowFrom(existingRow, policy);
+        assertEquals("$C2+B$2", newRow.getCell(1).getCellFormula());
+    }
+    
+}

Propchange: 
poi/trunk/src/ooxml/testcases/org/apache/poi/ss/usermodel/TestXSSFRangeCopier.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: 
poi/trunk/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFSheetShiftColumns.java
URL: 
http://svn.apache.org/viewvc/poi/trunk/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFSheetShiftColumns.java?rev=1824266&r1=1824265&r2=1824266&view=diff
==============================================================================
--- 
poi/trunk/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFSheetShiftColumns.java
 (original)
+++ 
poi/trunk/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFSheetShiftColumns.java
 Wed Feb 14 20:30:01 2018
@@ -40,4 +40,4 @@ public class TestXSSFSheetShiftColumns e
         return XSSFTestDataSamples.writeOutAndReadBack(wb);
     }
 
-}
+}
\ No newline at end of file

Modified: 
poi/trunk/src/ooxml/testcases/org/apache/poi/xssf/usermodel/helpers/TestXSSFColumnShifting.java
URL: 
http://svn.apache.org/viewvc/poi/trunk/src/ooxml/testcases/org/apache/poi/xssf/usermodel/helpers/TestXSSFColumnShifting.java?rev=1824266&r1=1824265&r2=1824266&view=diff
==============================================================================
--- 
poi/trunk/src/ooxml/testcases/org/apache/poi/xssf/usermodel/helpers/TestXSSFColumnShifting.java
 (original)
+++ 
poi/trunk/src/ooxml/testcases/org/apache/poi/xssf/usermodel/helpers/TestXSSFColumnShifting.java
 Wed Feb 14 20:30:01 2018
@@ -31,5 +31,4 @@ public class TestXSSFColumnShifting exte
     protected void initColumnShifter(){
         columnShifter = new XSSFColumnShifter((XSSFSheet)sheet1);
     }
-
 }

Added: 
poi/trunk/src/testcases/org/apache/poi/hssf/usermodel/TestHSSFRangeCopier.java
URL: 
http://svn.apache.org/viewvc/poi/trunk/src/testcases/org/apache/poi/hssf/usermodel/TestHSSFRangeCopier.java?rev=1824266&view=auto
==============================================================================
--- 
poi/trunk/src/testcases/org/apache/poi/hssf/usermodel/TestHSSFRangeCopier.java 
(added)
+++ 
poi/trunk/src/testcases/org/apache/poi/hssf/usermodel/TestHSSFRangeCopier.java 
Wed Feb 14 20:30:01 2018
@@ -0,0 +1,42 @@
+/*
+ *  ====================================================================
+ *    Licensed to the Apache Software Foundation (ASF) under one or more
+ *    contributor license agreements.  See the NOTICE file distributed with
+ *    this work for additional information regarding copyright ownership.
+ *    The ASF licenses this file to You under the Apache License, Version 2.0
+ *    (the "License"); you may not use this file except in compliance with
+ *    the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *    Unless required by applicable law or agreed to in writing, software
+ *    distributed under the License is distributed on an "AS IS" BASIS,
+ *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *    See the License for the specific language governing permissions and
+ *    limitations under the License.
+ * ====================================================================
+ */
+
+package org.apache.poi.hssf.usermodel;
+
+import org.apache.poi.hssf.HSSFITestDataProvider;
+import org.apache.poi.hssf.HSSFTestDataSamples;
+import org.apache.poi.ss.usermodel.TestRangeCopier;
+import org.junit.Before;
+
+public class TestHSSFRangeCopier extends TestRangeCopier {
+
+    public TestHSSFRangeCopier() {
+        super(); 
+        workbook = new HSSFWorkbook();
+        testDataProvider = HSSFITestDataProvider.instance; 
+    }
+
+    @Before
+    public void init() {
+        workbook = 
HSSFTestDataSamples.openSampleWorkbook("tile-range-test.xls");
+        initSheets();
+        rangeCopier = new HSSFRangeCopier(sheet1, sheet1);
+        transSheetRangeCopier = new HSSFRangeCopier(sheet1, sheet2);
+    }
+}

Propchange: 
poi/trunk/src/testcases/org/apache/poi/hssf/usermodel/TestHSSFRangeCopier.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: 
poi/trunk/src/testcases/org/apache/poi/hssf/usermodel/TestHSSFSheetShiftColumns.java
URL: 
http://svn.apache.org/viewvc/poi/trunk/src/testcases/org/apache/poi/hssf/usermodel/TestHSSFSheetShiftColumns.java?rev=1824266&r1=1824265&r2=1824266&view=diff
==============================================================================
--- 
poi/trunk/src/testcases/org/apache/poi/hssf/usermodel/TestHSSFSheetShiftColumns.java
 (original)
+++ 
poi/trunk/src/testcases/org/apache/poi/hssf/usermodel/TestHSSFSheetShiftColumns.java
 Wed Feb 14 20:30:01 2018
@@ -79,7 +79,6 @@ public class TestHSSFSheetShiftColumns e
         // so that original method from BaseTestSheetShiftColumns can be 
executed. 
         // After removing, you can re-add 'final' keyword to specification of 
original method. 
     }
-
     @Override
     @Ignore("see <https://bz.apache.org/bugzilla/show_bug.cgi?id=62030>")
     @Test

Modified: 
poi/trunk/src/testcases/org/apache/poi/ss/usermodel/BaseTestSheetShiftColumns.java
URL: 
http://svn.apache.org/viewvc/poi/trunk/src/testcases/org/apache/poi/ss/usermodel/BaseTestSheetShiftColumns.java?rev=1824266&r1=1824265&r2=1824266&view=diff
==============================================================================
--- 
poi/trunk/src/testcases/org/apache/poi/ss/usermodel/BaseTestSheetShiftColumns.java
 (original)
+++ 
poi/trunk/src/testcases/org/apache/poi/ss/usermodel/BaseTestSheetShiftColumns.java
 Wed Feb 14 20:30:01 2018
@@ -94,7 +94,6 @@ public abstract class BaseTestSheetShift
         style.setVerticalAlignment(VerticalAlignment.BOTTOM);
         return style;
     }
-
     @Test
     public void testShiftOneColumnRight() {
         sheet1.shiftColumns(1, 2, 1);
@@ -271,7 +270,6 @@ public abstract class BaseTestSheetShift
         // A1:A5 should be moved to B1:B5
         // B1:B3 will be removed
         sheet.shiftColumns(0, 0, 1);
-
         assertEquals(1, sheet.getNumMergedRegions());
         assertEquals(CellRangeAddress.valueOf("B1:B5"), 
sheet.getMergedRegion(0));
 
@@ -398,6 +396,4 @@ public abstract class BaseTestSheetShift
         assertEquals("X", cell.getStringCellValue());
         wb.close();
     }
-
-
 }

Added: poi/trunk/src/testcases/org/apache/poi/ss/usermodel/TestRangeCopier.java
URL: 
http://svn.apache.org/viewvc/poi/trunk/src/testcases/org/apache/poi/ss/usermodel/TestRangeCopier.java?rev=1824266&view=auto
==============================================================================
--- poi/trunk/src/testcases/org/apache/poi/ss/usermodel/TestRangeCopier.java 
(added)
+++ poi/trunk/src/testcases/org/apache/poi/ss/usermodel/TestRangeCopier.java 
Wed Feb 14 20:30:01 2018
@@ -0,0 +1,99 @@
+/*
+ *  ====================================================================
+ *    Licensed to the Apache Software Foundation (ASF) under one or more
+ *    contributor license agreements.  See the NOTICE file distributed with
+ *    this work for additional information regarding copyright ownership.
+ *    The ASF licenses this file to You under the Apache License, Version 2.0
+ *    (the "License"); you may not use this file except in compliance with
+ *    the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *    Unless required by applicable law or agreed to in writing, software
+ *    distributed under the License is distributed on an "AS IS" BASIS,
+ *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *    See the License for the specific language governing permissions and
+ *    limitations under the License.
+ * ====================================================================
+ */
+
+package org.apache.poi.ss.usermodel;
+
+import static org.junit.Assert.assertEquals;
+
+import org.junit.Ignore;
+import org.junit.Test;
+import org.apache.poi.ss.ITestDataProvider;
+import org.apache.poi.ss.util.CellRangeAddress;
+import org.apache.poi.ss.util.CellReference;
+
+@Ignore
+public abstract class TestRangeCopier {
+    protected Sheet sheet1;
+    protected Sheet sheet2;
+    protected Workbook workbook;
+    protected RangeCopier rangeCopier; 
+    protected RangeCopier transSheetRangeCopier; 
+    protected ITestDataProvider testDataProvider;
+
+    protected void initSheets() {
+        sheet1 = workbook.getSheet("sheet1");
+        sheet2 = workbook.getSheet("sheet2");
+    }
+    
+    @Test
+    public void copySheetRangeWithoutFormulas() {
+        CellRangeAddress rangeToCopy = CellRangeAddress.valueOf("B1:C2");   
//2x2
+        CellRangeAddress destRange = CellRangeAddress.valueOf("C2:D3");     
//2x2
+        rangeCopier.copyRange(rangeToCopy, destRange);
+        assertEquals("1.1", sheet1.getRow(2).getCell(2).toString());
+        assertEquals("2.1", sheet1.getRow(2).getCell(3).toString());
+    }
+
+    @Test
+    public void tileTheRangeAway() {
+        CellRangeAddress tileRange = CellRangeAddress.valueOf("C4:D5");
+        CellRangeAddress destRange = CellRangeAddress.valueOf("F4:K5"); 
+        rangeCopier.copyRange(tileRange, destRange);
+        assertEquals("1.3", getCellContent(sheet1, "H4"));  
+        assertEquals("1.3", getCellContent(sheet1, "J4"));  
+        assertEquals("$C1+G$2", getCellContent(sheet1, "G5"));  
+        assertEquals("SUM(G3:I3)", getCellContent(sheet1, "H5"));   
+        assertEquals("$C1+I$2", getCellContent(sheet1, "I5"));  
+        assertEquals("", getCellContent(sheet1, "L5"));  //out of borders
+        assertEquals("", getCellContent(sheet1, "G7")); //out of borders
+    }
+    
+    @Test
+    public void tileTheRangeOver() {
+        CellRangeAddress tileRange = CellRangeAddress.valueOf("C4:D5");
+        CellRangeAddress destRange = CellRangeAddress.valueOf("A4:C5"); 
+        rangeCopier.copyRange(tileRange, destRange);
+        assertEquals("1.3", getCellContent(sheet1, "A4"));
+        assertEquals("$C1+B$2", getCellContent(sheet1, "B5"));
+        assertEquals("SUM(B3:D3)", getCellContent(sheet1, "C5"));
+    }
+
+    @Test
+    public void copyRangeToOtherSheet() {
+        Sheet destSheet = sheet2;
+        CellRangeAddress tileRange = CellRangeAddress.valueOf("C4:D5"); // on 
sheet1
+        CellRangeAddress destRange = CellRangeAddress.valueOf("F4:J6"); // on 
sheet2 
+        transSheetRangeCopier.copyRange(tileRange, destRange);
+        assertEquals("1.3", getCellContent(destSheet, "H4"));
+        assertEquals("1.3", getCellContent(destSheet, "J4"));
+        assertEquals("$C1+G$2", getCellContent(destSheet, "G5"));
+        assertEquals("SUM(G3:I3)", getCellContent(destSheet, "H5"));
+        assertEquals("$C1+I$2", getCellContent(destSheet, "I5"));
+    }
+    
+    protected static String getCellContent(Sheet sheet, String coordinates) {
+        try {
+            CellReference p = new CellReference(coordinates);
+            return sheet.getRow(p.getRow()).getCell(p.getCol()).toString();
+        }
+        catch (NullPointerException e) { // row or cell does not exist
+            return "";
+        }
+    }
+}

Propchange: 
poi/trunk/src/testcases/org/apache/poi/ss/usermodel/TestRangeCopier.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: poi/trunk/test-data/spreadsheet/tile-range-test.xls
URL: 
http://svn.apache.org/viewvc/poi/trunk/test-data/spreadsheet/tile-range-test.xls?rev=1824266&view=auto
==============================================================================
Binary file - no diff available.

Propchange: poi/trunk/test-data/spreadsheet/tile-range-test.xls
------------------------------------------------------------------------------
    svn:mime-type = application/vnd.ms-excel

Added: poi/trunk/test-data/spreadsheet/tile-range-test.xlsx
URL: 
http://svn.apache.org/viewvc/poi/trunk/test-data/spreadsheet/tile-range-test.xlsx?rev=1824266&view=auto
==============================================================================
Binary file - no diff available.

Propchange: poi/trunk/test-data/spreadsheet/tile-range-test.xlsx
------------------------------------------------------------------------------
--- svn:mime-type (added)
+++ svn:mime-type Wed Feb 14 20:30:01 2018
@@ -0,0 +1 @@
+application/vnd.openxmlformats-officedocument.spreadsheetml.sheet



---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscr...@poi.apache.org
For additional commands, e-mail: commits-h...@poi.apache.org

Reply via email to