<changes>
<release version="4.0-beta1" date="2013-??-??">
+ <action dev="poi-developers" type="fix">53650 - Prevent unreadable content and disalow to overwrite rows from input template in SXSSF</action>
<action dev="poi-developers" type="fix">54228,53672 - Fixed XSSF to read cells with missing R attribute</action>
<action dev="poi-developers" type="fix">54206 - Ensure that shared formuals are updated when shifting rows in a spreadsheet</action>
<action dev="poi-developers" type="fix">Synchronize table headers with parent sheet in XSSF</action>
+ ") outside allowable range (0.." + maxrow + ")");
}
+ // attempt to overwrite a row that is already flushed to disk
+ if(rownum <= _writer.getLastFlushedRow() ) {
+ throw new IllegalArgumentException(
+ "Attempting to write a row["+rownum+"] " +
+ "in the range [0," + _writer.getLastFlushedRow() + "] that is already written to disk.");
+ }
+
+ // attempt to overwrite a existing row in the input template
+ if(_sh.getPhysicalNumberOfRows() > 0 && rownum <= _sh.getLastRowNum() ) {
+ throw new IllegalArgumentException(
+ "Attempting to write a row["+rownum+"] " +
+ "in the range [0," + _sh.getLastRowNum() + "] that is already written to disk.");
+ }
+
//Make the initial allocation as big as the row above.
Row previousRow=rownum>0?getRow(rownum-1):null;
int initialAllocationSize=0;
int _numberOfFlushedRows;\r
int _lowestIndexOfFlushedRows; // meaningful only of _numberOfFlushedRows>0\r
int _numberOfCellsOfLastFlushedRow; // meaningful only of _numberOfFlushedRows>0\r
+ int _numberLastFlushedRow = -1; // meaningful only of _numberOfFlushedRows>0\r
\r
public SheetDataWriter() throws IOException {\r
_fd = createTempFile();\r
return _lowestIndexOfFlushedRows;\r
}\r
\r
+ public int getLastFlushedRow() {\r
+ return _numberLastFlushedRow;\r
+ }\r
+\r
protected void finalize() throws Throwable {\r
_fd.delete();\r
}\r
public void writeRow(int rownum, SXSSFRow row) throws IOException {\r
if (_numberOfFlushedRows == 0)\r
_lowestIndexOfFlushedRows = rownum;\r
+ _numberLastFlushedRow = Math.max(rownum, _numberLastFlushedRow);\r
_numberOfCellsOfLastFlushedRow = row.getLastCellNum();\r
_numberOfFlushedRows++;\r
beginRow(rownum, row);\r
package org.apache.poi.xssf.streaming;
-import org.apache.poi.ss.usermodel.BaseTestSheet;
+import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.SXSSFITestDataProvider;
+import org.apache.poi.xssf.usermodel.XSSFSheet;
+import org.apache.poi.xssf.usermodel.XSSFWorkbook;
public class TestSXSSFSheet extends BaseTestSheet {
public void testDefaultColumnStyle() {
//TODO column styles are not yet supported by XSSF
}
+
+ public void testOverrideFlushedRows() {
+ Workbook wb = new SXSSFWorkbook(3);
+ Sheet sheet = wb.createSheet();
+
+ sheet.createRow(1);
+ sheet.createRow(2);
+ sheet.createRow(3);
+ sheet.createRow(4);
+ try {
+ sheet.createRow(1);
+ fail("expected exception");
+ } catch (Throwable e){
+ assertEquals("Attempting to write a row[1] in the range [0,1] that is already written to disk.", e.getMessage());
+ }
+
+ }
+
+ public void testOverrideRowsInTemplate() {
+ XSSFWorkbook template = new XSSFWorkbook();
+ template.createSheet().createRow(1);
+
+ Workbook wb = new SXSSFWorkbook(template);
+ Sheet sheet = wb.getSheetAt(0);
+
+ try {
+ sheet.createRow(1);
+ fail("expected exception");
+ } catch (Throwable e){
+ assertEquals("Attempting to write a row[1] in the range [0,1] that is already written to disk.", e.getMessage());
+ }
+ try {
+ sheet.createRow(0);
+ fail("expected exception");
+ } catch (Throwable e){
+ assertEquals("Attempting to write a row[0] in the range [0,1] that is already written to disk.", e.getMessage());
+ }
+ sheet.createRow(2);
+
+ }
}