我需要根据计数列值过滤数据透视表。 我已经尝试了谷歌的几个代码示例,但没有任何效果。
下面是在虚拟数据上生成数据透视表的示例工作代码。
package com.technia.upgradetool.export;
import java.awt.Desktop;
import java.io.File;
import java.io.FileOutputStream;
import org.apache.poi.ss.*;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.ss.util.*;
import org.apache.poi.xssf.usermodel.*;
import com.technia.upgradetool.Analyzer;
public class CreatePivotTableFilterTest {
public static void main(String[] args) throws Exception {
try (Workbook workbook = new XSSFWorkbook();
FileOutputStream fileout = new FileOutputStream("ItemFilter.xlsx")) {
Sheet pivotSheet = workbook.createSheet("Pivot");
Sheet dataSheet = workbook.createSheet("Data");
Row row;
Cell cell;
Object[][] data = new Object[][]
{ new Object[]
{ "Header", "Complexity" }, new Object[]
{ "A", "High" }, new Object[]
{ "A", "Low" }, new Object[]
{ "C", "Moderate" }, new Object[]
{ "D", "High" }, new Object[]
{ "A", "High" }, new Object[]
{ "B", "Low" }, new Object[]
{ "G", "Low" }, new Object[]
{ "G", "High" }, new Object[]
{ "G", "High" }, new Object[]
{ "G", "High" }, new Object[]
{ "G", "Low" }, new Object[]
{ "H", "Low" }, new Object[]
{ "H", "Low" } };
for (int r = 0; r < data.length; r++) {
row = dataSheet.createRow(r);
Object[] rowData = data[r];
for (int c = 0; c < rowData.length; c++) {
cell = row.createCell(c);
if (rowData[c] instanceof String) {
cell.setCellValue((String) rowData[c]);
} else if (rowData[c] instanceof Number) {
cell.setCellValue(((Number) rowData[c]).doubleValue());
}
}
}
AreaReference areaReference = new AreaReference(new CellReference(0, 0),
new CellReference(data.length - 1, data[0].length - 1),
SpreadsheetVersion.EXCEL2007);
XSSFPivotTable pivotTable = ((XSSFSheet) pivotSheet).createPivotTable(areaReference,
new CellReference("A4"), dataSheet);
pivotTable.addRowLabel(0);
pivotTable.addColumnLabel(DataConsolidateFunction.COUNT, 1, "Count of complexity");
// Method addColLabel removes the dataField setting. So we need set it new.
pivotTable.getCTPivotTableDefinition()
.getPivotFields()
.getPivotFieldArray(1)
.setDataField(true);
workbook.write(fileout);
fileout.close();
Desktop.getDesktop().open(new File("ItemFilter.xlsx"));
}
}
}
在 Apache POI 数据透视表 - 如何在 Java 中使用“中间”值过滤器我展示了如何使用 Apache POI 为数据透视表设置值过滤器。
采用您的示例,那就是:
运行您的代码。
结果
Itemfilter.xlsx
使用Excel GUI做你想做的事。保存文件。
解压缩
Itemfilter.xlsx
并查看/xl/pivotTables/pivotTable1.xml
。在那里你会发现:
<filters count="1">
<filter fld="0" type="valueGreaterThan" evalOrder="-1" id="1" iMeasureFld="0">
<autoFilter ref="A1">
<filterColumn colId="0">
<customFilters>
<customFilter operator="greaterThan" val="2"/>
</customFilters>
</filterColumn>
</autoFilter>
</filter>
</filters>
现在尝试使用以下类创建它:
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTPivotFilters;
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTPivotFilter;
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTCustomFilters;
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTCustomFilter;
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTFilterColumn;
import org.openxmlformats.schemas.spreadsheetml.x2006.main.STFilterOperator;
代码:
...
//create filters
CTPivotFilters filters = CTPivotFilters.Factory.newInstance();
//set custom value filter
int filtersCount = 0; // to count filters
CTPivotFilter filter = filters.addNewFilter();
filter.setId(0); // filter needs Id !ToDo - handle carefully
filter.setFld(0); // filter on column level 0 - first row label
filter.setType(org.openxmlformats.schemas.spreadsheetml.x2006.main.STPivotFilterType.VALUE_GREATER_THAN);
filter.setIMeasureFld(0); //internal measure field is 0 - first data field
CTFilterColumn filterColumn = filter.addNewAutoFilter().addNewFilterColumn();
filterColumn.setColId(0); // filterColumn need colId !ToDo - handle carefully
CTCustomFilters customFilters= filterColumn.addNewCustomFilters();
CTCustomFilter customFilter = customFilters.addNewCustomFilter();
customFilter.setOperator(STFilterOperator.GREATER_THAN);
customFilter.setVal("2");
filtersCount++;
filters.setCount(filtersCount); // set filters count
pivotTable.getCTPivotTableDefinition().setFilters(filters);
...