使用 apache poi 创建数据透视表时在整数列上创建过滤器(选择默认值)

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

我正在尝试在第三个字段上创建过滤器,该字段不包含在行/列中,并且该字段是整数。对于字符串,我可以创建它并且它工作正常,但对于整数它不起作用。

下面是从一篇文章中引用的示例代码,用于创建整数值的示例:

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.*;


class PivotIntegerFilter {

public static void main(String[] args) throws Exception {

    try (Workbook workbook = new XSSFWorkbook();
         FileOutputStream fileout = new FileOutputStream("D:\\user\\temp\\pivottable.xlsx")) {

        Sheet pivotSheet = workbook.createSheet("Pivot");
        Sheet dataSheet = workbook.createSheet("Data");

        setCellData(dataSheet, workbook);

        AreaReference areaReference = new AreaReference("A1:E5", SpreadsheetVersion.EXCEL2007);

        XSSFPivotTable pivotTable = ((XSSFSheet) pivotSheet).createPivotTable(areaReference, new CellReference("A4"), dataSheet);

        pivotTable.addReportFilter(1);

        pivotTable.addColumnLabel(DataConsolidateFunction.SUM, 2);
 
        DataFormat dataformat = workbook.createDataFormat();
        short numFmtId = dataformat.getFormat("0");
        pivotTable.getCTPivotTableDefinition().getDataFields().getDataFieldArray(1).setNumFmtId(numFmtId);

        java.util.TreeSet<Integer> uniqueItems = new java.util.TreeSet<Integer>();
        for (int r = areaReference.getFirstCell().getRow() + 1; r < areaReference.getLastCell().getRow() + 1; r++) {
            uniqueItems.add((int) dataSheet.getRow(r).getCell(1).getNumericCellValue());
        }
        int i = 0;

        short numFmtId1 = dataformat.getFormat("0");
        pivotTable.getCTPivotTableDefinition().getPivotFields().getPivotFieldArray(1).setNumFmtId(numFmtId1);
        for (Integer item : uniqueItems) {
            pivotTable.getCTPivotTableDefinition().getPivotFields().getPivotFieldArray(1).getItems().getItemArray(i).unsetT();

            pivotTable.getCTPivotTableDefinition().getPivotFields().getPivotFieldArray(1).getItems().getItemArray(i).setX((long) i);

            int y = item.intValue();
            //CTNumber c = pivotTable.getPivotCacheDefinition().getCTPivotCacheDefinition().getCacheFields().getCacheFieldArray(1).getSharedItems().addNewN();
            //c.set(XmlObject.Factory.newValue(Integer.toString((int) y)));
            pivotTable.getPivotCacheDefinition().getCTPivotCacheDefinition().getCacheFields().getCacheFieldArray(1).getSharedItems().addNewS().setV(Integer.toString(y));
            if (!"3".equals(item.toString())) {
                pivotTable.getCTPivotTableDefinition().getPivotFields().getPivotFieldArray(1).getItems().getItemArray(i).setH(true);
            }
            // pivotTable.getPivotCacheDefinition().getCTPivotCacheDefinition().getCacheFields().getCacheFieldArray(1).setNumFmtId(numFmtId1);
            i++;
        }

        pivotTable.getCTPivotTableDefinition().getPivotFields().getPivotFieldArray(1).setMultipleItemSelectionAllowed(true);
        workbook.write(fileout);
    }
}

static void setCellData(Sheet sheet, Workbook workbook) {
    XSSFRow row;
    XSSFCell cell;
    Object[][] data = new Object[][]{
            new Object[]{"PARTY", "SNO", "VOTES", "Total Count", "Total Absent"},
            new Object[]{"REPUBLICAN", 1, 10d, "?", "?"},
            new Object[]{"DEMOCRAT", 3, 5d, "?", "?"},
            new Object[]{"AMERICAN INDEP", 3, 10d, "?", "?"},
            new Object[]{"DECLINED", 2, 10d, "?", "?"}
    };
    for (int r = 0; r < data.length; r++) {
        row = (XSSFRow) sheet.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 Double) {
                cell.setCellValue((Double) rowData[c]);
            } else if (rowData[c] instanceof Integer) {
                cell.setCellValue((int) rowData[c]);
                DataFormat format = workbook.createDataFormat();
                CellStyle integerCellStyle = workbook.createCellStyle();
                integerCellStyle.setDataFormat(format.getFormat("0"));
                cell.setCellStyle(integerCellStyle);
            }
        }
        }
    }
}

我正在尝试在 SNO 字段上创建过滤器,该字段不包含在行、列或值中。如果有人可以提供帮助,那就真的很有帮助了。

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

该示例似乎取自如何使用 poi 在数据透视表中设置行标签的默认值。我的回答解释了基础知识。

不同之处在于,该示例使用文本项进行过滤。您的示例需要数字项目进行过滤。

对于

sharedItems
中的文本项目
pivotCacheDefinition
-
cacheFields
-
cacheField
s
-项目。

对于

sharedItems
-
pivotCacheDefinition
-
cacheFields
中的数字项目
cacheField
n
项目。但是,虽然
sharedItems
具有
s
项目不需要进一步设置,但
sharedItems
具有
n
项目需要进一步设置有关数字类型的信息。例如:

<sharedItems containsSemiMixedTypes="false" containsString="false" containsNumber="true" containsInteger="true">
 <n v="1"/>
 <n v="2"/>
 <n v="3"/>
</sharedItems>

代码差异:

对于文本项目:

for (String item : uniqueItems) {
 ...
 pivotTable.getPivotCacheDefinition().getCTPivotCacheDefinition().getCacheFields().getCacheFieldArray(0)
  .getSharedItems().addNewS().setV(item);
 ...
}

对于数字项目:

for (Integer item : uniqueItems) {
 ...
 pivotTable.getPivotCacheDefinition().getCTPivotCacheDefinition().getCacheFields().getCacheFieldArray(1).getSharedItems()
  .setContainsSemiMixedTypes(false);
 pivotTable.getPivotCacheDefinition().getCTPivotCacheDefinition().getCacheFields().getCacheFieldArray(1).getSharedItems()
  .setContainsString(false);
 pivotTable.getPivotCacheDefinition().getCTPivotCacheDefinition().getCacheFields().getCacheFieldArray(1).getSharedItems()
  .setContainsNumber(true);
 pivotTable.getPivotCacheDefinition().getCTPivotCacheDefinition().getCacheFields().getCacheFieldArray(1).getSharedItems()
  .setContainsInteger(true);
 pivotTable.getPivotCacheDefinition().getCTPivotCacheDefinition().getCacheFields().getCacheFieldArray(1).getSharedItems()
  .addNewN().setV(item);
 ...
}

完整示例:

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.*;

class PivotIntegerFilter {

public static void main(String[] args) throws Exception {

    try (Workbook workbook = new XSSFWorkbook();
         FileOutputStream fileout = new FileOutputStream("./pivottable.xlsx")) {

        Sheet pivotSheet = workbook.createSheet("Pivot");
        Sheet dataSheet = workbook.createSheet("Data");

        setCellData(dataSheet, workbook);

        AreaReference areaReference = new AreaReference("A1:E5", SpreadsheetVersion.EXCEL2007);

        XSSFPivotTable pivotTable = ((XSSFSheet) pivotSheet).createPivotTable(areaReference, new CellReference("A4"), dataSheet);
        
        pivotTable.addRowLabel(0);

        pivotTable.addReportFilter(1);

        pivotTable.addColumnLabel(DataConsolidateFunction.SUM, 2);
 
        java.util.TreeSet<Integer> uniqueItems = new java.util.TreeSet<Integer>();
        for (int r = areaReference.getFirstCell().getRow() + 1; r < areaReference.getLastCell().getRow() + 1; r++) {
            uniqueItems.add((int) dataSheet.getRow(r).getCell(1).getNumericCellValue());
        }
        
        int i = 0;
        for (Integer item : uniqueItems) {
            pivotTable.getCTPivotTableDefinition().getPivotFields().getPivotFieldArray(1).getItems().getItemArray(i).unsetT();
            pivotTable.getCTPivotTableDefinition().getPivotFields().getPivotFieldArray(1).getItems().getItemArray(i).setX((long) i);

            pivotTable.getPivotCacheDefinition().getCTPivotCacheDefinition().getCacheFields().getCacheFieldArray(1).getSharedItems()
                .setContainsSemiMixedTypes(false);
            pivotTable.getPivotCacheDefinition().getCTPivotCacheDefinition().getCacheFields().getCacheFieldArray(1).getSharedItems()
                .setContainsString(false);
            pivotTable.getPivotCacheDefinition().getCTPivotCacheDefinition().getCacheFields().getCacheFieldArray(1).getSharedItems()
                .setContainsNumber(true);
            pivotTable.getPivotCacheDefinition().getCTPivotCacheDefinition().getCacheFields().getCacheFieldArray(1).getSharedItems()
                .setContainsInteger(true);
            pivotTable.getPivotCacheDefinition().getCTPivotCacheDefinition().getCacheFields().getCacheFieldArray(1).getSharedItems()
                .addNewN().setV(item);
                
            if (!(item == 3)) {
                pivotTable.getCTPivotTableDefinition().getPivotFields().getPivotFieldArray(1).getItems().getItemArray(i).setH(true);
            }
            
            i++;
        }

        pivotTable.getCTPivotTableDefinition().getPivotFields().getPivotFieldArray(1).setMultipleItemSelectionAllowed(true);
        
        workbook.write(fileout);
    }
}

static void setCellData(Sheet sheet, Workbook workbook) {
    Row row;
    Cell cell;
    Object[][] data = new Object[][]{
            new Object[]{"PARTY", "SNO", "VOTES", "Total Count", "Total Absent"},
            new Object[]{"REPUBLICAN", 1, 10d, "?", "?"},
            new Object[]{"DEMOCRAT", 3, 5d, "?", "?"},
            new Object[]{"AMERICAN INDEP", 3, 10d, "?", "?"},
            new Object[]{"DECLINED", 2, 10d, "?", "?"}
    };
    for (int r = 0; r < data.length; r++) {
        row = sheet.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 Double) {
                cell.setCellValue((Double) rowData[c]);
            } else if (rowData[c] instanceof Integer) {
                cell.setCellValue((Integer) rowData[c]);
                DataFormat format = workbook.createDataFormat();
                CellStyle integerCellStyle = workbook.createCellStyle();
                integerCellStyle.setDataFormat(format.getFormat("0"));
                cell.setCellStyle(integerCellStyle);
            }
        }
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.