如何从Java折叠数据透视表中的所有字段?

时间:2018-08-28 13:06:55

标签: java excel apache-poi pivot-table

我正在使用JAVA中的apache poi创建数据透视表,它会生成一个如下所示的数据透视表,默认情况下所有行都展开
如何生成数据透视表,所有行都将从Java代码中折叠,如下所示。
enter image description here
谢谢您。
用于生成数据透视表的代码

2018-07-23 18:33:00

1 个答案:

答案 0 :(得分:1)

您提供的代码不会导致第一个显示结果,因为它没有设置不同的列标签。它仅将列Packet ID添加为数据合并列。

但是我还是会尝试回答。因此,我假设列E是第一行标签。 G列应为第二行标签,该行应折叠,A列应为第三行标签。但是C列是包含“ APR 2018”,“ MAY 2018”,“ JUN 2018”的列,然后应为列标签。

问题是D在创建数据透视表时没有分析内容。因此,它只是为每个枢纽字段添加了与数据范围内的行一样多的“默认”枢纽字段项。而且它仅创建非常基本的数据透视缓存。只要我们仅使用默认值,该方法就起作用,因为apache poi会在渲染数据透视表时进行更正。但是,例如,如果我们需要除默认的折叠行标签之外的其他标签,则此操作将失败。

因此,我们需要Excel列中的唯一内容,以计算所需的数据透视项并正确创建数据透视表缓存。然后,我们需要在A列中将不同的枢轴字段项目从“默认”更改为实际的枢轴字段项目。这些枢轴字段项必须具有指向枢轴缓存的属性A设置。并且必须正确创建枢轴缓存,其中在列x中具有单个唯一内容。此外,必须设置属性A sd,该属性指示该项目的详细信息已隐藏。

完整示例:

Excel:

enter image description here

代码:

false

此代码需要apache poi FAQ中提到的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 java.io.FileOutputStream; import java.io.FileInputStream; import java.util.List; import java.util.Set; import java.util.HashSet; class ExcelPivotTableTest { public static void main(String[] args) throws Exception{ XSSFWorkbook workbook = (XSSFWorkbook)WorkbookFactory.create(new FileInputStream("PivotExample.xlsx")); XSSFSheet dataSheet = workbook.getSheet("Data"); XSSFSheet pivotSheet = workbook.createSheet("Pivot"); AreaReference a = new AreaReference("A1:G" + (dataSheet.getLastRowNum() + 1), SpreadsheetVersion.EXCEL2007); CellReference b = new CellReference("A1"); XSSFPivotTable pivotTable = pivotSheet.createPivotTable(a, b, dataSheet); pivotTable.addRowLabel(6); //column G as first row label pivotTable.addRowLabel(0); //column A as second row label - shall be collapsed //we need unique contents in column A for creating the pivot cache Set<String> colAValues = new HashSet<String>(); for (int r = 1; r < dataSheet.getLastRowNum() + 1; r++) { Row row = dataSheet.getRow(r); if (row != null) { Cell cell = row.getCell(0); if (cell != null) { colAValues.add(cell.toString()); } } } //now go through all pivot items of first pivot field List<org.openxmlformats.schemas.spreadsheetml.x2006.main.CTItem> itemList = pivotTable.getCTPivotTableDefinition().getPivotFields().getPivotFieldArray(0).getItems().getItemList(); int i = 0; org.openxmlformats.schemas.spreadsheetml.x2006.main.CTItem item = null; for (String value : colAValues) { //as long as there are different column A values item = itemList.get(i); item.unsetT(); //unset the type "default" item.setX(i++); //set x pivotTable.getPivotCacheDefinition().getCTPivotCacheDefinition().getCacheFields() .getCacheFieldArray(0).getSharedItems().addNewS().setV(value); //create pivot cache entry item.setSd(false); //set sd false = indicates that the details are hidden for this item } while (i < itemList.size()) { item = itemList.get(i++); item.setSd(false); } pivotTable.addRowLabel(2); //column C as third row label pivotTable.addRowLabel(3); //column D as row label - shall be column label instead //do changing column D to a col label pivotTable.getCTPivotTableDefinition().getPivotFields().getPivotFieldArray(3) .setAxis(org.openxmlformats.schemas.spreadsheetml.x2006.main.STAxis.AXIS_COL); //AXIS_COL //remove column D from RowFields pivotTable.getCTPivotTableDefinition().getRowFields().removeField(3); pivotTable.getCTPivotTableDefinition().getRowFields().setCount(3); //create ColFields for column D pivotTable.getCTPivotTableDefinition().addNewColFields().addNewField().setX(3); pivotTable.getCTPivotTableDefinition().getColFields().setCount(1); pivotTable.addColumnLabel(DataConsolidateFunction.SUM, 4, "Sum"); workbook.write(new FileOutputStream("PivotExample_New.xlsx")); workbook.close(); } }

结果: enter image description here