gpt4 book ai didi

java - Apache POI - 有没有办法创建源表是 SXSSFSheet 的数据透视表?

转载 作者:行者123 更新时间:2023-11-30 06:13:19 30 4
gpt4 key购买 nike

情况是这样的:我必须使用 SXSSFWorkbook(XSSFWorkbook 的流式版本)来创建 Excel,因为我必须创建一个包含 700000/800000 行和大约 20 列的工作表。 此工作表代表我最终数据透视表的源表。

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

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

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

有人能给我一个解决方案吗? 非常感谢!!!!

斯特凡诺

最佳答案

SXSSFWorkbook可以从 XSSFWorkbook 创建。

所以我要做的是创建 XSSFWorkbook ,其中包含一个至少包含数据标题的 XSSFSheet 和另一个用于数据透视表的 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();

}
}

关于java - Apache POI - 有没有办法创建源表是 SXSSFSheet 的数据透视表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49803148/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com