【发布时间】:2026-01-29 18:20:05
【问题描述】:
我对axisRow pivotFields 的setDefaultSubtotal 方法有疑问。当我将 RowLabel 字段的值设置为 false 时,Excel 不喜欢它。在 Excel 中手动设置我想要的方式,然后保存会产生截然不同的 XML,这对于我来说太不同了,无法考虑在幕后进行修复。我不能(到目前为止)操作 XML 来让 POI 电子表格在 Excel 中干净地打开。
实际代码有点长且难以发布,但这里有一个可运行的片段,但存在同样的问题:
private static void sample() throws IOException{
Workbook wb = new XSSFWorkbook();
String[][] data = new String[][]{{"STATUS","PASSED","VALUE"},{"BLUE","Y","20"},{"RED","N","10"},{"BLUE","N","30"}};
XSSFSheet sheet = (XSSFSheet) wb.createSheet("data");
XSSFSheet pivot = (XSSFSheet) wb.createSheet("summary");
for(String[] dataRow : data){
XSSFRow row = sheet.createRow(sheet.getPhysicalNumberOfRows());
for(String dataCell : dataRow){
XSSFCell cell = row.createCell(row.getPhysicalNumberOfCells());
cell.setCellValue(dataCell);
}
}
XSSFTable table = sheet.createTable();
CTTable cttable = table.getCTTable();
table.setDisplayName("table");
cttable.setRef("A1:C4");
cttable.setId(1);
CTTableColumns columns = cttable.addNewTableColumns();
columns.setCount(3);
int i = 1;
for (String colName : data[0]){
CTTableColumn column = columns.addNewTableColumn();
column.setId(++i);
column.setName(colName);
}
XSSFPivotTable pivotTable = pivot.createPivotTable(new AreaReference("A1:C4", SpreadsheetVersion.EXCEL2007), new CellReference("A4"), sheet);
pivotTable.addRowLabel(0);
CTPivotField fld = pivotTable.getCTPivotTableDefinition().getPivotFields().getPivotFieldList().get(0);
fld.setOutline(false);
//fld.setDefaultSubtotal(false); // uncomment and Excel has problems
pivotTable.addRowLabel(1);
fld = pivotTable.getCTPivotTableDefinition().getPivotFields().getPivotFieldList().get(1);
fld.setOutline(false);
//fld.setDefaultSubtotal(false); // uncomment and Excel has problems
pivotTable.addColumnLabel(DataConsolidateFunction.COUNT, 2, "test");
FileOutputStream fileOut = new FileOutputStream("c:/temp/pivotsample.xlsx");
wb.write(fileOut);
wb.close();
}
当我生成 POI 版本时,这些是档案中 pivotTable XML 的 location 和 pivotFields 元素:
<location firstDataCol="1" firstDataRow="1" firstHeaderRow="1" ref="F10:G11" colPageCount="1"/>
<pivotFields count="5">
<pivotField axis="axisRow" showAll="false" compact="true" outline="false" defaultSubtotal="false">
<items count="4">
<item t="default"/>
<item t="default"/>
<item t="default"/>
<item t="default"/>
</items>
</pivotField>
<pivotField dataField="true" showAll="false"/>
<pivotField dataField="true" showAll="false"/>
<pivotField axis="axisPage" showAll="false">
<items count="4">
<item t="default"/>
<item t="default"/>
<item t="default"/>
<item t="default"/>
</items>
</pivotField>
<pivotField axis="axisRow" showAll="false" compact="true" outline="false" defaultSubtotal="false">
<items count="4">
<item t="default"/>
<item t="default"/>
<item t="default"/>
<item t="default"/>
</items>
</pivotField>
</pivotFields>
当我在 Excel 中打开并允许它恢复工作表时,然后我在 Excel 中进行更改以执行我想要的操作,即两个没有以表格形式小计的行标签,这就是 Excel 保存的内容:
<location ref="F10:I15" firstHeaderRow="1" firstDataRow="2" firstDataCol="2" rowPageCount="1" colPageCount="1"/>
<pivotFields count="5">
<pivotField axis="axisRow" outline="0" showAll="0" defaultSubtotal="0">
<items count="3">
<item x="0"/>
<item x="1"/>
<item x="2"/>
</items>
</pivotField>
<pivotField dataField="1" showAll="0"/>
<pivotField dataField="1" showAll="0"/>
<pivotField axis="axisPage" showAll="0">
<items count="3">
<item x="0"/>
<item x="1"/>
<item t="default"/>
</items>
</pivotField>
<pivotField axis="axisRow" outline="0" showAll="0" defaultSubtotal="0">
<items count="2">
<item x="0"/>
<item x="1"/>
</items>
</pivotField>
</pivotFields>
我几乎尝试了所有方法,并且了解 Excel 格式,但它依赖于 pivotCacheRecords,因此我最终不得不编写代码来填充它。如果有人可能知道为什么此代码失败,我将不胜感激。
【问题讨论】:
-
我遇到了同样的问题。你能告诉我你是如何以其他方式解决这个问题的吗?如果您能给我一些示例代码,那就太好了。
-
对不起,@RajKantaria,我还没有再做这个,现在已经转向其他一些问题,最终会回来的。祝你好运。
-
@RajKantaria,下面的答案工作正常,希望它也适合你。
标签: java excel apache-poi pivot-table