首页 文章

Apache POI - 有没有办法创建一个数据透视表,其中源表是一个SXSSFSheet?

提问于
浏览
1

情况就是这样:我必须使用SXSSFWorkbook(XSSFWorkbook的流式版)来创建我的Excel,因为我必须创建一个包含大约20列的700000/800000行的工作表 . This sheet represents the source table for my final Pivot.

SXSSFWorkbook workbook();
XSSFSheet pivotSheet = workbook.getXSSFWorkbook().createSheet("Pivot sheet");
AreaReference ar = ....:
CellReference cr = ....;
XSSFPivotTable pivotTable = pivotSheet.createPivotTable(ar, cr); // ERROR!!

问题是,当我尝试在该源上创建此Pivot时, XSSFPivotTable.createPivotTable 方法不起作用,尽管AreaReference和CellReference参数都可以 .

如果我使用XSSFWorkbook(不是流版本),行数较少,一切都还可以,但我没达到目标!

有人可以给我一个解决方案吗? Thank you very much!!!!!

斯特凡诺

1 回答

  • 1

    SXSSFWorkbook可以从 XSSFWorkbook 创建 .

    所以我要做的是创建 XSSFWorkbook ,其中 XSSFSheet 至少包含数据的 Headers ,另一个 XSSFSheet 用于数据透视表 . 然后在此 XSSFSheet 上创建 XSSFPivotTable ,但对数据表的引用足够大以供以后的数据使用 .

    然后我将从 XSSFWorkbook 创建 SXSSFWorkbook ,将数据表作为 SXSSFSheet ,然后将大量数据流式传输到数据表中 .

    完整的例子:

    import org.apache.poi.xssf.usermodel.*;
    import org.apache.poi.ss.usermodel.*;
    import org.apache.poi.ss.util.*;
    import org.apache.poi.ss.SpreadsheetVersion;
    
    import org.apache.poi.xssf.streaming.*;
    
    import java.util.Random;
    import java.io.FileOutputStream;
    
    class SXSSFPivotTableTest {
    
     private static void streamCellData(Sheet sheet, int rowsCount) {
    
      for (int r = 1; r <= rowsCount; r++) {
       Row row = sheet.createRow(r);
       Cell cell = row.createCell(0);
       cell.setCellValue("Name " + ((r-1) % 4 + 1));
       cell = row.createCell(1);
       cell.setCellValue(r * new java.util.Random().nextDouble());
       cell = row.createCell(2);
       cell.setCellValue(r * new java.util.Random().nextDouble());
       cell = row.createCell(3);
       cell.setCellValue("City " + ((r-1) % 3 + 1));  
      }
    
     }
    
     public static void main(String[] args) throws Exception{
    
      int rowsCount = 1000000;
    
      //first create XSSFWorkbook
      XSSFWorkbook wb = new XSSFWorkbook();
    
      //create XSSFSheet with at least the headings
      XSSFSheet sheet = wb.createSheet("Sheet1");
      Row row = sheet.createRow(0);
      Cell cell = row.createCell(0);
      cell.setCellValue("Name");
      cell = row.createCell(1);
      cell.setCellValue("Value1");
      cell = row.createCell(2);
      cell.setCellValue("Value2");
      cell = row.createCell(3);
      cell.setCellValue("City");
    
      //create XSSFSheet for pivot table
      XSSFSheet pivotSheet = wb.createSheet("Pivot sheet");
    
      //create pivot table
      XSSFPivotTable pivotTable = pivotSheet.createPivotTable(
        new AreaReference(new CellReference("Sheet1!A1"), 
                          new CellReference("Sheet1!D" + (rowsCount +1)), //make the reference big enough for later data
                          SpreadsheetVersion.EXCEL2007),
        new CellReference("A5"));
      //Configure the pivot table
      //Use first column as row label
      pivotTable.addRowLabel(0);
      //Sum up the second column
      pivotTable.addColumnLabel(DataConsolidateFunction.SUM, 1);
      //Avarage the third column
      pivotTable.addColumnLabel(DataConsolidateFunction.AVERAGE, 2);
      //Add filter on forth column
      pivotTable.addReportFilter(3);
    
      //now create SXSSFWorkbook from XSSFWorkbook
      SXSSFWorkbook swb = new SXSSFWorkbook(wb);
      SXSSFSheet ssheet = swb.getSheet("Sheet1");
    
      //now stream the big amount of data to build the pivot table on into Sheet1
      streamCellData(ssheet, rowsCount);
    
      swb.write(new FileOutputStream("SXSSFPivotTableTest.xlsx"));
      swb.close();
      swb.dispose();
    
     }
    }
    

相关问题