From: Yegor Kozlov Date: Fri, 9 Dec 2011 11:04:22 +0000 (+0000) Subject: Bugzilla 51961: support compression of temp files in SXSSF X-Git-Tag: REL_3_8_BETA5~7 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=3009b0774652f488dd5dca684d59dfabbafdd0fe;p=poi.git Bugzilla 51961: support compression of temp files in SXSSF git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1212330 13f79535-47bb-0310-9956-ffa450edef68 --- diff --git a/src/documentation/content/xdocs/spreadsheet/how-to.xml b/src/documentation/content/xdocs/spreadsheet/how-to.xml index 3f423d9fc3..f51cf7372b 100644 --- a/src/documentation/content/xdocs/spreadsheet/how-to.xml +++ b/src/documentation/content/xdocs/spreadsheet/how-to.xml @@ -739,6 +739,16 @@ import org.apache.poi.xssf.streaming.SXSSFWorkbook; ]]> +

SXSSF flushes sheet data in temporary files (a temp file per sheet) and the size of these temporary files +can grow to a very large value. For example, for a 20 MB csv data the size of the temp xml becomes more than a gigabyte. +If the size of the temp files is an issue, you can tell SXSSF to use gzip compression: +

+ + diff --git a/src/documentation/content/xdocs/status.xml b/src/documentation/content/xdocs/status.xml index f90dec6012..e05178fe90 100644 --- a/src/documentation/content/xdocs/status.xml +++ b/src/documentation/content/xdocs/status.xml @@ -34,6 +34,7 @@ + 51961 - support compression of temp files in SXSSF 52268 - support cloning sheets with drawings in XSSF 52285 - Support XWPF smart tags text in Paragraphs 51875 - More XSSF new-line in formula support diff --git a/src/ooxml/java/org/apache/poi/xssf/streaming/GZIPSheetDataWriter.java b/src/ooxml/java/org/apache/poi/xssf/streaming/GZIPSheetDataWriter.java new file mode 100644 index 0000000000..509c9df918 --- /dev/null +++ b/src/ooxml/java/org/apache/poi/xssf/streaming/GZIPSheetDataWriter.java @@ -0,0 +1,60 @@ +/* + * ==================================================================== + * 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.streaming; + +import java.io.*; +import java.util.zip.GZIPInputStream; +import java.util.zip.GZIPOutputStream; + +/** + * Sheet writer that supports gzip compression of the temp files. + */ +public class GZIPSheetDataWriter extends SheetDataWriter { + + public GZIPSheetDataWriter() throws IOException { + super(); + } + + /** + * @return temp file to write sheet data + */ + public File createTempFile()throws IOException { + File fd = File.createTempFile("poi-sxssf-sheet-xml", ".gz"); + fd.deleteOnExit(); + return fd; + } + + /** + * @return a wrapped instance of GZIPOutputStream + */ + public Writer createWriter(File fd)throws IOException { + return new OutputStreamWriter(new GZIPOutputStream(new FileOutputStream(fd))); + } + + + /** + * @return a GZIPInputStream stream to read the compressed temp file + */ + public InputStream getWorksheetXMLInputStream() throws IOException { + File fd = getTempFile(); + return new GZIPInputStream(new FileInputStream(fd)); + } + +} diff --git a/src/ooxml/java/org/apache/poi/xssf/streaming/SXSSFSheet.java b/src/ooxml/java/org/apache/poi/xssf/streaming/SXSSFSheet.java index a0f30b8294..c453203ac9 100644 --- a/src/ooxml/java/org/apache/poi/xssf/streaming/SXSSFSheet.java +++ b/src/ooxml/java/org/apache/poi/xssf/streaming/SXSSFSheet.java @@ -23,9 +23,9 @@ import java.util.TreeMap; import java.util.Map; import org.apache.poi.ss.usermodel.*; -import org.apache.poi.ss.util.CellReference; import org.apache.poi.ss.util.SheetUtil; +import org.apache.poi.util.Internal; import org.apache.poi.xssf.usermodel.XSSFSheet; import org.apache.poi.hssf.util.PaneInformation; @@ -48,14 +48,24 @@ public class SXSSFSheet implements Sheet, Cloneable { _workbook=workbook; _sh=xSheet; - _writer=new SheetDataWriter(); + _writer = workbook.createSheetDataWriter(); setRandomAccessWindowSize(_workbook.getRandomAccessWindowSize()); } + + /** + * for testing purposes only + */ + SheetDataWriter getSheetDataWriter(){ + return _writer; + } + /* Gets "" document fragment*/ public InputStream getWorksheetXMLInputStream() throws IOException { + // flush all remaining data and close the temp file writer flushRows(0); + _writer.close(); return _writer.getWorksheetXMLInputStream(); } @@ -1271,260 +1281,4 @@ public class SXSSFSheet implements Sheet, Cloneable assert false; return -1; } -/*Initially copied from BigGridDemo "SpreadsheetWriter". Unlike the original code which wrote the entire document, this class only writes the "sheetData" document fragment so that it was renamed to "SheetDataWriter"*/ - public class SheetDataWriter - { - private final File _fd; - private final Writer _out; - private int _rownum; - private boolean _rowContainedNullCells=false; - int _numberOfFlushedRows; - int _lowestIndexOfFlushedRows; // meaningful only of _numberOfFlushedRows>0 - int _numberOfCellsOfLastFlushedRow; // meaningful only of _numberOfFlushedRows>0 - - public SheetDataWriter() throws IOException - { - _fd = File.createTempFile("poi-sxssf-sheet", ".xml"); - _fd.deleteOnExit(); - _out = new BufferedWriter(new FileWriter(_fd)); - } - public int getNumberOfFlushedRows() - { - return _numberOfFlushedRows; - } - public int getNumberOfCellsOfLastFlushedRow() - { - return _numberOfCellsOfLastFlushedRow; - } - public int getLowestIndexOfFlushedRows() - { - return _lowestIndexOfFlushedRows; - } - protected void finalize() throws Throwable - { - _fd.delete(); - } - public InputStream getWorksheetXMLInputStream() throws IOException - { - _out.flush(); - _out.close(); - return new FileInputStream(_fd); - } - - /** - * Write a row to the file - * - * @param rownum 0-based row number - * @param row a row - */ - public void writeRow(int rownum,SXSSFRow row) throws IOException - { - if(_numberOfFlushedRows==0) - _lowestIndexOfFlushedRows=rownum; - _numberOfCellsOfLastFlushedRow=row.getLastCellNum(); - _numberOfFlushedRows++; - beginRow(rownum,row); - Iterator cells=row.allCellsIterator(); - int columnIndex=0; - while(cells.hasNext()) - { - writeCell(columnIndex++,cells.next()); - } - endRow(); - } - void beginRow(int rownum,SXSSFRow row) throws IOException - { - _out.write("\n"); - } - - public void writeCell(int columnIndex,Cell cell) throws IOException - { - if(cell==null) - { - _rowContainedNullCells=true; - return; - } - String ref = new CellReference(_rownum, columnIndex).formatAsString(); - _out.write(""); - break; - } - case Cell.CELL_TYPE_FORMULA: - { - _out.write(">"); - _out.write(""); - outputQuotedString(cell.getCellFormula()); - _out.write(""); - switch (cell.getCachedFormulaResultType()){ - case Cell.CELL_TYPE_NUMERIC: - double nval = cell.getNumericCellValue(); - if(!Double.isNaN(nval)){ - _out.write(""+nval+""); - } - break; - } - break; - } - case Cell.CELL_TYPE_STRING: - { - _out.write(" t=\"inlineStr\">"); - _out.write(""); - outputQuotedString(cell.getStringCellValue()); - _out.write(""); - break; - } - case Cell.CELL_TYPE_NUMERIC: - { - _out.write(" t=\"n\">"); - _out.write(""+cell.getNumericCellValue()+""); - break; - } - case Cell.CELL_TYPE_BOOLEAN: - { - _out.write(" t=\"b\">"); - _out.write(""+(cell.getBooleanCellValue()?"1":"0")+""); - break; - } - case Cell.CELL_TYPE_ERROR: - { - FormulaError error = FormulaError.forInt(cell.getErrorCellValue()); - - _out.write(" t=\"e\">"); - _out.write("" + error.getString() +""); - break; - } - default: - { - assert false; - throw new RuntimeException("Huh?"); - } - } - _out.write(""); - } -//Taken from jdk1.3/src/javax/swing/text/html/HTMLWriter.java - protected void outputQuotedString(String s) throws IOException - { - if(s == null || s.length() == 0) { - return; - } - - char[] chars=s.toCharArray(); - int last = 0; - int length=s.length(); - for(int counter = 0; counter < length; counter++) - { - char c = chars[counter]; - switch(c) - { - case '<': - if(counter>last) - { - _out.write(chars,last,counter-last); - } - last=counter+1; - _out.write("<"); - break; - case '>': - if(counter > last) - { - _out.write(chars,last,counter-last); - } - last=counter+1; - _out.write(">"); - break; - case '&': - if(counter>last) - { - _out.write(chars,last,counter-last); - } - last=counter+1; - _out.write("&"); - break; - case '"': - if (counter>last) - { - _out.write(chars,last,counter-last); - } - last=counter+1; - _out.write("""); - break; - // Special characters - case '\n': - if(counter>last) - { - _out.write(chars,last,counter-last); - } - _out.write(" "); - last=counter+1; - break; - case '\t': - if(counter>last) - { - _out.write(chars,last,counter-last); - } - _out.write(" "); - last=counter+1; - break; - case '\r': - if(counter>last) - { - _out.write(chars,last,counter-last); - } - _out.write(" "); - last=counter+1; - break; - case 0xa0: - if(counter>last) - { - _out.write(chars,last,counter-last); - } - _out.write(" "); - last=counter+1; - break; - default: - if(c<' '||c>127) - { - if(counter>last) - { - _out.write(chars,last,counter-last); - } - last=counter+1; - // If the character is outside of ascii, write the - // numeric value. - _out.write("&#"); - _out.write(String.valueOf((int)c)); - _out.write(";"); - } - break; - } - } - if (last + * SXSSF writes sheet data in temporary files (a temp file per-sheet) + * and the size of these temp files can grow to to a very large size, + * e.g. for a 20 MB csv data the size of the temp xml file become few GB large. + * If the "compress" flag is set to true then the temporary XML is gzipped. + *

+ *

+ * Please note the the "compress" option may cause performance penalty. + *

+ * @param compress whether to compress temp files + */ + public void setCompressTempFiles(boolean compress){ + _compressTmpFiles = compress; + } + + SheetDataWriter createSheetDataWriter() throws IOException { + if(_compressTmpFiles) { + return new GZIPSheetDataWriter(); + } else { + return new SheetDataWriter(); + } + } + XSSFSheet getXSSFSheet(SXSSFSheet sheet) { XSSFSheet result=_sxFromXHash.get(sheet); diff --git a/src/ooxml/java/org/apache/poi/xssf/streaming/SheetDataWriter.java b/src/ooxml/java/org/apache/poi/xssf/streaming/SheetDataWriter.java new file mode 100644 index 0000000000..ec733a1c98 --- /dev/null +++ b/src/ooxml/java/org/apache/poi/xssf/streaming/SheetDataWriter.java @@ -0,0 +1,300 @@ +/* + * ==================================================================== + * 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.streaming; + +import org.apache.poi.ss.usermodel.Cell; +import org.apache.poi.ss.usermodel.CellStyle; +import org.apache.poi.ss.usermodel.FormulaError; +import org.apache.poi.ss.util.CellReference; + +import java.io.*; +import java.util.Iterator; + +/** + * Initially copied from BigGridDemo "SpreadsheetWriter". + * Unlike the original code which wrote the entire document, + * this class only writes the "sheetData" document fragment + * so that it was renamed to "SheetDataWriter" + */ +public class SheetDataWriter { + private final File _fd; + private final Writer _out; + private int _rownum; + private boolean _rowContainedNullCells = false; + int _numberOfFlushedRows; + int _lowestIndexOfFlushedRows; // meaningful only of _numberOfFlushedRows>0 + int _numberOfCellsOfLastFlushedRow; // meaningful only of _numberOfFlushedRows>0 + + public SheetDataWriter() throws IOException { + _fd = createTempFile(); + _out = createWriter(_fd); + } + + /** + * Create a temp file to write sheet data. + * By default, temp files are created in the default temporary-file directory + * with a prefix "poi-sxssf-sheet" and suffix ".xml". Subclasses can override + * it and specify a different temp directory or filename or suffix, e.g. .gz + * + * @return temp file to write sheet data + */ + public File createTempFile()throws IOException { + File fd = File.createTempFile("poi-sxssf-sheet", ".xml"); + fd.deleteOnExit(); + return fd; + } + + /** + * Create a writer for the sheet data. + * + * @param fd the file to write to + * @return + */ + public Writer createWriter(File fd)throws IOException { + return new BufferedWriter(new FileWriter(fd)); + } + + /** + * flush and close the temp data writer. + * This method must be invoked before calling {@link #getWorksheetXMLInputStream()} + */ + public void close() throws IOException{ + _out.flush(); + _out.close(); + } + + File getTempFile(){ + return _fd; + } + + /** + * @return a stream to read temp file with the sheet data + */ + public InputStream getWorksheetXMLInputStream() throws IOException { + File fd = getTempFile(); + return new FileInputStream(fd); + } + + public int getNumberOfFlushedRows() { + return _numberOfFlushedRows; + } + + public int getNumberOfCellsOfLastFlushedRow() { + return _numberOfCellsOfLastFlushedRow; + } + + public int getLowestIndexOfFlushedRows() { + return _lowestIndexOfFlushedRows; + } + + protected void finalize() throws Throwable { + _fd.delete(); + } + + /** + * Write a row to the file + * + * @param rownum 0-based row number + * @param row a row + */ + public void writeRow(int rownum, SXSSFRow row) throws IOException { + if (_numberOfFlushedRows == 0) + _lowestIndexOfFlushedRows = rownum; + _numberOfCellsOfLastFlushedRow = row.getLastCellNum(); + _numberOfFlushedRows++; + beginRow(rownum, row); + Iterator cells = row.allCellsIterator(); + int columnIndex = 0; + while (cells.hasNext()) { + writeCell(columnIndex++, cells.next()); + } + endRow(); + } + + void beginRow(int rownum, SXSSFRow row) throws IOException { + _out.write("\n"); + } + + public void writeCell(int columnIndex, Cell cell) throws IOException { + if (cell == null) { + _rowContainedNullCells = true; + return; + } + String ref = new CellReference(_rownum, columnIndex).formatAsString(); + _out.write(""); + break; + } + case Cell.CELL_TYPE_FORMULA: { + _out.write(">"); + _out.write(""); + outputQuotedString(cell.getCellFormula()); + _out.write(""); + switch (cell.getCachedFormulaResultType()) { + case Cell.CELL_TYPE_NUMERIC: + double nval = cell.getNumericCellValue(); + if (!Double.isNaN(nval)) { + _out.write("" + nval + ""); + } + break; + } + break; + } + case Cell.CELL_TYPE_STRING: { + _out.write(" t=\"inlineStr\">"); + _out.write(""); + outputQuotedString(cell.getStringCellValue()); + _out.write(""); + break; + } + case Cell.CELL_TYPE_NUMERIC: { + _out.write(" t=\"n\">"); + _out.write("" + cell.getNumericCellValue() + ""); + break; + } + case Cell.CELL_TYPE_BOOLEAN: { + _out.write(" t=\"b\">"); + _out.write("" + (cell.getBooleanCellValue() ? "1" : "0") + ""); + break; + } + case Cell.CELL_TYPE_ERROR: { + FormulaError error = FormulaError.forInt(cell.getErrorCellValue()); + + _out.write(" t=\"e\">"); + _out.write("" + error.getString() + ""); + break; + } + default: { + assert false; + throw new RuntimeException("Huh?"); + } + } + _out.write(""); + } + + //Taken from jdk1.3/src/javax/swing/text/html/HTMLWriter.java + protected void outputQuotedString(String s) throws IOException { + if (s == null || s.length() == 0) { + return; + } + + char[] chars = s.toCharArray(); + int last = 0; + int length = s.length(); + for (int counter = 0; counter < length; counter++) { + char c = chars[counter]; + switch (c) { + case '<': + if (counter > last) { + _out.write(chars, last, counter - last); + } + last = counter + 1; + _out.write("<"); + break; + case '>': + if (counter > last) { + _out.write(chars, last, counter - last); + } + last = counter + 1; + _out.write(">"); + break; + case '&': + if (counter > last) { + _out.write(chars, last, counter - last); + } + last = counter + 1; + _out.write("&"); + break; + case '"': + if (counter > last) { + _out.write(chars, last, counter - last); + } + last = counter + 1; + _out.write("""); + break; + // Special characters + case '\n': + if (counter > last) { + _out.write(chars, last, counter - last); + } + _out.write(" "); + last = counter + 1; + break; + case '\t': + if (counter > last) { + _out.write(chars, last, counter - last); + } + _out.write(" "); + last = counter + 1; + break; + case '\r': + if (counter > last) { + _out.write(chars, last, counter - last); + } + _out.write(" "); + last = counter + 1; + break; + case 0xa0: + if (counter > last) { + _out.write(chars, last, counter - last); + } + _out.write(" "); + last = counter + 1; + break; + default: + if (c < ' ' || c > 127) { + if (counter > last) { + _out.write(chars, last, counter - last); + } + last = counter + 1; + // If the character is outside of ascii, write the + // numeric value. + _out.write("&#"); + _out.write(String.valueOf((int) c)); + _out.write(";"); + } + break; + } + } + if (last < length) { + _out.write(chars, last, length - last); + } + } +} diff --git a/src/ooxml/testcases/org/apache/poi/xssf/streaming/TestSXSSFCell.java b/src/ooxml/testcases/org/apache/poi/xssf/streaming/TestSXSSFCell.java new file mode 100644 index 0000000000..119a51ee5d --- /dev/null +++ b/src/ooxml/testcases/org/apache/poi/xssf/streaming/TestSXSSFCell.java @@ -0,0 +1,77 @@ +/* + * ==================================================================== + * 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.streaming; + +import org.apache.poi.ss.usermodel.*; +import org.apache.poi.xssf.SXSSFITestDataProvider; + +/** + * + */ +public class TestSXSSFCell extends BaseTestCell { + + public TestSXSSFCell() { + super(SXSSFITestDataProvider.instance); + } + + /** + * this test involves evaluation of formulas which isn't supported for SXSSF + */ + @Override + public void testConvertStringFormulaCell() { + try { + super.testConvertStringFormulaCell(); + fail("expected exception"); + } catch (IllegalArgumentException e){ + assertEquals( + "Unexpected type of cell: class org.apache.poi.xssf.streaming.SXSSFCell. " + + "Only XSSFCells can be evaluated.", e.getMessage()); + } + } + + /** + * this test involves evaluation of formulas which isn't supported for SXSSF + */ + @Override + public void testSetTypeStringOnFormulaCell() { + try { + super.testSetTypeStringOnFormulaCell(); + fail("expected exception"); + } catch (IllegalArgumentException e){ + assertEquals( + "Unexpected type of cell: class org.apache.poi.xssf.streaming.SXSSFCell. " + + "Only XSSFCells can be evaluated.", e.getMessage()); + } + } + + public void testXmlEncoding(){ + Workbook wb = _testDataProvider.createWorkbook(); + Sheet sh = wb.createSheet(); + Row row = sh.createRow(0); + Cell cell = row.createCell(0); + String sval = "<>\t\r\n\u00a0 &\"POI\'\u2122"; + cell.setCellValue(sval); + + wb = _testDataProvider.writeOutAndReadBack(wb); + + assertEquals(sval, wb.getSheetAt(0).getRow(0).getCell(0).getStringCellValue()); + + } +} diff --git a/src/ooxml/testcases/org/apache/poi/xssf/streaming/TestSXSSFHyperlink.java b/src/ooxml/testcases/org/apache/poi/xssf/streaming/TestSXSSFHyperlink.java new file mode 100644 index 0000000000..7184e51c1f --- /dev/null +++ b/src/ooxml/testcases/org/apache/poi/xssf/streaming/TestSXSSFHyperlink.java @@ -0,0 +1,36 @@ +/* + * ==================================================================== + * 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.streaming; + +import org.apache.poi.ss.usermodel.BaseTestHyperlink; +import org.apache.poi.xssf.SXSSFITestDataProvider; + +/** + * Test setting hyperlinks in SXSSF + * + * @author Yegor Kozlov + */ +public class TestSXSSFHyperlink extends BaseTestHyperlink { + + public TestSXSSFHyperlink() { + super(SXSSFITestDataProvider.instance); + } + +} \ No newline at end of file diff --git a/src/ooxml/testcases/org/apache/poi/xssf/streaming/TestSXSSFRow.java b/src/ooxml/testcases/org/apache/poi/xssf/streaming/TestSXSSFRow.java new file mode 100644 index 0000000000..2a3e06991c --- /dev/null +++ b/src/ooxml/testcases/org/apache/poi/xssf/streaming/TestSXSSFRow.java @@ -0,0 +1,33 @@ +/* + * ==================================================================== + * 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.streaming; + +import org.apache.poi.ss.usermodel.BaseTestRow; +import org.apache.poi.xssf.SXSSFITestDataProvider; + +/** + * Tests for XSSFRow + */ +public final class TestSXSSFRow extends BaseTestRow { + + public TestSXSSFRow() { + super(SXSSFITestDataProvider.instance); + } +} diff --git a/src/ooxml/testcases/org/apache/poi/xssf/streaming/TestSXSSFSheet.java b/src/ooxml/testcases/org/apache/poi/xssf/streaming/TestSXSSFSheet.java new file mode 100644 index 0000000000..f9d8fc09f2 --- /dev/null +++ b/src/ooxml/testcases/org/apache/poi/xssf/streaming/TestSXSSFSheet.java @@ -0,0 +1,86 @@ +/* + * ==================================================================== + * 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.streaming; + +import org.apache.poi.ss.usermodel.BaseTestSheet; +import org.apache.poi.xssf.SXSSFITestDataProvider; + + +public class TestSXSSFSheet extends BaseTestSheet { + + public TestSXSSFSheet() { + super(SXSSFITestDataProvider.instance); + } + + /** + * cloning of sheets is not supported in SXSSF + */ + @Override + public void testCloneSheet() { + try { + super.testCloneSheet(); + fail("expected exception"); + } catch (RuntimeException e){ + assertEquals("NotImplemented", e.getMessage()); + } + } + + @Override + public void testCloneSheetMultipleTimes() { + try { + super.testCloneSheetMultipleTimes(); + fail("expected exception"); + } catch (RuntimeException e){ + assertEquals("NotImplemented", e.getMessage()); + } + } + /** + * shifting rows is not supported in SXSSF + */ + @Override + public void testShiftMerged(){ + try { + super.testShiftMerged(); + fail("expected exception"); + } catch (RuntimeException e){ + assertEquals("NotImplemented", e.getMessage()); + } + } + + /** + * Bug 35084: cloning cells with formula + * + * The test is disabled because cloning of sheets is not supported in SXSSF + */ + @Override + public void test35084(){ + try { + super.test35084(); + fail("expected exception"); + } catch (RuntimeException e){ + assertEquals("NotImplemented", e.getMessage()); + } + } + + @Override + public void testDefaultColumnStyle() { + //TODO column styles are not yet supported by XSSF + } +} diff --git a/src/ooxml/testcases/org/apache/poi/xssf/streaming/TestSXSSFWorkbook.java b/src/ooxml/testcases/org/apache/poi/xssf/streaming/TestSXSSFWorkbook.java new file mode 100644 index 0000000000..6d7d127e98 --- /dev/null +++ b/src/ooxml/testcases/org/apache/poi/xssf/streaming/TestSXSSFWorkbook.java @@ -0,0 +1,200 @@ +/* + * ==================================================================== + * 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.streaming; + +import org.apache.poi.ss.usermodel.*; +import org.apache.poi.ss.util.CellReference; +import org.apache.poi.xssf.SXSSFITestDataProvider; +import org.apache.poi.xssf.usermodel.XSSFWorkbook; + +import java.io.File; + +public final class TestSXSSFWorkbook extends BaseTestWorkbook { + + public TestSXSSFWorkbook() { + super(SXSSFITestDataProvider.instance); + } + + /** + * cloning of sheets is not supported in SXSSF + */ + @Override + public void testCloneSheet() { + try { + super.testCloneSheet(); + fail("expected exception"); + } catch (RuntimeException e){ + assertEquals("NotImplemented", e.getMessage()); + } + } + + /** + * this test involves evaluation of formulas which isn't supported for SXSSF + */ + @Override + public void testSetSheetName() { + try { + super.testSetSheetName(); + fail("expected exception"); + } catch (Exception e){ + assertEquals( + "Unexpected type of cell: class org.apache.poi.xssf.streaming.SXSSFCell. " + + "Only XSSFCells can be evaluated.", e.getMessage()); + } + } + + public void testExistingWorkbook() { + XSSFWorkbook xssfWorkbook = new XSSFWorkbook(); + xssfWorkbook.createSheet("S1"); + SXSSFWorkbook wb = new SXSSFWorkbook(xssfWorkbook); + xssfWorkbook = (XSSFWorkbook) SXSSFITestDataProvider.instance.writeOutAndReadBack(wb); + wb = new SXSSFWorkbook(xssfWorkbook); + assertEquals(1, wb.getNumberOfSheets()); + Sheet sheet = wb.getSheetAt(0); + assertNotNull(sheet); + assertEquals("S1", sheet.getSheetName()); + } + + public void testAddToExistingWorkbook() { + XSSFWorkbook xssfWorkbook = new XSSFWorkbook(); + xssfWorkbook.createSheet("S1"); + Sheet sheet = xssfWorkbook.createSheet("S2"); + Row row = sheet.createRow(1); + Cell cell = row.createCell(1); + cell.setCellValue("value 2_1_1"); + SXSSFWorkbook wb = new SXSSFWorkbook(xssfWorkbook); + xssfWorkbook = (XSSFWorkbook) SXSSFITestDataProvider.instance.writeOutAndReadBack(wb); + wb = new SXSSFWorkbook(xssfWorkbook); + + // Add a row to the existing empty sheet + Sheet sheet1 = wb.getSheetAt(0); + Row row1_1 = sheet1.createRow(1); + Cell cell1_1_1 = row1_1.createCell(1); + cell1_1_1.setCellValue("value 1_1_1"); + + // Add a row to the existing non-empty sheet + Sheet sheet2 = wb.getSheetAt(1); + Row row2_2 = sheet2.createRow(2); + Cell cell2_2_1 = row2_2.createCell(1); + cell2_2_1.setCellValue("value 2_2_1"); + + // Add a sheet with one row + Sheet sheet3 = wb.createSheet("S3"); + Row row3_1 = sheet3.createRow(1); + Cell cell3_1_1 = row3_1.createCell(1); + cell3_1_1.setCellValue("value 3_1_1"); + + xssfWorkbook = (XSSFWorkbook) SXSSFITestDataProvider.instance.writeOutAndReadBack(wb); + assertEquals(3, xssfWorkbook.getNumberOfSheets()); + // Verify sheet 1 + sheet1 = xssfWorkbook.getSheetAt(0); + assertEquals("S1", sheet1.getSheetName()); + assertEquals(1, sheet1.getPhysicalNumberOfRows()); + row1_1 = sheet1.getRow(1); + assertNotNull(row1_1); + cell1_1_1 = row1_1.getCell(1); + assertNotNull(cell1_1_1); + assertEquals("value 1_1_1", cell1_1_1.getStringCellValue()); + // Verify sheet 2 + sheet2 = xssfWorkbook.getSheetAt(1); + assertEquals("S2", sheet2.getSheetName()); + assertEquals(2, sheet2.getPhysicalNumberOfRows()); + Row row2_1 = sheet2.getRow(1); + assertNotNull(row2_1); + Cell cell2_1_1 = row2_1.getCell(1); + assertNotNull(cell2_1_1); + assertEquals("value 2_1_1", cell2_1_1.getStringCellValue()); + row2_2 = sheet2.getRow(2); + assertNotNull(row2_2); + cell2_2_1 = row2_2.getCell(1); + assertNotNull(cell2_2_1); + assertEquals("value 2_2_1", cell2_2_1.getStringCellValue()); + // Verify sheet 3 + sheet3 = xssfWorkbook.getSheetAt(2); + assertEquals("S3", sheet3.getSheetName()); + assertEquals(1, sheet3.getPhysicalNumberOfRows()); + row3_1 = sheet3.getRow(1); + assertNotNull(row3_1); + cell3_1_1 = row3_1.getCell(1); + assertNotNull(cell3_1_1); + assertEquals("value 3_1_1", cell3_1_1.getStringCellValue()); + } + + public void testSheetdataWriter(){ + SXSSFWorkbook wb = new SXSSFWorkbook(); + SXSSFSheet sh = (SXSSFSheet)wb.createSheet(); + SheetDataWriter wr = sh.getSheetDataWriter(); + assertTrue(wr.getClass() == SheetDataWriter.class); + File tmp = wr.getTempFile(); + assertTrue(tmp.getName().startsWith("poi-sxssf-sheet")); + assertTrue(tmp.getName().endsWith(".xml")); + + wb = new SXSSFWorkbook(); + wb.setCompressTempFiles(true); + sh = (SXSSFSheet)wb.createSheet(); + wr = sh.getSheetDataWriter(); + assertTrue(wr.getClass() == GZIPSheetDataWriter.class); + tmp = wr.getTempFile(); + assertTrue(tmp.getName().startsWith("poi-sxssf-sheet-xml")); + assertTrue(tmp.getName().endsWith(".gz")); + } + + public void testGZipSheetdataWriter(){ + Workbook wb = new SXSSFWorkbook(); + ((SXSSFWorkbook)wb).setCompressTempFiles(true); + int rowNum = 10000; + int sheetNum = 5; + for(int i = 0; i < sheetNum; i++){ + Sheet sh = wb.createSheet("sheet" + i); + for(int j = 0; j < rowNum; j++){ + Row row = sh.createRow(j); + Cell cell1 = row.createCell(0); + cell1.setCellValue(new CellReference(cell1).formatAsString()); + + Cell cell2 = row.createCell(1); + cell2.setCellValue(i); + + Cell cell3 = row.createCell(2); + cell3.setCellValue(j); + } + } + + wb = SXSSFITestDataProvider.instance.writeOutAndReadBack(wb); + for(int i = 0; i < sheetNum; i++){ + Sheet sh = wb.getSheetAt(i); + assertEquals("sheet" + i, sh.getSheetName()); + for(int j = 0; j < rowNum; j++){ + Row row = sh.getRow(j); + assertNotNull("row[" + j + "]", row); + Cell cell1 = row.getCell(0); + assertEquals(new CellReference(cell1).formatAsString(), cell1.getStringCellValue()); + + Cell cell2 = row.getCell(1); + assertEquals(i, (int)cell2.getNumericCellValue()); + + Cell cell3 = row.getCell(2); + assertEquals(j, (int)cell3.getNumericCellValue()); + } + } + + + } + +} diff --git a/src/ooxml/testcases/org/apache/poi/xssf/usermodel/streaming/TestSXSSFCell.java b/src/ooxml/testcases/org/apache/poi/xssf/usermodel/streaming/TestSXSSFCell.java deleted file mode 100755 index 1f1f1beccd..0000000000 --- a/src/ooxml/testcases/org/apache/poi/xssf/usermodel/streaming/TestSXSSFCell.java +++ /dev/null @@ -1,77 +0,0 @@ -/* - * ==================================================================== - * 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.streaming; - -import org.apache.poi.ss.usermodel.*; -import org.apache.poi.xssf.SXSSFITestDataProvider; - -/** - * - */ -public class TestSXSSFCell extends BaseTestCell { - - public TestSXSSFCell() { - super(SXSSFITestDataProvider.instance); - } - - /** - * this test involves evaluation of formulas which isn't supported for SXSSF - */ - @Override - public void testConvertStringFormulaCell() { - try { - super.testConvertStringFormulaCell(); - fail("expected exception"); - } catch (IllegalArgumentException e){ - assertEquals( - "Unexpected type of cell: class org.apache.poi.xssf.streaming.SXSSFCell. " + - "Only XSSFCells can be evaluated.", e.getMessage()); - } - } - - /** - * this test involves evaluation of formulas which isn't supported for SXSSF - */ - @Override - public void testSetTypeStringOnFormulaCell() { - try { - super.testSetTypeStringOnFormulaCell(); - fail("expected exception"); - } catch (IllegalArgumentException e){ - assertEquals( - "Unexpected type of cell: class org.apache.poi.xssf.streaming.SXSSFCell. " + - "Only XSSFCells can be evaluated.", e.getMessage()); - } - } - - public void testXmlEncoding(){ - Workbook wb = _testDataProvider.createWorkbook(); - Sheet sh = wb.createSheet(); - Row row = sh.createRow(0); - Cell cell = row.createCell(0); - String sval = "<>\t\r\n\u00a0 &\"POI\'\u2122"; - cell.setCellValue(sval); - - wb = _testDataProvider.writeOutAndReadBack(wb); - - assertEquals(sval, wb.getSheetAt(0).getRow(0).getCell(0).getStringCellValue()); - - } -} diff --git a/src/ooxml/testcases/org/apache/poi/xssf/usermodel/streaming/TestSXSSFHyperlink.java b/src/ooxml/testcases/org/apache/poi/xssf/usermodel/streaming/TestSXSSFHyperlink.java deleted file mode 100755 index ed8b91bac9..0000000000 --- a/src/ooxml/testcases/org/apache/poi/xssf/usermodel/streaming/TestSXSSFHyperlink.java +++ /dev/null @@ -1,37 +0,0 @@ -/* - * ==================================================================== - * 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.streaming; - -import org.apache.poi.ss.usermodel.BaseTestCell; -import org.apache.poi.ss.usermodel.BaseTestHyperlink; -import org.apache.poi.xssf.SXSSFITestDataProvider; - -/** - * Test setting hyperlinks in SXSSF - * - * @author Yegor Kozlov - */ -public class TestSXSSFHyperlink extends BaseTestHyperlink { - - public TestSXSSFHyperlink() { - super(SXSSFITestDataProvider.instance); - } - -} \ No newline at end of file diff --git a/src/ooxml/testcases/org/apache/poi/xssf/usermodel/streaming/TestSXSSFRow.java b/src/ooxml/testcases/org/apache/poi/xssf/usermodel/streaming/TestSXSSFRow.java deleted file mode 100755 index 9e20fc775a..0000000000 --- a/src/ooxml/testcases/org/apache/poi/xssf/usermodel/streaming/TestSXSSFRow.java +++ /dev/null @@ -1,33 +0,0 @@ -/* - * ==================================================================== - * 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.streaming; - -import org.apache.poi.ss.usermodel.BaseTestRow; -import org.apache.poi.xssf.SXSSFITestDataProvider; - -/** - * Tests for XSSFRow - */ -public final class TestSXSSFRow extends BaseTestRow { - - public TestSXSSFRow() { - super(SXSSFITestDataProvider.instance); - } -} diff --git a/src/ooxml/testcases/org/apache/poi/xssf/usermodel/streaming/TestSXSSFSheet.java b/src/ooxml/testcases/org/apache/poi/xssf/usermodel/streaming/TestSXSSFSheet.java deleted file mode 100755 index 3feb8c29e9..0000000000 --- a/src/ooxml/testcases/org/apache/poi/xssf/usermodel/streaming/TestSXSSFSheet.java +++ /dev/null @@ -1,86 +0,0 @@ -/* - * ==================================================================== - * 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.streaming; - -import org.apache.poi.ss.usermodel.BaseTestSheet; -import org.apache.poi.xssf.SXSSFITestDataProvider; - - -public class TestSXSSFSheet extends BaseTestSheet { - - public TestSXSSFSheet() { - super(SXSSFITestDataProvider.instance); - } - - /** - * cloning of sheets is not supported in SXSSF - */ - @Override - public void testCloneSheet() { - try { - super.testCloneSheet(); - fail("expected exception"); - } catch (RuntimeException e){ - assertEquals("NotImplemented", e.getMessage()); - } - } - - @Override - public void testCloneSheetMultipleTimes() { - try { - super.testCloneSheetMultipleTimes(); - fail("expected exception"); - } catch (RuntimeException e){ - assertEquals("NotImplemented", e.getMessage()); - } - } - /** - * shifting rows is not supported in SXSSF - */ - @Override - public void testShiftMerged(){ - try { - super.testShiftMerged(); - fail("expected exception"); - } catch (RuntimeException e){ - assertEquals("NotImplemented", e.getMessage()); - } - } - - /** - * Bug 35084: cloning cells with formula - * - * The test is disabled because cloning of sheets is not supported in SXSSF - */ - @Override - public void test35084(){ - try { - super.test35084(); - fail("expected exception"); - } catch (RuntimeException e){ - assertEquals("NotImplemented", e.getMessage()); - } - } - - @Override - public void testDefaultColumnStyle() { - //TODO column styles are not yet supported by XSSF - } -} diff --git a/src/ooxml/testcases/org/apache/poi/xssf/usermodel/streaming/TestSXSSFWorkbook.java b/src/ooxml/testcases/org/apache/poi/xssf/usermodel/streaming/TestSXSSFWorkbook.java deleted file mode 100755 index c8b5b61787..0000000000 --- a/src/ooxml/testcases/org/apache/poi/xssf/usermodel/streaming/TestSXSSFWorkbook.java +++ /dev/null @@ -1,140 +0,0 @@ -/* - * ==================================================================== - * 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.streaming; - -import org.apache.poi.ss.usermodel.BaseTestWorkbook; -import org.apache.poi.ss.usermodel.Cell; -import org.apache.poi.ss.usermodel.Row; -import org.apache.poi.ss.usermodel.Sheet; -import org.apache.poi.xssf.SXSSFITestDataProvider; -import org.apache.poi.xssf.streaming.SXSSFWorkbook; -import org.apache.poi.xssf.usermodel.XSSFWorkbook; - -public final class TestSXSSFWorkbook extends BaseTestWorkbook { - - public TestSXSSFWorkbook() { - super(SXSSFITestDataProvider.instance); - } - - /** - * cloning of sheets is not supported in SXSSF - */ - @Override - public void testCloneSheet() { - try { - super.testCloneSheet(); - fail("expected exception"); - } catch (RuntimeException e){ - assertEquals("NotImplemented", e.getMessage()); - } - } - - /** - * this test involves evaluation of formulas which isn't supported for SXSSF - */ - @Override - public void testSetSheetName() { - try { - super.testSetSheetName(); - fail("expected exception"); - } catch (Exception e){ - assertEquals( - "Unexpected type of cell: class org.apache.poi.xssf.streaming.SXSSFCell. " + - "Only XSSFCells can be evaluated.", e.getMessage()); - } - } - - public void testExistingWorkbook() { - XSSFWorkbook xssfWorkbook = new XSSFWorkbook(); - xssfWorkbook.createSheet("S1"); - SXSSFWorkbook wb = new SXSSFWorkbook(xssfWorkbook); - xssfWorkbook = (XSSFWorkbook) SXSSFITestDataProvider.instance.writeOutAndReadBack(wb); - wb = new SXSSFWorkbook(xssfWorkbook); - assertEquals(1, wb.getNumberOfSheets()); - Sheet sheet = wb.getSheetAt(0); - assertNotNull(sheet); - assertEquals("S1", sheet.getSheetName()); - } - - public void testAddToExistingWorkbook() { - XSSFWorkbook xssfWorkbook = new XSSFWorkbook(); - xssfWorkbook.createSheet("S1"); - Sheet sheet = xssfWorkbook.createSheet("S2"); - Row row = sheet.createRow(1); - Cell cell = row.createCell(1); - cell.setCellValue("value 2_1_1"); - SXSSFWorkbook wb = new SXSSFWorkbook(xssfWorkbook); - xssfWorkbook = (XSSFWorkbook) SXSSFITestDataProvider.instance.writeOutAndReadBack(wb); - wb = new SXSSFWorkbook(xssfWorkbook); - - // Add a row to the existing empty sheet - Sheet sheet1 = wb.getSheetAt(0); - Row row1_1 = sheet1.createRow(1); - Cell cell1_1_1 = row1_1.createCell(1); - cell1_1_1.setCellValue("value 1_1_1"); - - // Add a row to the existing non-empty sheet - Sheet sheet2 = wb.getSheetAt(1); - Row row2_2 = sheet2.createRow(2); - Cell cell2_2_1 = row2_2.createCell(1); - cell2_2_1.setCellValue("value 2_2_1"); - - // Add a sheet with one row - Sheet sheet3 = wb.createSheet("S3"); - Row row3_1 = sheet3.createRow(1); - Cell cell3_1_1 = row3_1.createCell(1); - cell3_1_1.setCellValue("value 3_1_1"); - - xssfWorkbook = (XSSFWorkbook) SXSSFITestDataProvider.instance.writeOutAndReadBack(wb); - assertEquals(3, xssfWorkbook.getNumberOfSheets()); - // Verify sheet 1 - sheet1 = xssfWorkbook.getSheetAt(0); - assertEquals("S1", sheet1.getSheetName()); - assertEquals(1, sheet1.getPhysicalNumberOfRows()); - row1_1 = sheet1.getRow(1); - assertNotNull(row1_1); - cell1_1_1 = row1_1.getCell(1); - assertNotNull(cell1_1_1); - assertEquals("value 1_1_1", cell1_1_1.getStringCellValue()); - // Verify sheet 2 - sheet2 = xssfWorkbook.getSheetAt(1); - assertEquals("S2", sheet2.getSheetName()); - assertEquals(2, sheet2.getPhysicalNumberOfRows()); - Row row2_1 = sheet2.getRow(1); - assertNotNull(row2_1); - Cell cell2_1_1 = row2_1.getCell(1); - assertNotNull(cell2_1_1); - assertEquals("value 2_1_1", cell2_1_1.getStringCellValue()); - row2_2 = sheet2.getRow(2); - assertNotNull(row2_2); - cell2_2_1 = row2_2.getCell(1); - assertNotNull(cell2_2_1); - assertEquals("value 2_2_1", cell2_2_1.getStringCellValue()); - // Verify sheet 3 - sheet3 = xssfWorkbook.getSheetAt(2); - assertEquals("S3", sheet3.getSheetName()); - assertEquals(1, sheet3.getPhysicalNumberOfRows()); - row3_1 = sheet3.getRow(1); - assertNotNull(row3_1); - cell3_1_1 = row3_1.getCell(1); - assertNotNull(cell3_1_1); - assertEquals("value 3_1_1", cell3_1_1.getStringCellValue()); - } -}