我正在使用JAVA中的apache poi创建数据透视表,它会生成一个如下所示的数据透视表,默认情况下所有行都展开
如何生成数据透视表,所有行都将从Java代码中折叠,如下所示。
谢谢您。
用于生成数据透视表的代码>
2018-07-23 18:33:00
答案 0 :(得分:1)
您提供的代码不会导致第一个显示结果,因为它没有设置不同的列标签。它仅将列Packet ID
添加为数据合并列。
但是我还是会尝试回答。因此,我假设列E
是第一行标签。 G
列应为第二行标签,该行应折叠,A
列应为第三行标签。但是C
列是包含“ APR 2018”,“ MAY 2018”,“ JUN 2018”的列,然后应为列标签。
问题是D
在创建数据透视表时没有分析内容。因此,它只是为每个枢纽字段添加了与数据范围内的行一样多的“默认”枢纽字段项。而且它仅创建非常基本的数据透视缓存。只要我们仅使用默认值,该方法就起作用,因为apache poi
会在渲染数据透视表时进行更正。但是,例如,如果我们需要除默认的折叠行标签之外的其他标签,则此操作将失败。
因此,我们需要Excel
列中的唯一内容,以计算所需的数据透视项并正确创建数据透视表缓存。然后,我们需要在A
列中将不同的枢轴字段项目从“默认”更改为实际的枢轴字段项目。这些枢轴字段项必须具有指向枢轴缓存的属性A
设置。并且必须正确创建枢轴缓存,其中在列x
中具有单个唯一内容。此外,必须设置属性A
sd
,该属性指示该项目的详细信息已隐藏。
完整示例:
Excel:
代码:
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();
}
}
。