使用Apache POI为数据透视表的Integer列添加筛选(非行/列/值字段)
Apache POI数据透视表Integer类型字段筛选失效问题
在使用Apache POI创建数据透视表时,尝试为未包含在行、列或值区域中的第三列(Integer类型的SNO字段)添加筛选,但Integer类型的筛选无法正常工作,String类型字段的筛选已能正常实现。以下是参考相关帖子编写的Integer值筛选示例代码:
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); } } } } }
恳请各位提供技术帮助,解决该问题。
内容的提问来源于stack exchange,提问作者user3458271
相关产品推荐
相关产品推荐

