使用 Apache POI 访问 Pivot Table 的字段设置

Accessing Field Settings of Pivot Table using Apache POI

我正在创建一个工作簿,其中包含来自数据源的 sheet 填充数据,然后创建第二个 sheet 以及该数据的透视 table 视图。一切正常,但我似乎无法更改枢轴 table 的默认外观。我正在尝试获取设置(行标签-->单击列表中的一个-->字段设置-->小计-->None 和行标签-->单击列表中的一个-->字段Settings-->Layout & Print-->'Show item labels in tabular form' ) 在创建 pivot table 时进行了检查,但在 POI 中找不到句柄/标志。尝试在 pivotTable.getCTPivotTableDefinition() 或 pivotTable.getCTPivotTableDefinition().getPivotTableStyleInfo() 下找到一些东西,但没有锁定。请告知是否有办法在 pivot table 创建期间使用 poi 设置这些设置,而不是在按照括号中提到的步骤之后。这是我的枢轴 table 代码:

XSSFSheet sheet = (XSSFSheet)wb.createSheet("Data");
...
...
//filling data sheet, skipping this part as it's not relevant 
...
XSSFSheet pivotSheet = (XSSFSheet)wb.createSheet("Pivot Table");
AreaReference source = new AreaReference(sheet.getSheetName()+"!A:W$"+String.valueOf(sheet.getLastRowNum()));
CellReference position = new CellReference("A3");
XSSFPivotTable pivotTable = pivotSheet.createPivotTable(source, position);


        /* Add filters */
        pivotTable.addRowLabel(17);
        pivotTable.addRowLabel(20);
        pivotTable.addRowLabel(21);
        pivotTable.addRowLabel(22);
        pivotTable.addRowLabel(13);
        pivotTable.addRowLabel(19);
        pivotTable.addRowLabel(6);
        pivotTable.addRowLabel(0);
        pivotTable.addRowLabel(18);
        pivotTable.addRowLabel(1);
        pivotTable.addRowLabel(7);
        pivotTable.addRowLabel(9);

终于想通了;缺乏良好的文档迫使我尝试了无数的东西,最终能够实现我想要的;这是代码:

for(CTPivotField ctPivotField:pivotTable.getCTPivotTableDefinition().getPivotFields().getPivotFieldList()){
            ctPivotField.setAutoShow(false);
            ctPivotField.setOutline(false);
            ctPivotField.setSubtotalTop(false);
            ctPivotField.setSubtotalCaption("");
        }

我没有每次都创建数据透视表 table,而是创建了一个包含所有所需样式的模板 XLS 文件,并将其包含在源代码中,现在我打开该文件,在源代码选项卡中填充必要的数据, 并以不同的名称保存包含动态数据的 XLS 文件;由于 Pivot table 选项卡被标记为在打开时刷新,因此它完成了工作。如果您将为动态数据生成相同样式的数据透视表 table,那么创建模板并使用它会更加容易和灵活,而不是通过数据透视表的限制 API。

@ninjaxelite 这是怎么回事:

       List<Object[]> resultSet = //get raw data


        XSSFWorkbook wb = null;
        try {
            wb = new XSSFWorkbook(new FileInputStream(this.getClass().getResource("/content/XLS_template.xlsx").getPath()));
        } catch (FileNotFoundException e1) {
            //error
        } catch (IOException e1) {
            //error
        }



        Map<String, CellStyle> styles = createStyles(wb); // some local function to get styles 
        XSSFSheet sheet = (XSSFSheet)wb.getSheetAt(0);

        XSSFRow row;
        XSSFCell cell;
        int rowNum = 0;
        for (Object[] aRow : resultSet) {
            rowNum++;
            row = sheet.createRow(rowNum);

            cell = row.createCell(0);
            cell.setCellValue((String)aRow[0]);
            cell.setCellStyle(styles.get("cell_normal_centered"));

             ...
             ..
             .