Bugzilla 51160: Initial version of SXSSF, a low memory foortprint API to produce xlsx files
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1104120 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
a3f7224e14
commit
339149dd5e
@ -34,7 +34,8 @@
|
||||
|
||||
<changes>
|
||||
<release version="3.8-beta3" date="2011-??-??">
|
||||
<action dev="poi-developers" type="add">51171 - Improved performance of opening large .xls files</action>
|
||||
<action dev="poi-developers" type="add">51160 - Initial version of SXSSF, a low memory foortprint API to produce xlsx files</action>
|
||||
<action dev="poi-developers" type="fix">51171 - Improved performance of opening large .xls files</action>
|
||||
<action dev="poi-developers" type="add">51172 - Add XWPF support for GIF pictures</action>
|
||||
<action dev="poi-developers" type="add">NPOIFS Mini Streams now support extending the underlying big block stream to fit more data</action>
|
||||
<action dev="poi-developers" type="fix">51148 - XWPFDocument now properly tracks paragraphs and tables when adding/removing them</action>
|
||||
|
@ -0,0 +1,204 @@
|
||||
/*
|
||||
* ====================================================================
|
||||
* Licensed to the Apache Software Foundation (ASF) under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership.
|
||||
* The ASF licenses this file to You under the Apache License, Version 2.0
|
||||
* (the "License"); you may not use this file except in compliance with
|
||||
* the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
* ====================================================================
|
||||
*/
|
||||
package org.apache.poi.ss.examples;
|
||||
|
||||
import org.apache.poi.ss.usermodel.*;
|
||||
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
|
||||
import org.apache.poi.ss.util.CellRangeAddress;
|
||||
import org.apache.poi.ss.util.CellReference;
|
||||
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
|
||||
import org.apache.poi.xssf.streaming.SXSSFWorkbook;
|
||||
|
||||
import java.io.FileOutputStream;
|
||||
import java.io.IOException;
|
||||
import java.util.Calendar;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
public class SSPerformanceTest {
|
||||
public static void main(String[] args) {
|
||||
if (args.length != 4) usage("need four command arguments");
|
||||
|
||||
String type = args[0];
|
||||
long timeStarted = System.currentTimeMillis();
|
||||
Workbook workBook = createWorkbook(type);
|
||||
boolean isHType = workBook instanceof HSSFWorkbook;
|
||||
|
||||
int rows = parseInt(args[1], "Failed to parse rows value as integer");
|
||||
int cols = parseInt(args[2], "Failed to parse cols value as integer");
|
||||
boolean saveFile = parseInt(args[3], "Failed to parse saveFile value as integer") != 0;
|
||||
|
||||
Map<String, CellStyle> styles = createStyles(workBook);
|
||||
|
||||
Sheet sheet = workBook.createSheet("Main Sheet");
|
||||
|
||||
Cell headerCell = sheet.createRow(0).createCell(0);
|
||||
headerCell.setCellValue("Header text is spanned across multiple cells");
|
||||
headerCell.setCellStyle(styles.get("header"));
|
||||
sheet.addMergedRegion(CellRangeAddress.valueOf("$A$1:$F$1"));
|
||||
|
||||
int sheetNo = 0;
|
||||
int rowIndexInSheet = 1;
|
||||
double value = 0;
|
||||
Calendar calendar = Calendar.getInstance();
|
||||
for (int rowIndex = 0; rowIndex < rows; rowIndex++) {
|
||||
if (isHType && sheetNo != rowIndex / 0x10000) {
|
||||
sheet = workBook.createSheet("Spillover from sheet " + (++sheetNo));
|
||||
headerCell.setCellValue("Header text is spanned across multiple cells");
|
||||
headerCell.setCellStyle(styles.get("header"));
|
||||
sheet.addMergedRegion(CellRangeAddress.valueOf("$A$1:$F$1"));
|
||||
rowIndexInSheet = 1;
|
||||
}
|
||||
|
||||
Row row = sheet.createRow(rowIndexInSheet);
|
||||
for (int colIndex = 0; colIndex < cols; colIndex++) {
|
||||
Cell cell = row.createCell(colIndex);
|
||||
String address = new CellReference(cell).formatAsString();
|
||||
switch (colIndex){
|
||||
case 0:
|
||||
// column A: default number format
|
||||
cell.setCellValue(value++);
|
||||
break;
|
||||
case 1:
|
||||
// column B: #,##0
|
||||
cell.setCellValue(value++);
|
||||
cell.setCellStyle(styles.get("#,##0.00"));
|
||||
break;
|
||||
case 2:
|
||||
// column C: $#,##0.00
|
||||
cell.setCellValue(value++);
|
||||
cell.setCellStyle(styles.get("$#,##0.00"));
|
||||
break;
|
||||
case 3:
|
||||
// column D: red bold text on yellow background
|
||||
cell.setCellValue(address);
|
||||
cell.setCellStyle(styles.get("red-bold"));
|
||||
break;
|
||||
case 4:
|
||||
// column E: boolean
|
||||
// TODO booleans are shown as 1/0 instead of TRUE/FALSE
|
||||
cell.setCellValue(rowIndex % 2 == 0);
|
||||
break;
|
||||
case 5:
|
||||
// column F: date / time
|
||||
cell.setCellValue(calendar);
|
||||
cell.setCellStyle(styles.get("m/d/yyyy"));
|
||||
calendar.roll(Calendar.DAY_OF_YEAR, -1);
|
||||
break;
|
||||
case 6:
|
||||
// column F: formula
|
||||
// TODO formulas are not yet supported in SXSSF
|
||||
//cell.setCellFormula("SUM(A" + (rowIndex+1) + ":E" + (rowIndex+1)+ ")");
|
||||
//break;
|
||||
default:
|
||||
cell.setCellValue(value++);
|
||||
break;
|
||||
}
|
||||
}
|
||||
rowIndexInSheet++;
|
||||
}
|
||||
if (saveFile) {
|
||||
String fileName = type + "_" + rows + "_" + cols + "." + getFileSuffix(args[0]);
|
||||
try {
|
||||
FileOutputStream out = new FileOutputStream(fileName);
|
||||
workBook.write(out);
|
||||
out.close();
|
||||
} catch (IOException ioe) {
|
||||
System.err.println("Error: failed to write to file \"" + fileName + "\", reason=" + ioe.getMessage());
|
||||
}
|
||||
}
|
||||
long timeFinished = System.currentTimeMillis();
|
||||
System.out.println("Elapsed " + (timeFinished-timeStarted)/1000 + " seconds");
|
||||
}
|
||||
|
||||
static Map<String, CellStyle> createStyles(Workbook wb) {
|
||||
Map<String, CellStyle> styles = new HashMap<String, CellStyle>();
|
||||
CellStyle style;
|
||||
|
||||
Font headerFont = wb.createFont();
|
||||
headerFont.setFontHeightInPoints((short) 14);
|
||||
headerFont.setBoldweight(Font.BOLDWEIGHT_BOLD);
|
||||
style = wb.createCellStyle();
|
||||
style.setAlignment(CellStyle.ALIGN_CENTER);
|
||||
style.setVerticalAlignment(CellStyle.VERTICAL_CENTER);
|
||||
style.setFont(headerFont);
|
||||
style.setFillForegroundColor(IndexedColors.LIGHT_CORNFLOWER_BLUE.getIndex());
|
||||
style.setFillPattern(CellStyle.SOLID_FOREGROUND);
|
||||
styles.put("header", style);
|
||||
|
||||
Font monthFont = wb.createFont();
|
||||
monthFont.setFontHeightInPoints((short)12);
|
||||
monthFont.setColor(IndexedColors.RED.getIndex());
|
||||
monthFont.setBoldweight(Font.BOLDWEIGHT_BOLD);
|
||||
style = wb.createCellStyle();
|
||||
style.setAlignment(CellStyle.ALIGN_CENTER);
|
||||
style.setVerticalAlignment(CellStyle.VERTICAL_CENTER);
|
||||
style.setFillForegroundColor(IndexedColors.YELLOW.getIndex());
|
||||
style.setFillPattern(CellStyle.SOLID_FOREGROUND);
|
||||
style.setFont(monthFont);
|
||||
styles.put("red-bold", style);
|
||||
|
||||
String[] nfmt = {"#,##0.00", "$#,##0.00", "m/d/yyyy"};
|
||||
for(String fmt : nfmt){
|
||||
style = wb.createCellStyle();
|
||||
style.setDataFormat(wb.createDataFormat().getFormat(fmt));
|
||||
styles.put(fmt, style);
|
||||
}
|
||||
|
||||
return styles;
|
||||
}
|
||||
|
||||
|
||||
static void usage(String message) {
|
||||
System.err.println(message);
|
||||
System.err.println("usage: java SSPerformanceTest HSSF|XSSF|SXSSF rows cols saveFile (0|1)? ");
|
||||
System.exit(1);
|
||||
}
|
||||
|
||||
static Workbook createWorkbook(String type) {
|
||||
if ("HSSF".equals(type))
|
||||
return new HSSFWorkbook();
|
||||
else if ("XSSF".equals(type))
|
||||
return new XSSFWorkbook();
|
||||
else if ("SXSSF".equals(type))
|
||||
return new SXSSFWorkbook();
|
||||
else
|
||||
usage("Unknown type \"" + type + "\"");
|
||||
return null;
|
||||
}
|
||||
|
||||
static String getFileSuffix(String type) {
|
||||
if ("HSSF".equals(type))
|
||||
return "xls";
|
||||
else if ("XSSF".equals(type))
|
||||
return "xlsx";
|
||||
else if ("SXSSF".equals(type))
|
||||
return "xlsx";
|
||||
return null;
|
||||
}
|
||||
|
||||
static int parseInt(String value, String msg) {
|
||||
try {
|
||||
return Integer.parseInt(value);
|
||||
} catch (NumberFormatException e) {
|
||||
usage(msg);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
}
|
1013
src/ooxml/java/org/apache/poi/xssf/streaming/SXSSFCell.java
Normal file
1013
src/ooxml/java/org/apache/poi/xssf/streaming/SXSSFCell.java
Normal file
File diff suppressed because it is too large
Load Diff
388
src/ooxml/java/org/apache/poi/xssf/streaming/SXSSFRow.java
Normal file
388
src/ooxml/java/org/apache/poi/xssf/streaming/SXSSFRow.java
Normal file
@ -0,0 +1,388 @@
|
||||
/* ====================================================================
|
||||
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.Row;
|
||||
import org.apache.poi.ss.usermodel.Sheet;
|
||||
|
||||
import java.util.Iterator;
|
||||
import java.util.NoSuchElementException;
|
||||
|
||||
/**
|
||||
* Streaming version of XSSFRow implementing the "BigGridDemo" strategy.
|
||||
*
|
||||
* @author Alex Geller, Four J's Development Tools
|
||||
*/
|
||||
public class SXSSFRow implements Row
|
||||
{
|
||||
SXSSFSheet _sheet;
|
||||
SXSSFCell[] _cells;
|
||||
int _maxColumn=-1;
|
||||
short _height=-1;
|
||||
//TODO: Need to set the correct default value for _zHeight
|
||||
boolean _zHeight;
|
||||
|
||||
public SXSSFRow(SXSSFSheet sheet, int initialSize)
|
||||
{
|
||||
_sheet=sheet;
|
||||
_cells=new SXSSFCell[initialSize];
|
||||
}
|
||||
public Iterator<Cell> allCellsIterator()
|
||||
{
|
||||
return new CellIterator();
|
||||
}
|
||||
public boolean hasCustomHeight()
|
||||
{
|
||||
return _height!=-1;
|
||||
}
|
||||
//begin of interface implementation
|
||||
public Iterator<Cell> iterator()
|
||||
{
|
||||
return new FilledCellIterator();
|
||||
}
|
||||
|
||||
/**
|
||||
* Use this to create new cells within the row and return it.
|
||||
* <p>
|
||||
* The cell that is returned is a {@link Cell#CELL_TYPE_BLANK}. The type can be changed
|
||||
* either through calling <code>setCellValue</code> or <code>setCellType</code>.
|
||||
*
|
||||
* @param column - the column number this cell represents
|
||||
* @return Cell a high level representation of the created cell.
|
||||
* @throws IllegalArgumentException if columnIndex < 0 or greater than the maximum number of supported columns
|
||||
* (255 for *.xls, 1048576 for *.xlsx)
|
||||
*/
|
||||
public Cell createCell(int column)
|
||||
{
|
||||
return createCell(column,Cell.CELL_TYPE_BLANK);
|
||||
}
|
||||
|
||||
/**
|
||||
* Use this to create new cells within the row and return it.
|
||||
* <p>
|
||||
* The cell that is returned is a {@link Cell#CELL_TYPE_BLANK}. The type can be changed
|
||||
* either through calling setCellValue or setCellType.
|
||||
*
|
||||
* @param column - the column number this cell represents
|
||||
* @return Cell a high level representation of the created cell.
|
||||
* @throws IllegalArgumentException if columnIndex < 0 or greate than a maximum number of supported columns
|
||||
* (255 for *.xls, 1048576 for *.xlsx)
|
||||
*/
|
||||
public Cell createCell(int column, int type)
|
||||
{
|
||||
if(column>=_cells.length)
|
||||
{
|
||||
SXSSFCell[] newCells=new SXSSFCell[Math.max(column+1,_cells.length*2)];
|
||||
System.arraycopy(_cells,0,newCells,0,_cells.length);
|
||||
_cells=newCells;
|
||||
}
|
||||
_cells[column]=new SXSSFCell(this,type);
|
||||
if(column>_maxColumn) _maxColumn=column;
|
||||
return _cells[column];
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove the Cell from this row.
|
||||
*
|
||||
* @param cell the cell to remove
|
||||
*/
|
||||
public void removeCell(Cell cell)
|
||||
{
|
||||
int index=getCellIndex(cell);
|
||||
if(index>=0)
|
||||
{
|
||||
_cells[index]=null;
|
||||
while(_maxColumn>=0&&_cells[_maxColumn]==null) _maxColumn--;
|
||||
}
|
||||
}
|
||||
|
||||
int getCellIndex(Cell cell)
|
||||
{
|
||||
for(int i=0;i<=_maxColumn;i++)
|
||||
{
|
||||
if(_cells[i]==cell) return i;
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the row number of this row.
|
||||
*
|
||||
* @param rowNum the row number (0-based)
|
||||
* @throws IllegalArgumentException if rowNum < 0
|
||||
*/
|
||||
public void setRowNum(int rowNum)
|
||||
{
|
||||
_sheet.changeRowNum(this,rowNum);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get row number this row represents
|
||||
*
|
||||
* @return the row number (0 based)
|
||||
*/
|
||||
public int getRowNum()
|
||||
{
|
||||
return _sheet.getRowNum(this);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the cell representing a given column (logical cell) 0-based. If you
|
||||
* ask for a cell that is not defined....you get a null.
|
||||
*
|
||||
* @param cellnum 0 based column number
|
||||
* @return Cell representing that column or null if undefined.
|
||||
* @see #getCell(int, org.apache.poi.ss.usermodel.Row.MissingCellPolicy)
|
||||
*/
|
||||
public Cell getCell(int cellnum)
|
||||
{
|
||||
return cellnum>_maxColumn?null:_cells[cellnum];
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the cell at the given (0 based) index, with the specified {@link org.apache.poi.ss.usermodel.Row.MissingCellPolicy}
|
||||
*
|
||||
* @return the cell at the given (0 based) index
|
||||
* @throws IllegalArgumentException if cellnum < 0 or the specified MissingCellPolicy is invalid
|
||||
* @see Row#RETURN_NULL_AND_BLANK
|
||||
* @see Row#RETURN_BLANK_AS_NULL
|
||||
* @see Row#CREATE_NULL_AS_BLANK
|
||||
*/
|
||||
public Cell getCell(int cellnum, MissingCellPolicy policy)
|
||||
{
|
||||
assert false;
|
||||
Cell cell = getCell(cellnum);
|
||||
if(policy == RETURN_NULL_AND_BLANK)
|
||||
{
|
||||
return cell;
|
||||
}
|
||||
if(policy == RETURN_BLANK_AS_NULL)
|
||||
{
|
||||
if(cell == null) return cell;
|
||||
if(cell.getCellType() == Cell.CELL_TYPE_BLANK)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
return cell;
|
||||
}
|
||||
if(policy == CREATE_NULL_AS_BLANK)
|
||||
{
|
||||
if(cell == null)
|
||||
{
|
||||
return createCell(cellnum, Cell.CELL_TYPE_BLANK);
|
||||
}
|
||||
return cell;
|
||||
}
|
||||
throw new IllegalArgumentException("Illegal policy " + policy + " (" + policy.id + ")");
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the number of the first cell contained in this row.
|
||||
*
|
||||
* @return short representing the first logical cell in the row,
|
||||
* or -1 if the row does not contain any cells.
|
||||
*/
|
||||
public short getFirstCellNum()
|
||||
{
|
||||
for(int i=0;i<=_maxColumn;i++)
|
||||
if(_cells[i]!=null) return (short)i;
|
||||
return -1;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the index of the last cell contained in this row <b>PLUS ONE</b>. The result also
|
||||
* happens to be the 1-based column number of the last cell. This value can be used as a
|
||||
* standard upper bound when iterating over cells:
|
||||
* <pre>
|
||||
* short minColIx = row.getFirstCellNum();
|
||||
* short maxColIx = row.getLastCellNum();
|
||||
* for(short colIx=minColIx; colIx<maxColIx; colIx++) {
|
||||
* Cell cell = row.getCell(colIx);
|
||||
* if(cell == null) {
|
||||
* continue;
|
||||
* }
|
||||
* //... do something with cell
|
||||
* }
|
||||
* </pre>
|
||||
*
|
||||
* @return short representing the last logical cell in the row <b>PLUS ONE</b>,
|
||||
* or -1 if the row does not contain any cells.
|
||||
*/
|
||||
public short getLastCellNum()
|
||||
{
|
||||
return (short)(_maxColumn+1);
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the number of defined cells (NOT number of cells in the actual row!).
|
||||
* That is to say if only columns 0,4,5 have values then there would be 3.
|
||||
*
|
||||
* @return int representing the number of defined cells in the row.
|
||||
*/
|
||||
public int getPhysicalNumberOfCells()
|
||||
{
|
||||
int count=0;
|
||||
for(int i=0;i<=_maxColumn;i++)
|
||||
{
|
||||
if(_cells[i]!=null) count++;
|
||||
}
|
||||
return count;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the row's height or set to ff (-1) for undefined/default-height. Set the height in "twips" or
|
||||
* 1/20th of a point.
|
||||
*
|
||||
* @param height rowheight or 0xff for undefined (use sheet default)
|
||||
*/
|
||||
public void setHeight(short height)
|
||||
{
|
||||
_height=height;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set whether or not to display this row with 0 height
|
||||
*
|
||||
* @param zHeight height is zero or not.
|
||||
*/
|
||||
public void setZeroHeight(boolean zHeight)
|
||||
{
|
||||
_zHeight=zHeight;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get whether or not to display this row with 0 height
|
||||
*
|
||||
* @return - zHeight height is zero or not.
|
||||
*/
|
||||
public boolean getZeroHeight()
|
||||
{
|
||||
return _zHeight;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the row's height in points.
|
||||
*
|
||||
* @param height the height in points. <code>-1</code> resets to the default height
|
||||
*/
|
||||
public void setHeightInPoints(float height)
|
||||
{
|
||||
if(height==-1)
|
||||
_height=-1;
|
||||
else
|
||||
_height=(short)(height*20);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the row's height measured in twips (1/20th of a point). If the height is not set, the default worksheet value is returned,
|
||||
* See {@link Sheet#getDefaultRowHeightInPoints()}
|
||||
*
|
||||
* @return row height measured in twips (1/20th of a point)
|
||||
*/
|
||||
public short getHeight()
|
||||
{
|
||||
return (short)(_height==-1?getSheet().getDefaultRowHeightInPoints()*20:_height);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns row height measured in point size. If the height is not set, the default worksheet value is returned,
|
||||
* See {@link Sheet#getDefaultRowHeightInPoints()}
|
||||
*
|
||||
* @return row height measured in point size
|
||||
* @see Sheet#getDefaultRowHeightInPoints()
|
||||
*/
|
||||
public float getHeightInPoints()
|
||||
{
|
||||
return (float)(_height==-1?getSheet().getDefaultRowHeightInPoints():(float)_height/20.0);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return Cell iterator of the physically defined cells. Note element 4 may
|
||||
* actually be row cell depending on how many are defined!
|
||||
*/
|
||||
public Iterator<Cell> cellIterator()
|
||||
{
|
||||
return iterator();
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the Sheet this row belongs to
|
||||
*
|
||||
* @return the Sheet that owns this row
|
||||
*/
|
||||
public Sheet getSheet()
|
||||
{
|
||||
return _sheet;
|
||||
}
|
||||
//end of interface implementation
|
||||
|
||||
|
||||
/** returns all filled cells (created via Row.createCell())*/
|
||||
public class FilledCellIterator implements Iterator<Cell>
|
||||
{
|
||||
int pos=0;
|
||||
public boolean hasNext()
|
||||
{
|
||||
return pos <= _maxColumn;
|
||||
}
|
||||
void advanceToNext()
|
||||
{
|
||||
pos++;
|
||||
while(pos<=_maxColumn&&_cells[pos]==null) pos++;
|
||||
}
|
||||
public Cell next() throws NoSuchElementException
|
||||
{
|
||||
if (hasNext())
|
||||
{
|
||||
Cell retval=_cells[pos];
|
||||
advanceToNext();
|
||||
return retval;
|
||||
}
|
||||
else
|
||||
{
|
||||
throw new NoSuchElementException();
|
||||
}
|
||||
}
|
||||
public void remove()
|
||||
{
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
}
|
||||
/** returns all cells including empty cells in which case "null" is returned*/
|
||||
public class CellIterator implements Iterator<Cell>
|
||||
{
|
||||
int pos=0;
|
||||
public boolean hasNext()
|
||||
{
|
||||
return pos <= _maxColumn;
|
||||
}
|
||||
public Cell next() throws NoSuchElementException
|
||||
{
|
||||
if (hasNext())
|
||||
return _cells[pos++];
|
||||
else
|
||||
throw new NoSuchElementException();
|
||||
}
|
||||
public void remove()
|
||||
{
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
1475
src/ooxml/java/org/apache/poi/xssf/streaming/SXSSFSheet.java
Normal file
1475
src/ooxml/java/org/apache/poi/xssf/streaming/SXSSFSheet.java
Normal file
File diff suppressed because it is too large
Load Diff
779
src/ooxml/java/org/apache/poi/xssf/streaming/SXSSFWorkbook.java
Normal file
779
src/ooxml/java/org/apache/poi/xssf/streaming/SXSSFWorkbook.java
Normal file
@ -0,0 +1,779 @@
|
||||
/* ====================================================================
|
||||
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.Workbook;
|
||||
import org.apache.poi.ss.usermodel.Sheet;
|
||||
import org.apache.poi.ss.usermodel.Font;
|
||||
import org.apache.poi.ss.usermodel.CellStyle;
|
||||
import org.apache.poi.ss.usermodel.Name;
|
||||
import org.apache.poi.ss.usermodel.DataFormat;
|
||||
import org.apache.poi.ss.usermodel.PictureData;
|
||||
import org.apache.poi.ss.usermodel.CreationHelper;
|
||||
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
|
||||
import org.apache.poi.xssf.usermodel.XSSFSheet;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.io.InputStreamReader;
|
||||
import java.io.OutputStream;
|
||||
import java.io.OutputStreamWriter;
|
||||
import java.io.FileOutputStream;
|
||||
import java.io.File;
|
||||
import java.util.List;
|
||||
import java.util.Hashtable;
|
||||
import java.util.Enumeration;
|
||||
import java.util.zip.ZipFile;
|
||||
import java.util.zip.ZipOutputStream;
|
||||
import java.util.zip.ZipEntry;
|
||||
|
||||
import org.apache.poi.ss.formula.udf.UDFFinder;
|
||||
import org.apache.poi.ss.usermodel.Row.MissingCellPolicy;
|
||||
|
||||
/**
|
||||
* Streaming version of XSSFWorkbook implementing the "BigGridDemo" strategy.
|
||||
*
|
||||
* @author Alex Geller, Four J's Development Tools
|
||||
*/
|
||||
public class SXSSFWorkbook implements Workbook
|
||||
{
|
||||
XSSFWorkbook _wb=new XSSFWorkbook();
|
||||
|
||||
Hashtable<SXSSFSheet,XSSFSheet> _sxFromXHash=new Hashtable<SXSSFSheet,XSSFSheet>();
|
||||
Hashtable<XSSFSheet,SXSSFSheet> _xFromSxHash=new Hashtable<XSSFSheet,SXSSFSheet>();
|
||||
|
||||
XSSFSheet getXSSFSheet(SXSSFSheet sheet)
|
||||
{
|
||||
XSSFSheet result=_sxFromXHash.get(sheet);
|
||||
assert result!=null;
|
||||
return result;
|
||||
}
|
||||
|
||||
SXSSFSheet getSXSSFSheet(XSSFSheet sheet)
|
||||
{
|
||||
SXSSFSheet result=_xFromSxHash.get(sheet);
|
||||
assert result!=null;
|
||||
return result;
|
||||
}
|
||||
|
||||
void registerSheetMapping(SXSSFSheet sxSheet,XSSFSheet xSheet)
|
||||
{
|
||||
_sxFromXHash.put(sxSheet,xSheet);
|
||||
_xFromSxHash.put(xSheet,sxSheet);
|
||||
}
|
||||
void deregisterSheetMapping(XSSFSheet xSheet)
|
||||
{
|
||||
SXSSFSheet sxSheet=getSXSSFSheet(xSheet);
|
||||
_sxFromXHash.remove(sxSheet);
|
||||
_xFromSxHash.remove(xSheet);
|
||||
}
|
||||
private XSSFSheet getSheetFromZipEntryName(String sheetRef)
|
||||
{
|
||||
Enumeration<XSSFSheet> sheets=_sxFromXHash.elements();
|
||||
while(sheets.hasMoreElements())
|
||||
{
|
||||
XSSFSheet sheet=sheets.nextElement();
|
||||
if(sheetRef.equals(sheet.getPackagePart().getPartName().getName().substring(1))) return sheet;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
private void injectData(File zipfile, OutputStream out) throws IOException
|
||||
{
|
||||
ZipFile zip = new ZipFile(zipfile);
|
||||
|
||||
ZipOutputStream zos = new ZipOutputStream(out);
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
Enumeration<ZipEntry> en = (Enumeration<ZipEntry>) zip.entries();
|
||||
while (en.hasMoreElements())
|
||||
{
|
||||
ZipEntry ze = en.nextElement();
|
||||
zos.putNextEntry(new ZipEntry(ze.getName()));
|
||||
InputStream is = zip.getInputStream(ze);
|
||||
XSSFSheet xSheet=getSheetFromZipEntryName(ze.getName());
|
||||
if(xSheet!=null)
|
||||
{
|
||||
SXSSFSheet sxSheet=getSXSSFSheet(xSheet);
|
||||
copyStreamAndInjectWorksheet(is,zos,sxSheet.getWorksheetXMLInputStream());
|
||||
}
|
||||
else
|
||||
{
|
||||
copyStream(is, zos);
|
||||
}
|
||||
is.close();
|
||||
}
|
||||
|
||||
zos.close();
|
||||
}
|
||||
private static void copyStream(InputStream in, OutputStream out) throws IOException {
|
||||
byte[] chunk = new byte[1024];
|
||||
int count;
|
||||
while ((count = in.read(chunk)) >=0 ) {
|
||||
out.write(chunk,0,count);
|
||||
}
|
||||
}
|
||||
private static void copyStreamAndInjectWorksheet(InputStream in, OutputStream out,InputStream worksheetData) throws IOException {
|
||||
InputStreamReader inReader=new InputStreamReader(in,"UTF-8"); //TODO: Is it always UTF-8 or do we need to read the xml encoding declaration in the file? If not, we should perhaps use a SAX reader instead.
|
||||
OutputStreamWriter outWriter=new OutputStreamWriter(out,"UTF-8");
|
||||
int c;
|
||||
int pos=0;
|
||||
String s="<sheetData/>";
|
||||
int n=s.length();
|
||||
//Copy from "in" to "out" up to the string "<sheetData/>" (excluding).
|
||||
while(((c=inReader.read())!=-1))
|
||||
{
|
||||
if(c==s.charAt(pos))
|
||||
{
|
||||
pos++;
|
||||
if(pos==n) break;
|
||||
}
|
||||
else
|
||||
{
|
||||
if(pos>0) outWriter.write(s,0,pos);
|
||||
if(c==s.charAt(0))
|
||||
{
|
||||
pos=1;
|
||||
}
|
||||
else
|
||||
{
|
||||
outWriter.write(c);
|
||||
pos=0;
|
||||
}
|
||||
}
|
||||
}
|
||||
outWriter.flush();
|
||||
//Copy the worksheet data to "out".
|
||||
copyStream(worksheetData,out);
|
||||
//Copy the rest of "in" to "out".
|
||||
while(((c=inReader.read())!=-1))
|
||||
outWriter.write(c);
|
||||
outWriter.flush();
|
||||
}
|
||||
|
||||
public XSSFWorkbook getXSSFWorkbook()
|
||||
{
|
||||
return _wb;
|
||||
}
|
||||
|
||||
//start of interface implementation
|
||||
|
||||
/**
|
||||
* Convenience method to get the active sheet. The active sheet is is the sheet
|
||||
* which is currently displayed when the workbook is viewed in Excel.
|
||||
* 'Selected' sheet(s) is a distinct concept.
|
||||
*
|
||||
* @return the index of the active sheet (0-based)
|
||||
*/
|
||||
public int getActiveSheetIndex()
|
||||
{
|
||||
return _wb.getActiveSheetIndex();
|
||||
}
|
||||
|
||||
/**
|
||||
* Convenience method to set the active sheet. The active sheet is is the sheet
|
||||
* which is currently displayed when the workbook is viewed in Excel.
|
||||
* 'Selected' sheet(s) is a distinct concept.
|
||||
*
|
||||
* @param sheetIndex index of the active sheet (0-based)
|
||||
*/
|
||||
public void setActiveSheet(int sheetIndex)
|
||||
{
|
||||
_wb.setActiveSheet(sheetIndex);
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the first tab that is displayed in the list of tabs in excel.
|
||||
*
|
||||
* @return the first tab that to display in the list of tabs (0-based).
|
||||
*/
|
||||
public int getFirstVisibleTab()
|
||||
{
|
||||
return _wb.getFirstVisibleTab();
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the first tab that is displayed in the list of tabs in excel.
|
||||
*
|
||||
* @param sheetIndex the first tab that to display in the list of tabs (0-based)
|
||||
*/
|
||||
public void setFirstVisibleTab(int sheetIndex)
|
||||
{
|
||||
_wb.setFirstVisibleTab(sheetIndex);
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the order of appearance for a given sheet.
|
||||
*
|
||||
* @param sheetname the name of the sheet to reorder
|
||||
* @param pos the position that we want to insert the sheet into (0 based)
|
||||
*/
|
||||
public void setSheetOrder(String sheetname, int pos)
|
||||
{
|
||||
_wb.setSheetOrder(sheetname,pos);
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the tab whose data is actually seen when the sheet is opened.
|
||||
* This may be different from the "selected sheet" since excel seems to
|
||||
* allow you to show the data of one sheet when another is seen "selected"
|
||||
* in the tabs (at the bottom).
|
||||
*
|
||||
* @see Sheet#setSelected(boolean)
|
||||
* @param index the index of the sheet to select (0 based)
|
||||
*/
|
||||
public void setSelectedTab(int index)
|
||||
{
|
||||
_wb.setSelectedTab(index);
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the sheet name.
|
||||
*
|
||||
* @param sheet number (0 based)
|
||||
* @throws IllegalArgumentException if the name is greater than 31 chars or contains <code>/\?*[]</code>
|
||||
*/
|
||||
public void setSheetName(int sheet, String name)
|
||||
{
|
||||
_wb.setSheetName(sheet,name);
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the sheet name
|
||||
*
|
||||
* @param sheet sheet number (0 based)
|
||||
* @return Sheet name
|
||||
*/
|
||||
public String getSheetName(int sheet)
|
||||
{
|
||||
return _wb.getSheetName(sheet);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the index of the sheet by his name
|
||||
*
|
||||
* @param name the sheet name
|
||||
* @return index of the sheet (0 based)
|
||||
*/
|
||||
public int getSheetIndex(String name)
|
||||
{
|
||||
return _wb.getSheetIndex(name);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the index of the given sheet
|
||||
*
|
||||
* @param sheet the sheet to look up
|
||||
* @return index of the sheet (0 based)
|
||||
*/
|
||||
public int getSheetIndex(Sheet sheet)
|
||||
{
|
||||
assert sheet instanceof SXSSFSheet;
|
||||
return _wb.getSheetIndex(getXSSFSheet((SXSSFSheet)sheet));
|
||||
}
|
||||
|
||||
/**
|
||||
* Sreate an Sheet for this Workbook, adds it to the sheets and returns
|
||||
* the high level representation. Use this to create new sheets.
|
||||
*
|
||||
* @return Sheet representing the new sheet.
|
||||
*/
|
||||
public Sheet createSheet()
|
||||
{
|
||||
return createAndRegisterSXSSFSheet(_wb.createSheet());
|
||||
}
|
||||
SXSSFSheet createAndRegisterSXSSFSheet(XSSFSheet xSheet)
|
||||
{
|
||||
SXSSFSheet sxSheet=null;
|
||||
try
|
||||
{
|
||||
sxSheet=new SXSSFSheet(this,xSheet);
|
||||
}
|
||||
catch (IOException ioe)
|
||||
{
|
||||
throw new RuntimeException(ioe);
|
||||
}
|
||||
registerSheetMapping(sxSheet,xSheet);
|
||||
return sxSheet;
|
||||
}
|
||||
|
||||
/**
|
||||
* Create an Sheet for this Workbook, adds it to the sheets and returns
|
||||
* the high level representation. Use this to create new sheets.
|
||||
*
|
||||
* @param sheetname sheetname to set for the sheet.
|
||||
* @return Sheet representing the new sheet.
|
||||
* @throws IllegalArgumentException if the name is greater than 31 chars or contains <code>/\?*[]</code>
|
||||
*/
|
||||
public Sheet createSheet(String sheetname)
|
||||
{
|
||||
return createAndRegisterSXSSFSheet(_wb.createSheet(sheetname));
|
||||
}
|
||||
|
||||
/**
|
||||
* Create an Sheet from an existing sheet in the Workbook.
|
||||
*
|
||||
* @return Sheet representing the cloned sheet.
|
||||
*/
|
||||
public Sheet cloneSheet(int sheetNum)
|
||||
{
|
||||
return createAndRegisterSXSSFSheet(_wb.cloneSheet(sheetNum));
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Get the number of spreadsheets in the workbook
|
||||
*
|
||||
* @return the number of sheets
|
||||
*/
|
||||
public int getNumberOfSheets()
|
||||
{
|
||||
return _wb.getNumberOfSheets();
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the Sheet object at the given index.
|
||||
*
|
||||
* @param index of the sheet number (0-based physical & logical)
|
||||
* @return Sheet at the provided index
|
||||
*/
|
||||
public Sheet getSheetAt(int index)
|
||||
{
|
||||
return getSXSSFSheet(_wb.getSheetAt(index));
|
||||
}
|
||||
|
||||
/**
|
||||
* Get sheet with the given name
|
||||
*
|
||||
* @param name of the sheet
|
||||
* @return Sheet with the name provided or <code>null</code> if it does not exist
|
||||
*/
|
||||
public Sheet getSheet(String name)
|
||||
{
|
||||
return getSXSSFSheet(_wb.getSheet(name));
|
||||
}
|
||||
|
||||
/**
|
||||
* Removes sheet at the given index
|
||||
*
|
||||
* @param index of the sheet to remove (0-based)
|
||||
*/
|
||||
public void removeSheetAt(int index)
|
||||
{
|
||||
XSSFSheet xSheet=_wb.getSheetAt(index);
|
||||
_wb.removeSheetAt(index);
|
||||
deregisterSheetMapping(xSheet);
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the repeating rows and columns for a sheet (as found in
|
||||
* File->PageSetup->Sheet). This is function is included in the workbook
|
||||
* because it creates/modifies name records which are stored at the
|
||||
* workbook level.
|
||||
* <p>
|
||||
* To set just repeating columns:
|
||||
* <pre>
|
||||
* workbook.setRepeatingRowsAndColumns(0,0,1,-1-1);
|
||||
* </pre>
|
||||
* To set just repeating rows:
|
||||
* <pre>
|
||||
* workbook.setRepeatingRowsAndColumns(0,-1,-1,0,4);
|
||||
* </pre>
|
||||
* To remove all repeating rows and columns for a sheet.
|
||||
* <pre>
|
||||
* workbook.setRepeatingRowsAndColumns(0,-1,-1,-1,-1);
|
||||
* </pre>
|
||||
*
|
||||
* @param sheetIndex 0 based index to sheet.
|
||||
* @param startColumn 0 based start of repeating columns.
|
||||
* @param endColumn 0 based end of repeating columns.
|
||||
* @param startRow 0 based start of repeating rows.
|
||||
* @param endRow 0 based end of repeating rows.
|
||||
*/
|
||||
public void setRepeatingRowsAndColumns(int sheetIndex, int startColumn, int endColumn, int startRow, int endRow)
|
||||
{
|
||||
_wb.setRepeatingRowsAndColumns(sheetIndex,startColumn,endColumn,startRow,endRow);
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a new Font and add it to the workbook's font table
|
||||
*
|
||||
* @return new font object
|
||||
*/
|
||||
public Font createFont()
|
||||
{
|
||||
return _wb.createFont();
|
||||
}
|
||||
|
||||
/**
|
||||
* Finds a font that matches the one with the supplied attributes
|
||||
*
|
||||
* @return the font with the matched attributes or <code>null</code>
|
||||
*/
|
||||
public Font findFont(short boldWeight, short color, short fontHeight, String name, boolean italic, boolean strikeout, short typeOffset, byte underline)
|
||||
{
|
||||
return _wb.findFont(boldWeight, color, fontHeight, name, italic, strikeout, typeOffset, underline);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Get the number of fonts in the font table
|
||||
*
|
||||
* @return number of fonts
|
||||
*/
|
||||
public short getNumberOfFonts()
|
||||
{
|
||||
return _wb.getNumberOfFonts();
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the font at the given index number
|
||||
*
|
||||
* @param idx index number (0-based)
|
||||
* @return font at the index
|
||||
*/
|
||||
public Font getFontAt(short idx)
|
||||
{
|
||||
return _wb.getFontAt(idx);
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a new Cell style and add it to the workbook's style table
|
||||
*
|
||||
* @return the new Cell Style object
|
||||
*/
|
||||
public CellStyle createCellStyle()
|
||||
{
|
||||
return _wb.createCellStyle();
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the number of styles the workbook contains
|
||||
*
|
||||
* @return count of cell styles
|
||||
*/
|
||||
public short getNumCellStyles()
|
||||
{
|
||||
return _wb.getNumCellStyles();
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the cell style object at the given index
|
||||
*
|
||||
* @param idx index within the set of styles (0-based)
|
||||
* @return CellStyle object at the index
|
||||
*/
|
||||
public CellStyle getCellStyleAt(short idx)
|
||||
{
|
||||
return _wb.getCellStyleAt(idx);
|
||||
}
|
||||
|
||||
/**
|
||||
* Write out this workbook to an Outputstream.
|
||||
*
|
||||
* @param stream - the java OutputStream you wish to write to
|
||||
* @exception IOException if anything can't be written.
|
||||
*/
|
||||
public void write(OutputStream stream) throws IOException
|
||||
{
|
||||
//Save the template
|
||||
File tmplFile = File.createTempFile("template", ".xlsx");
|
||||
FileOutputStream os = new FileOutputStream(tmplFile);
|
||||
_wb.write(os);
|
||||
os.close();
|
||||
|
||||
//Substitute the template entries with the generated sheet data files
|
||||
injectData(tmplFile, stream);
|
||||
tmplFile.delete();
|
||||
}
|
||||
|
||||
/**
|
||||
* @return the total number of defined names in this workbook
|
||||
*/
|
||||
public int getNumberOfNames()
|
||||
{
|
||||
return _wb.getNumberOfNames();
|
||||
}
|
||||
|
||||
/**
|
||||
* @param name the name of the defined name
|
||||
* @return the defined name with the specified name. <code>null</code> if not found.
|
||||
*/
|
||||
public Name getName(String name)
|
||||
{
|
||||
return _wb.getName(name);
|
||||
}
|
||||
/**
|
||||
* @param nameIndex position of the named range (0-based)
|
||||
* @return the defined name at the specified index
|
||||
* @throws IllegalArgumentException if the supplied index is invalid
|
||||
*/
|
||||
public Name getNameAt(int nameIndex)
|
||||
{
|
||||
return _wb.getNameAt(nameIndex);
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a new (uninitialised) defined name in this workbook
|
||||
*
|
||||
* @return new defined name object
|
||||
*/
|
||||
public Name createName()
|
||||
{
|
||||
return _wb.createName();
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the defined name index by name<br/>
|
||||
* <i>Note:</i> Excel defined names are case-insensitive and
|
||||
* this method performs a case-insensitive search.
|
||||
*
|
||||
* @param name the name of the defined name
|
||||
* @return zero based index of the defined name. <tt>-1</tt> if not found.
|
||||
*/
|
||||
public int getNameIndex(String name)
|
||||
{
|
||||
return _wb.getNameIndex(name);
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove the defined name at the specified index
|
||||
*
|
||||
* @param index named range index (0 based)
|
||||
*/
|
||||
public void removeName(int index)
|
||||
{
|
||||
_wb.removeName(index);
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove a defined name by name
|
||||
*
|
||||
* @param name the name of the defined name
|
||||
*/
|
||||
public void removeName(String name)
|
||||
{
|
||||
_wb.removeName(name);
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the printarea for the sheet provided
|
||||
* <p>
|
||||
* i.e. Reference = $A$1:$B$2
|
||||
* @param sheetIndex Zero-based sheet index (0 Represents the first sheet to keep consistent with java)
|
||||
* @param reference Valid name Reference for the Print Area
|
||||
*/
|
||||
public void setPrintArea(int sheetIndex, String reference)
|
||||
{
|
||||
_wb.setPrintArea(sheetIndex,reference);
|
||||
}
|
||||
|
||||
/**
|
||||
* For the Convenience of Java Programmers maintaining pointers.
|
||||
* @see #setPrintArea(int, String)
|
||||
* @param sheetIndex Zero-based sheet index (0 = First Sheet)
|
||||
* @param startColumn Column to begin printarea
|
||||
* @param endColumn Column to end the printarea
|
||||
* @param startRow Row to begin the printarea
|
||||
* @param endRow Row to end the printarea
|
||||
*/
|
||||
public void setPrintArea(int sheetIndex, int startColumn, int endColumn, int startRow, int endRow)
|
||||
{
|
||||
_wb.setPrintArea(sheetIndex, startColumn, endColumn, startRow, endRow);
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieves the reference for the printarea of the specified sheet,
|
||||
* the sheet name is appended to the reference even if it was not specified.
|
||||
*
|
||||
* @param sheetIndex Zero-based sheet index (0 Represents the first sheet to keep consistent with java)
|
||||
* @return String Null if no print area has been defined
|
||||
*/
|
||||
public String getPrintArea(int sheetIndex)
|
||||
{
|
||||
return _wb.getPrintArea(sheetIndex);
|
||||
}
|
||||
|
||||
/**
|
||||
* Delete the printarea for the sheet specified
|
||||
*
|
||||
* @param sheetIndex Zero-based sheet index (0 = First Sheet)
|
||||
*/
|
||||
public void removePrintArea(int sheetIndex)
|
||||
{
|
||||
_wb.removePrintArea(sheetIndex);
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieves the current policy on what to do when
|
||||
* getting missing or blank cells from a row.
|
||||
* <p>
|
||||
* The default is to return blank and null cells.
|
||||
* {@link MissingCellPolicy}
|
||||
* </p>
|
||||
*/
|
||||
public MissingCellPolicy getMissingCellPolicy()
|
||||
{
|
||||
return _wb.getMissingCellPolicy();
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the policy on what to do when
|
||||
* getting missing or blank cells from a row.
|
||||
*
|
||||
* This will then apply to all calls to
|
||||
* {@link org.apache.poi.ss.usermodel.Row#getCell(int)}. See
|
||||
* {@link MissingCellPolicy}
|
||||
*/
|
||||
public void setMissingCellPolicy(MissingCellPolicy missingCellPolicy)
|
||||
{
|
||||
_wb.setMissingCellPolicy(missingCellPolicy);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the instance of DataFormat for this workbook.
|
||||
*
|
||||
* @return the DataFormat object
|
||||
*/
|
||||
public DataFormat createDataFormat()
|
||||
{
|
||||
return _wb.createDataFormat();
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds a picture to the workbook.
|
||||
*
|
||||
* @param pictureData The bytes of the picture
|
||||
* @param format The format of the picture.
|
||||
*
|
||||
* @return the index to this picture (1 based).
|
||||
* @see #PICTURE_TYPE_EMF
|
||||
* @see #PICTURE_TYPE_WMF
|
||||
* @see #PICTURE_TYPE_PICT
|
||||
* @see #PICTURE_TYPE_JPEG
|
||||
* @see #PICTURE_TYPE_PNG
|
||||
* @see #PICTURE_TYPE_DIB
|
||||
*/
|
||||
public int addPicture(byte[] pictureData, int format)
|
||||
{
|
||||
return _wb.addPicture(pictureData,format);
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets all pictures from the Workbook.
|
||||
*
|
||||
* @return the list of pictures (a list of {@link PictureData} objects.)
|
||||
*/
|
||||
public List<? extends PictureData> getAllPictures()
|
||||
{
|
||||
return _wb.getAllPictures();
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns an object that handles instantiating concrete
|
||||
* classes of the various instances one needs for HSSF and XSSF.
|
||||
*/
|
||||
public CreationHelper getCreationHelper()
|
||||
{
|
||||
return _wb.getCreationHelper();
|
||||
}
|
||||
|
||||
/**
|
||||
* @return <code>false</code> if this workbook is not visible in the GUI
|
||||
*/
|
||||
public boolean isHidden()
|
||||
{
|
||||
return _wb.isHidden();
|
||||
}
|
||||
|
||||
/**
|
||||
* @param hiddenFlag pass <code>false</code> to make the workbook visible in the GUI
|
||||
*/
|
||||
public void setHidden(boolean hiddenFlag)
|
||||
{
|
||||
_wb.setHidden(hiddenFlag);
|
||||
}
|
||||
|
||||
/**
|
||||
* Check whether a sheet is hidden.
|
||||
* <p>
|
||||
* Note that a sheet could instead be set to be very hidden, which is different
|
||||
* ({@link #isSheetVeryHidden(int)})
|
||||
* </p>
|
||||
* @param sheetIx Number
|
||||
* @return <code>true</code> if sheet is hidden
|
||||
*/
|
||||
public boolean isSheetHidden(int sheetIx)
|
||||
{
|
||||
return _wb.isSheetHidden(sheetIx);
|
||||
}
|
||||
|
||||
/**
|
||||
* Check whether a sheet is very hidden.
|
||||
* <p>
|
||||
* This is different from the normal hidden status
|
||||
* ({@link #isSheetHidden(int)})
|
||||
* </p>
|
||||
* @param sheetIx sheet index to check
|
||||
* @return <code>true</code> if sheet is very hidden
|
||||
*/
|
||||
public boolean isSheetVeryHidden(int sheetIx)
|
||||
{
|
||||
return _wb.isSheetVeryHidden(sheetIx);
|
||||
}
|
||||
|
||||
/**
|
||||
* Hide or unhide a sheet
|
||||
*
|
||||
* @param sheetIx the sheet index (0-based)
|
||||
* @param hidden True to mark the sheet as hidden, false otherwise
|
||||
*/
|
||||
public void setSheetHidden(int sheetIx, boolean hidden)
|
||||
{
|
||||
_wb.setSheetHidden(sheetIx,hidden);
|
||||
}
|
||||
|
||||
/**
|
||||
* Hide or unhide a sheet.
|
||||
*
|
||||
* <ul>
|
||||
* <li>0 - visible. </li>
|
||||
* <li>1 - hidden. </li>
|
||||
* <li>2 - very hidden.</li>
|
||||
* </ul>
|
||||
* @param sheetIx the sheet index (0-based)
|
||||
* @param hidden one of the following <code>Workbook</code> constants:
|
||||
* <code>Workbook.SHEET_STATE_VISIBLE</code>,
|
||||
* <code>Workbook.SHEET_STATE_HIDDEN</code>, or
|
||||
* <code>Workbook.SHEET_STATE_VERY_HIDDEN</code>.
|
||||
* @throws IllegalArgumentException if the supplied sheet index or state is invalid
|
||||
*/
|
||||
public void setSheetHidden(int sheetIx, int hidden)
|
||||
{
|
||||
_wb.setSheetHidden(sheetIx,hidden);
|
||||
}
|
||||
/**
|
||||
* Register a new toolpack in this workbook.
|
||||
*
|
||||
* @param toopack the toolpack to register
|
||||
*/
|
||||
public void addToolPack(UDFFinder toopack)
|
||||
{
|
||||
_wb.addToolPack(toopack);
|
||||
}
|
||||
//end of interface implementation
|
||||
}
|
Loading…
Reference in New Issue
Block a user