Commit bac27c01 authored by Matija Obreza's avatar Matija Obreza
Browse files

Super-streaming Excel downloads with customized SXSSF

- constructors and field access updated
parent 42f49ec2
Loading
Loading
Loading
Loading
+30 −0
Changes for src/main/java/org/apache/poi/xssf/streaming/IRowGenerator.java: 30 added lines, 0 removed lines.
Original line number Diff line number Diff line
/*
 * Copyright 2018 Global Crop Diversity Trust
 *
 * Licensed 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;

/**
 * IRowGenerator for Super-streaming XSSF sheets
 */
public interface IRowGenerator {
	
	/**
	 * Generate rows
	 *
	 * @param sheet the sheet
	 * @throws Exception the exception
	 */
	void generateRows(SXSSFSheet sheet) throws Exception;
}
+3 −1
Changes for src/main/java/org/apache/poi/xssf/streaming/SXSSFFormulaEvaluator.java: 3 added lines, 1 removed line.
Original line number Diff line number Diff line
@@ -88,7 +88,7 @@ public final class SXSSFFormulaEvaluator extends BaseXSSFFormulaEvaluator {
        
        // Check they're all available
        for (Sheet sheet : wb) {
            if (((SXSSFSheet)sheet).areAllRowsFlushed()) {
            if (sheet instanceof SXSSFSheet && ((SXSSFSheet)sheet).areAllRowsFlushed()) {
                throw new SheetsFlushedException();
            }
        }
@@ -96,12 +96,14 @@ public final class SXSSFFormulaEvaluator extends BaseXSSFFormulaEvaluator {
        // Process the sheets as best we can
        for (Sheet sheet : wb) {
            
        	if (sheet instanceof SXSSFSheet) {
	            // Check if any rows have already been flushed out
	            int lastFlushedRowNum = ((SXSSFSheet) sheet).getLastFlushedRowNum();
	            if (lastFlushedRowNum > -1) {
	                if (! skipOutOfWindow) throw new RowFlushedException(0);
	                logger.log(POILogger.INFO, "Rows up to " + lastFlushedRowNum + " have already been flushed, skipping");
	            }
        	}
        	
            // Evaluate what we have
            for (Row r : sheet) {
+3 −1
Changes for src/main/java/org/apache/poi/xssf/streaming/SXSSFPicture.java: 3 added lines, 1 removed line.
Original line number Diff line number Diff line
@@ -24,6 +24,7 @@ import org.apache.poi.openxml4j.opc.PackagePart;
import org.apache.poi.ss.usermodel.Picture;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Shape;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.util.ImageUtils;
import org.apache.poi.util.Internal;
@@ -194,7 +195,8 @@ public final class SXSSFPicture implements Picture {
        // THE FOLLOWING THREE LINES ARE THE MAIN CHANGE compared to the non-streaming version: use the SXSSF sheet,
		// not the XSSF sheet (which never contais rows when using SXSSF)
        XSSFSheet xssfSheet = getSheet();
        SXSSFSheet sheet = _wb.getSXSSFSheet(xssfSheet);
        SXSSFSheet sxSheet = _wb.getSXSSFSheet(xssfSheet);
        Sheet sheet = sxSheet == null ? xssfSheet : sxSheet;
        Row row = sheet.getRow(rowIndex);
        float height = row != null ?  row.getHeightInPoints() : sheet.getDefaultRowHeightInPoints();
        return height * Units.PIXEL_DPI / Units.POINT_DPI;
+11 −3
Changes for src/main/java/org/apache/poi/xssf/streaming/SXSSFSheet.java: 11 added lines, 3 removed lines.
Original line number Diff line number Diff line
@@ -65,15 +65,23 @@ import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTWorksheet;
public class SXSSFSheet implements Sheet
{
    /*package*/ final XSSFSheet _sh;
    private final SXSSFWorkbook _workbook;
    protected final SXSSFWorkbook _workbook;
    private final TreeMap<Integer,SXSSFRow> _rows=new TreeMap<Integer,SXSSFRow>();
    private final SheetDataWriter _writer;
    protected SheetDataWriter _writer;
    private int _randomAccessWindowSize = SXSSFWorkbook.DEFAULT_WINDOW_SIZE;
    private final AutoSizeColumnTracker _autoSizeColumnTracker;
    protected final AutoSizeColumnTracker _autoSizeColumnTracker;
    private int outlineLevelRow = 0;
    private int lastFlushedRowNumber = -1;
    private boolean allFlushed = false;

    // Custom constructor for SuperSXSSFSheet
    protected SXSSFSheet(SXSSFWorkbook workbook, XSSFSheet xSheet, int randomAccessWindowSize) {
    	_workbook = workbook;
        _sh = xSheet;
        setRandomAccessWindowSize(randomAccessWindowSize);
        _autoSizeColumnTracker = new AutoSizeColumnTracker(this);
    }
    
    public SXSSFSheet(SXSSFWorkbook workbook, XSSFSheet xSheet) throws IOException {
        _workbook = workbook;
        _sh = xSheet;
+4 −4
Changes for src/main/java/org/apache/poi/xssf/streaming/SXSSFWorkbook.java: 4 added lines, 4 removed lines.
Original line number Diff line number Diff line
@@ -98,7 +98,7 @@ public class SXSSFWorkbook implements Workbook {
    public static final int DEFAULT_WINDOW_SIZE = 100;
    private static final POILogger logger = POILogFactory.getLogger(SXSSFWorkbook.class);

    private final XSSFWorkbook _wb;
    protected XSSFWorkbook _wb;

    private final Map<SXSSFSheet,XSSFSheet> _sxFromXHash = new HashMap<SXSSFSheet,XSSFSheet>();
    private final Map<XSSFSheet,SXSSFSheet> _xFromSxHash = new HashMap<XSSFSheet,SXSSFSheet>();
@@ -113,7 +113,7 @@ public class SXSSFWorkbook implements Workbook {
    /**
     * shared string table - a cache of strings in this workbook
     */
    private final SharedStringsTable _sharedStringSource;
    protected SharedStringsTable _sharedStringSource;

    /**
     * Construct a new workbook with default row window size
@@ -281,7 +281,7 @@ public class SXSSFWorkbook implements Workbook {
    	return _randomAccessWindowSize;
    }

    private void setRandomAccessWindowSize(int rowAccessWindowSize) {
    protected void setRandomAccessWindowSize(int rowAccessWindowSize) {
        if(rowAccessWindowSize == 0 || rowAccessWindowSize < -1) {
            throw new IllegalArgumentException("rowAccessWindowSize must be greater than 0 or -1");
        }
@@ -362,7 +362,7 @@ public class SXSSFWorkbook implements Workbook {
        _xFromSxHash.remove(xSheet);
    }

    private XSSFSheet getSheetFromZipEntryName(String sheetRef)
    protected XSSFSheet getSheetFromZipEntryName(String sheetRef)
    {
        for(XSSFSheet sheet : _sxFromXHash.values())
        {
Loading