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