You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@poi.apache.org by ki...@apache.org on 2015/07/19 21:00:38 UTC

svn commit: r1691843 [21/30] - in /poi/branches/common_sl: ./ .settings/ legal/ osgi/ osgi/src/ src/examples/src/org/apache/poi/hpsf/examples/ src/examples/src/org/apache/poi/hssf/usermodel/examples/ src/examples/src/org/apache/poi/ss/examples/ src/exa...

Modified: poi/branches/common_sl/src/ooxml/testcases/org/apache/poi/ss/usermodel/BaseTestXCell.java
URL: http://svn.apache.org/viewvc/poi/branches/common_sl/src/ooxml/testcases/org/apache/poi/ss/usermodel/BaseTestXCell.java?rev=1691843&r1=1691842&r2=1691843&view=diff
==============================================================================
--- poi/branches/common_sl/src/ooxml/testcases/org/apache/poi/ss/usermodel/BaseTestXCell.java (original)
+++ poi/branches/common_sl/src/ooxml/testcases/org/apache/poi/ss/usermodel/BaseTestXCell.java Sun Jul 19 19:00:32 2015
@@ -19,6 +19,7 @@ package org.apache.poi.ss.usermodel;
 
 import org.apache.poi.hssf.usermodel.HSSFCell;
 import org.apache.poi.ss.ITestDataProvider;
+import org.apache.poi.ss.SpreadsheetVersion;
 import org.apache.poi.xssf.SXSSFITestDataProvider;
 import org.apache.poi.xssf.XSSFITestDataProvider;
 import org.apache.poi.xssf.streaming.SXSSFCell;
@@ -48,32 +49,5 @@ public abstract class BaseTestXCell exte
 
         // invalid characters are replaced with question marks
         assertEquals("???<>\t\n\u00a0 &\"POI\'\u2122", wb.getSheetAt(0).getRow(0).getCell(0).getStringCellValue());
-
-    }
-
-    public void testEncodingbeloAscii(){
-        Workbook xwb = XSSFITestDataProvider.instance.createWorkbook();
-        Cell xCell = xwb.createSheet().createRow(0).createCell(0);
-
-        Workbook swb = SXSSFITestDataProvider.instance.createWorkbook();
-        Cell sCell = swb.createSheet().createRow(0).createCell(0);
-
-        StringBuffer sb = new StringBuffer();
-        // test all possible characters
-        for(int i = 0; i < Character.MAX_VALUE; i++) sb.append((char)i) ;
-
-        String str = sb.toString();
-
-        xCell.setCellValue(str);
-        assertEquals(str, xCell.getStringCellValue());
-        sCell.setCellValue(str);
-        assertEquals(str, sCell.getStringCellValue());
-
-        xwb = XSSFITestDataProvider.instance.writeOutAndReadBack(xwb);
-        swb = SXSSFITestDataProvider.instance.writeOutAndReadBack(swb);
-        xCell = xwb.getSheetAt(0).createRow(0).createCell(0);
-        sCell = swb.getSheetAt(0).createRow(0).createCell(0);
-
-        assertEquals(xCell.getStringCellValue(), sCell.getStringCellValue());
     }
 }

Modified: poi/branches/common_sl/src/ooxml/testcases/org/apache/poi/xslf/TestXSLFBugs.java
URL: http://svn.apache.org/viewvc/poi/branches/common_sl/src/ooxml/testcases/org/apache/poi/xslf/TestXSLFBugs.java?rev=1691843&r1=1691842&r2=1691843&view=diff
==============================================================================
--- poi/branches/common_sl/src/ooxml/testcases/org/apache/poi/xslf/TestXSLFBugs.java (original)
+++ poi/branches/common_sl/src/ooxml/testcases/org/apache/poi/xslf/TestXSLFBugs.java Sun Jul 19 19:00:32 2015
@@ -18,6 +18,7 @@ package org.apache.poi.xslf;
 
 import static junit.framework.TestCase.assertEquals;
 import static org.apache.poi.POITestCase.assertContains;
+import static org.junit.Assert.assertArrayEquals;
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.fail;
 
@@ -47,7 +48,6 @@ import org.apache.poi.xslf.usermodel.XSL
 import org.apache.poi.xslf.usermodel.XSLFSlideLayout;
 import org.junit.Ignore;
 import org.junit.Test;
-
 public class TestXSLFBugs {
 
     @Test
@@ -196,7 +196,7 @@ public class TestXSLFBugs {
     }
 
     @Test
-    // @Ignore("Similar to TestFontRendering it doesn't make sense to compare images because of tiny rendering differences in windows/unix")
+    @Ignore("Similar to TestFontRendering it doesn't make sense to compare images because of tiny rendering differences in windows/unix")
     public void bug54542() throws Exception {
         XMLSlideShow ss = XSLFTestDataSamples.openSampleDocument("54542_cropped_bitmap.pptx");
         
@@ -259,6 +259,107 @@ public class TestXSLFBugs {
         ss.setSlideOrder(slide, 2);
         validateSlides(ss, true, "Slide1","Slide2","New slide");
     }
+    
+    /**
+     * When working with >9 images, make sure the sorting ensures
+     *  that image10.foo isn't between image1.foo and image2.foo
+     */
+    @Test
+    public void test57552() throws Exception {
+        XMLSlideShow ss = new XMLSlideShow();
+        for (String s : new String[]{"Slide1","Slide2"}) {
+            ss.createSlide().createTextBox().setText(s);
+        }
+        
+        // Slide starts with just layout relation
+        XSLFSlide slide = ss.getSlides().get(0);
+        assertEquals(0, ss.getAllPictures().size());
+        assertEquals(1, slide.getShapes().size());
+        
+        assertEquals(1, slide.getRelations().size());
+        assertRelationEquals(XSLFRelation.SLIDE_LAYOUT, slide.getRelations().get(0));
+        
+        // Some dummy pictures
+        byte[][] pics = new byte[15][3];
+        for (int i=0; i<pics.length; i++) {
+            for (int j=0; j<pics[i].length; j++) {
+                pics[i][j] = (byte)i;
+            }
+        }
+        
+        // Add a few pictures
+        for (int i=0; i<10; i++) {
+            int idx = ss.addPicture(pics[i], XSLFPictureData.PICTURE_TYPE_JPEG);
+            assertEquals(i, idx);
+            assertEquals(i+1, ss.getAllPictures().size());
+            
+            XSLFPictureShape shape = slide.createPicture(idx);
+            assertNotNull(shape.getPictureData());
+            assertArrayEquals(pics[i], shape.getPictureData().getData());
+            assertEquals(i+2, slide.getShapes().size());
+        }
+        // Re-fetch the pictures and check
+        for (int i=0; i<10; i++) {
+            XSLFPictureShape shape = (XSLFPictureShape)slide.getShapes().get(i+1);
+            assertNotNull(shape.getPictureData());
+            assertArrayEquals(pics[i], shape.getPictureData().getData());
+        }
+        
+        // Add past 10
+        for (int i=10; i<15; i++) {
+            int idx = ss.addPicture(pics[i], XSLFPictureData.PICTURE_TYPE_JPEG);
+            assertEquals(i, idx);
+            assertEquals(i+1, ss.getAllPictures().size());
+            
+            XSLFPictureShape shape = slide.createPicture(idx);
+            assertNotNull(shape.getPictureData());
+            assertArrayEquals(pics[i], shape.getPictureData().getData());
+            assertEquals(i+2, slide.getShapes().size());
+        }
+        // Check all pictures
+        for (int i=0; i<15; i++) {
+            XSLFPictureShape shape = (XSLFPictureShape)slide.getShapes().get(i+1);
+            assertNotNull(shape.getPictureData());
+            assertArrayEquals(pics[i], shape.getPictureData().getData());
+        }
+        
+        // Add a duplicate, check the right one is picked
+        int idx = ss.addPicture(pics[3], XSLFPictureData.PICTURE_TYPE_JPEG);
+        assertEquals(3, idx);
+        assertEquals(15, ss.getAllPictures().size());
+        
+        XSLFPictureShape shape = slide.createPicture(idx);
+        assertNotNull(shape.getPictureData());
+        assertArrayEquals(pics[3], shape.getPictureData().getData());
+        assertEquals(17, slide.getShapes().size());
+        
+        
+        // Save and re-load
+        ss = XSLFTestDataSamples.writeOutAndReadBack(ss);
+        slide = ss.getSlides().get(0);
+        
+        // Check the 15 individual ones added
+        for (int i=0; i<15; i++) {
+            shape = (XSLFPictureShape)slide.getShapes().get(i+1);
+            assertNotNull(shape.getPictureData());
+            assertArrayEquals(pics[i], shape.getPictureData().getData());
+        }
+        
+        // Check the duplicate
+        shape = (XSLFPictureShape)slide.getShapes().get(16);
+        assertNotNull(shape.getPictureData());
+        assertArrayEquals(pics[3], shape.getPictureData().getData());
+        
+        // Add another duplicate
+        idx = ss.addPicture(pics[5], XSLFPictureData.PICTURE_TYPE_JPEG);
+        assertEquals(5, idx);
+        assertEquals(15, ss.getAllPictures().size());
+        
+        shape = slide.createPicture(idx);
+        assertNotNull(shape.getPictureData());
+        assertArrayEquals(pics[5], shape.getPictureData().getData());
+        assertEquals(18, slide.getShapes().size());
+    }
 
     private void validateSlides(XMLSlideShow ss, boolean saveAndReload, String... slideTexts) {
         if (saveAndReload) {
@@ -272,5 +373,8 @@ public class TestXSLFBugs {
             assertContains(getSlideText(slide), slideTexts[i]);
         }
     }
-
+    private void assertRelationEquals(XSLFRelation expected, POIXMLDocumentPart relation) {
+        assertEquals(expected.getContentType(), relation.getPackagePart().getContentType());
+        assertEquals(expected.getFileName(expected.getFileNameIndex(relation)), relation.getPackagePart().getPartName().getName());
+    }
 }

Modified: poi/branches/common_sl/src/ooxml/testcases/org/apache/poi/xssf/XSSFITestDataProvider.java
URL: http://svn.apache.org/viewvc/poi/branches/common_sl/src/ooxml/testcases/org/apache/poi/xssf/XSSFITestDataProvider.java?rev=1691843&r1=1691842&r2=1691843&view=diff
==============================================================================
--- poi/branches/common_sl/src/ooxml/testcases/org/apache/poi/xssf/XSSFITestDataProvider.java (original)
+++ poi/branches/common_sl/src/ooxml/testcases/org/apache/poi/xssf/XSSFITestDataProvider.java Sun Jul 19 19:00:32 2015
@@ -41,7 +41,7 @@ public final class XSSFITestDataProvider
 
     public XSSFWorkbook writeOutAndReadBack(Workbook original) {
         if(!(original instanceof XSSFWorkbook)) {
-            throw new IllegalArgumentException("Expected an instance of XSSFWorkbook");
+            throw new IllegalArgumentException("Expected an instance of XSSFWorkbook, but had " + original.getClass());
         }
         return XSSFTestDataSamples.writeOutAndReadBack((XSSFWorkbook)original);
     }

Modified: poi/branches/common_sl/src/ooxml/testcases/org/apache/poi/xssf/extractor/TestXSSFEventBasedExcelExtractor.java
URL: http://svn.apache.org/viewvc/poi/branches/common_sl/src/ooxml/testcases/org/apache/poi/xssf/extractor/TestXSSFEventBasedExcelExtractor.java?rev=1691843&r1=1691842&r2=1691843&view=diff
==============================================================================
--- poi/branches/common_sl/src/ooxml/testcases/org/apache/poi/xssf/extractor/TestXSSFEventBasedExcelExtractor.java (original)
+++ poi/branches/common_sl/src/ooxml/testcases/org/apache/poi/xssf/extractor/TestXSSFEventBasedExcelExtractor.java Sun Jul 19 19:00:32 2015
@@ -23,6 +23,7 @@ import java.util.regex.Pattern;
 import junit.framework.TestCase;
 
 import org.apache.poi.POITextExtractor;
+import org.apache.poi.POIXMLTextExtractor;
 import org.apache.poi.hssf.HSSFTestDataSamples;
 import org.apache.poi.hssf.extractor.ExcelExtractor;
 import org.apache.poi.xssf.XSSFTestDataSamples;
@@ -155,7 +156,6 @@ public class TestXSSFEventBasedExcelExtr
 		POITextExtractor[] extractors =
 			new POITextExtractor[] { ooxmlExtractor, ole2Extractor };
 		for (int i = 0; i < extractors.length; i++) {
-			@SuppressWarnings("resource")
             POITextExtractor extractor = extractors[i];
 			
 			String text = extractor.getText().replaceAll("[\r\t]", "");
@@ -316,4 +316,25 @@ public class TestXSSFEventBasedExcelExtr
             fixture.close();
         }
     }
+    
+    public void testFile56278_normal() throws Exception {
+        // first with normal Text Extractor
+        POIXMLTextExtractor extractor = new XSSFExcelExtractor(
+                XSSFTestDataSamples.openSampleWorkbook("56278.xlsx"));
+        try {
+            assertNotNull(extractor.getText());
+        } finally {
+            extractor.close();
+        }
+    }
+    
+    public void testFile56278_event() throws Exception {
+        // then with event based one
+        POIXMLTextExtractor extractor = getExtractor("56278.xlsx");        
+        try {
+            assertNotNull(extractor.getText());
+        } finally {
+            extractor.close();
+        }
+    }
 }

Modified: poi/branches/common_sl/src/ooxml/testcases/org/apache/poi/xssf/streaming/TestSXSSFSheet.java
URL: http://svn.apache.org/viewvc/poi/branches/common_sl/src/ooxml/testcases/org/apache/poi/xssf/streaming/TestSXSSFSheet.java?rev=1691843&r1=1691842&r2=1691843&view=diff
==============================================================================
--- poi/branches/common_sl/src/ooxml/testcases/org/apache/poi/xssf/streaming/TestSXSSFSheet.java (original)
+++ poi/branches/common_sl/src/ooxml/testcases/org/apache/poi/xssf/streaming/TestSXSSFSheet.java Sun Jul 19 19:00:32 2015
@@ -89,6 +89,13 @@ public class TestSXSSFSheet extends Base
         super.bug35084();
     }
 
+    @Test
+    public void getCellComment() throws IOException {
+    	// TODO: reading cell comments via Sheet does not work currently as it tries 
+    	// to access the underlying sheet for this, but comments are stored as
+    	// properties on Cells...
+    }
+    
     @Override
     @Test
     public void defaultColumnStyle() {

Modified: poi/branches/common_sl/src/ooxml/testcases/org/apache/poi/xssf/streaming/TestSXSSFWorkbook.java
URL: http://svn.apache.org/viewvc/poi/branches/common_sl/src/ooxml/testcases/org/apache/poi/xssf/streaming/TestSXSSFWorkbook.java?rev=1691843&r1=1691842&r2=1691843&view=diff
==============================================================================
--- poi/branches/common_sl/src/ooxml/testcases/org/apache/poi/xssf/streaming/TestSXSSFWorkbook.java (original)
+++ poi/branches/common_sl/src/ooxml/testcases/org/apache/poi/xssf/streaming/TestSXSSFWorkbook.java Sun Jul 19 19:00:32 2015
@@ -88,19 +88,23 @@ public final class TestSXSSFWorkbook ext
     }
 
     @Test
-    public void existingWorkbook() {
+    public void existingWorkbook() throws IOException {
     	XSSFWorkbook xssfWorkbook = new XSSFWorkbook();
     	xssfWorkbook.createSheet("S1");
     	SXSSFWorkbook wb = new SXSSFWorkbook(xssfWorkbook);
-    	xssfWorkbook = (XSSFWorkbook) SXSSFITestDataProvider.instance.writeOutAndReadBack(wb);
-    	assertTrue(wb.dispose());
-
-        wb = new SXSSFWorkbook(xssfWorkbook);
-    	assertEquals(1, wb.getNumberOfSheets());
-    	Sheet sheet  = wb.getSheetAt(0);
-    	assertNotNull(sheet);
-    	assertEquals("S1", sheet.getSheetName());
-        assertTrue(wb.dispose());
+    	try {
+        	xssfWorkbook = (XSSFWorkbook) SXSSFITestDataProvider.instance.writeOutAndReadBack(wb);
+        	assertTrue(wb.dispose());
+    
+            wb = new SXSSFWorkbook(xssfWorkbook);
+        	assertEquals(1, wb.getNumberOfSheets());
+        	Sheet sheet  = wb.getSheetAt(0);
+        	assertNotNull(sheet);
+        	assertEquals("S1", sheet.getSheetName());
+    	} finally {
+    	    assertTrue(wb.dispose());
+    	    wb.close();
+    	}
 
     }
 
@@ -123,7 +127,7 @@ public final class TestSXSSFWorkbook ext
         XSSFWorkbook xssfWorkbook = (XSSFWorkbook) SXSSFITestDataProvider.instance.writeOutAndReadBack(wb);
         sss = (SharedStringsTable)f.get(wb);
         assertEquals(2, sss.getUniqueCount());
-        wb.dispose();
+        assertTrue(wb.dispose());
 
         Sheet sheet1 = xssfWorkbook.getSheetAt(0);
         assertEquals("S1", sheet1.getSheetName());

Modified: poi/branches/common_sl/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestUnfixedBugs.java
URL: http://svn.apache.org/viewvc/poi/branches/common_sl/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestUnfixedBugs.java?rev=1691843&r1=1691842&r2=1691843&view=diff
==============================================================================
--- poi/branches/common_sl/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestUnfixedBugs.java (original)
+++ poi/branches/common_sl/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestUnfixedBugs.java Sun Jul 19 19:00:32 2015
@@ -17,9 +17,11 @@
 
 package org.apache.poi.xssf.usermodel;
 
-import static org.junit.Assert.assertEquals;
-
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.FileOutputStream;
 import java.io.IOException;
+import java.io.OutputStream;
 import java.nio.charset.Charset;
 import java.util.Calendar;
 import java.util.Date;
@@ -29,17 +31,21 @@ import junit.framework.TestCase;
 
 import org.apache.poi.hssf.HSSFTestDataSamples;
 import org.apache.poi.ss.usermodel.Cell;
+import org.apache.poi.ss.usermodel.CellStyle;
 import org.apache.poi.ss.usermodel.DataFormatter;
 import org.apache.poi.ss.usermodel.DateUtil;
-import org.apache.poi.ss.usermodel.FormulaError;
 import org.apache.poi.ss.usermodel.RichTextString;
 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.util.CellRangeAddress;
+import org.apache.poi.ss.util.CellUtil;
+import org.apache.poi.ss.util.RegionUtil;
 import org.apache.poi.xssf.SXSSFITestDataProvider;
 import org.apache.poi.xssf.XSSFTestDataSamples;
 import org.apache.poi.xssf.streaming.SXSSFWorkbook;
 import org.junit.Test;
+import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTRow;
 
 /**
  * @author centic
@@ -184,38 +190,6 @@ public final class TestUnfixedBugs exten
         }
     }
 
-    
-    @Test
-    public void test57165() throws IOException {
-        XSSFWorkbook wb = XSSFTestDataSamples.openSampleWorkbook("57171_57163_57165.xlsx");
-        try {
-            removeAllSheetsBut(3, wb);
-            wb.cloneSheet(0); // Throws exception here
-            wb.setSheetName(1, "New Sheet");
-            //saveWorkbook(wb, fileName);
-            
-            XSSFWorkbook wbBack = XSSFTestDataSamples.writeOutAndReadBack(wb);
-            try {
-                
-            } finally {
-                wbBack.close();
-            }
-        } finally {
-            wb.close();
-        }
-    }
-
-    private static void removeAllSheetsBut(int sheetIndex, Workbook wb)
-    {
-        int sheetNb = wb.getNumberOfSheets();
-        // Move this sheet at the first position
-        wb.setSheetOrder(wb.getSheetName(sheetIndex), 0);
-        for (int sn = sheetNb - 1; sn > 0; sn--)
-        {
-            wb.removeSheetAt(sn);
-        }
-    }
-
     // When this is fixed, the test case should go to BaseTestXCell with 
     // adjustments to use _testDataProvider to also verify this for XSSF
     public void testBug57294() throws IOException {
@@ -244,65 +218,159 @@ public final class TestUnfixedBugs exten
         assertEquals(4, strBack.getIndexOfFormattingRun(2));
     }
 
-    @Test
-    public void testBug56655() {
-        XSSFWorkbook wb =  new XSSFWorkbook();
-        Sheet sheet = wb.createSheet();
-        
-        setCellFormula(sheet, 0, 0, "#VALUE!");
-        setCellFormula(sheet, 0, 1, "SUMIFS(A:A,A:A,#VALUE!)");
-
-        XSSFFormulaEvaluator.evaluateAllFormulaCells(wb);
+   @Test
+   public void testBug55752() throws IOException {
+       Workbook wb = new XSSFWorkbook();
+       try {
+           Sheet sheet = wb.createSheet("test");
+    
+           for (int i = 0; i < 4; i++) {
+               Row row = sheet.createRow(i);
+               for (int j = 0; j < 2; j++) {
+                   Cell cell = row.createCell(j);
+                   cell.setCellStyle(wb.createCellStyle());
+               }
+           }
+    
+           // set content
+           Row row1 = sheet.getRow(0);
+           row1.getCell(0).setCellValue("AAA");
+           Row row2 = sheet.getRow(1);
+           row2.getCell(0).setCellValue("BBB");
+           Row row3 = sheet.getRow(2);
+           row3.getCell(0).setCellValue("CCC");
+           Row row4 = sheet.getRow(3);
+           row4.getCell(0).setCellValue("DDD");
+    
+           // merge cells
+           CellRangeAddress range1 = new CellRangeAddress(0, 0, 0, 1);
+           sheet.addMergedRegion(range1);
+           CellRangeAddress range2 = new CellRangeAddress(1, 1, 0, 1);
+           sheet.addMergedRegion(range2);
+           CellRangeAddress range3 = new CellRangeAddress(2, 2, 0, 1);
+           sheet.addMergedRegion(range3);
+           assertEquals(0, range3.getFirstColumn());
+           assertEquals(1, range3.getLastColumn());
+           assertEquals(2, range3.getLastRow());
+           CellRangeAddress range4 = new CellRangeAddress(3, 3, 0, 1);
+           sheet.addMergedRegion(range4);
+           
+           // set border
+           RegionUtil.setBorderBottom(CellStyle.BORDER_THIN, range1, sheet, wb);
+           
+           row2.getCell(0).getCellStyle().setBorderBottom(CellStyle.BORDER_THIN);
+           row2.getCell(1).getCellStyle().setBorderBottom(CellStyle.BORDER_THIN);
+
+           Cell cell0 = CellUtil.getCell(row3, 0);
+           CellUtil.setCellStyleProperty(cell0, wb, CellUtil.BORDER_BOTTOM, CellStyle.BORDER_THIN);
+           Cell cell1 = CellUtil.getCell(row3, 1);
+           CellUtil.setCellStyleProperty(cell1, wb, CellUtil.BORDER_BOTTOM, CellStyle.BORDER_THIN);
 
-        assertEquals(XSSFCell.CELL_TYPE_ERROR, getCell(sheet, 0,0).getCachedFormulaResultType());
-        assertEquals(FormulaError.VALUE.getCode(), getCell(sheet, 0,0).getErrorCellValue());
-        assertEquals(XSSFCell.CELL_TYPE_ERROR, getCell(sheet, 0,1).getCachedFormulaResultType());
-        assertEquals(FormulaError.VALUE.getCode(), getCell(sheet, 0,1).getErrorCellValue());
-    }
+           RegionUtil.setBorderBottom(CellStyle.BORDER_THIN, range4, sheet, wb);
+    
+           // write to file
+           OutputStream stream = new FileOutputStream(new File("C:/temp/55752.xlsx"));
+           try {
+               wb.write(stream);
+           } finally {
+               stream.close();
+           }
+       } finally {
+           wb.close();
+       }
+   }
 
-    @Test
-    public void testBug56655a() {
-        XSSFWorkbook wb =  new XSSFWorkbook();
-        Sheet sheet = wb.createSheet();
-        
-        setCellFormula(sheet, 0, 0, "B1*C1");
-        sheet.getRow(0).createCell(1).setCellValue("A");
-        setCellFormula(sheet, 1, 0, "B1*C1");
-        sheet.getRow(1).createCell(1).setCellValue("A");
-        setCellFormula(sheet, 0, 3, "SUMIFS(A:A,A:A,A2)");
-
-        XSSFFormulaEvaluator.evaluateAllFormulaCells(wb);
-
-        assertEquals(XSSFCell.CELL_TYPE_ERROR, getCell(sheet, 0, 0).getCachedFormulaResultType());
-        assertEquals(FormulaError.VALUE.getCode(), getCell(sheet, 0, 0).getErrorCellValue());
-        assertEquals(XSSFCell.CELL_TYPE_ERROR, getCell(sheet, 1, 0).getCachedFormulaResultType());
-        assertEquals(FormulaError.VALUE.getCode(), getCell(sheet, 1, 0).getErrorCellValue());
-        assertEquals(XSSFCell.CELL_TYPE_ERROR, getCell(sheet, 0, 3).getCachedFormulaResultType());
-        assertEquals(FormulaError.VALUE.getCode(), getCell(sheet, 0, 3).getErrorCellValue());
-    }
+   @Test
+   public void test57423() throws IOException {        
+       Workbook wb = XSSFTestDataSamples.openSampleWorkbook("57423.xlsx");
+       
+       Sheet testSheet = wb.getSheetAt(0);
+
+       // row shift (negative or positive) causes corrupted output xlsx file when the shift value is bigger 
+       // than the number of rows being shifted 
+       // Excel 2010 on opening the output file says:
+       // "Excel found unreadable content" and offers recovering the file by removing the unreadable content
+       // This can be observed in cases like the following:
+       // negative shift of 1 row by less than -1
+       // negative shift of 2 rows by less than -2
+       // positive shift of 1 row by 2 or more 
+       // positive shift of 2 rows by 3 or more
+       
+       //testSheet.shiftRows(4, 5, -3);
+       testSheet.shiftRows(10, 10, 2);
+       
+       checkRows57423(testSheet);
+       
+       Workbook wbBack = XSSFTestDataSamples.writeOutAndReadBack(wb);
+
+       /*FileOutputStream stream = new FileOutputStream("C:\\temp\\57423.xlsx");
+       try {
+           wb.write(stream);
+       } finally {
+           stream.close();
+       }*/
+
+       wb.close();
+       
+       checkRows57423(wbBack.getSheetAt(0));
+       
+       wbBack.close();
+   }
 
-    /**
-    * @param row 0-based
-    * @param column 0-based
-    */
-   void setCellFormula(Sheet sheet, int row, int column, String formula) {
-       Row r = sheet.getRow(row);
-       if (r == null) {
-           r = sheet.createRow(row);
-       }
-       Cell cell = r.getCell(column);
-       if (cell == null) {
-           cell = r.createCell(column);
+   private void checkRows57423(Sheet testSheet) throws IOException {
+       checkRow57423(testSheet, 0, "0");
+       checkRow57423(testSheet, 1, "1");
+       checkRow57423(testSheet, 2, "2");
+       checkRow57423(testSheet, 3, "3");
+       checkRow57423(testSheet, 4, "4");
+       checkRow57423(testSheet, 5, "5");
+       checkRow57423(testSheet, 6, "6");
+       checkRow57423(testSheet, 7, "7");
+       checkRow57423(testSheet, 8, "8");
+       checkRow57423(testSheet, 9, "9");
+       
+       assertNull("Row number 10 should be gone after the shift", 
+               testSheet.getRow(10));
+       
+       checkRow57423(testSheet, 11, "11");
+       checkRow57423(testSheet, 12, "10");
+       checkRow57423(testSheet, 13, "13");
+       checkRow57423(testSheet, 14, "14");
+       checkRow57423(testSheet, 15, "15");
+       checkRow57423(testSheet, 16, "16");
+       checkRow57423(testSheet, 17, "17");
+       checkRow57423(testSheet, 18, "18");
+       
+       ByteArrayOutputStream stream = new ByteArrayOutputStream();
+       try {
+           ((XSSFSheet)testSheet).write(stream);
+       } finally {
+           stream.close();
        }
-       cell.setCellType(XSSFCell.CELL_TYPE_FORMULA);
-       cell.setCellFormula(formula);
+       
+       // verify that the resulting XML has the rows in correct order as required by Excel
+       String xml = new String(stream.toByteArray());
+       int posR12 = xml.indexOf("<row r=\"12\"");
+       int posR13 = xml.indexOf("<row r=\"13\"");
+       
+       // both need to be found
+       assertTrue(posR12 != -1);
+       assertTrue(posR13 != -1);
+       
+       assertTrue("Need to find row 12 before row 13 after the shifting, but had row 12 at " + posR12 + " and row 13 at " + posR13, 
+               posR12 < posR13);
    }
 
-   /**
-    * @param rowNo 0-based
-    * @param column 0-based
-    */
-   Cell getCell(Sheet sheet, int rowNo, int column) {
-       return sheet.getRow(rowNo).getCell(column);
+   private void checkRow57423(Sheet testSheet, int rowNum, String contents) {
+       Row row = testSheet.getRow(rowNum);
+       assertNotNull("Expecting row at rownum " + rowNum, row);
+       
+       CTRow ctRow = ((XSSFRow)row).getCTRow();
+       assertEquals(rowNum+1, ctRow.getR());
+       
+       Cell cell = row.getCell(0);
+       assertNotNull("Expecting cell at rownum " + rowNum, cell);
+       assertEquals("Did not have expected contents at rownum " + rowNum, 
+               contents + ".0", cell.toString());
    }
 }



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