如何在数据透视表中的计数列上添加过滤器?

问题描述 投票:0回答:1

我需要根据计数列值过滤数据透视表。 我已经尝试了谷歌的几个代码示例,但没有任何效果。

enter image description here 如何在java中使用apache poi实现这个过滤器。

下面是在虚拟数据上生成数据透视表的示例工作代码。

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"));

        }

    }
}

我只需要显示复杂度大于 2 的行。 enter image description here

java excel filter apache-poi pivot-table
1个回答
0
投票

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);              
...
© www.soinside.com 2019 - 2024. All rights reserved.