【问题标题】:Accessing Field Settings of Pivot Table using Apache POI使用 Apache POI 访问数据透视表的字段设置
【发布时间】:2015-08-12 21:59:06
【问题描述】:

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

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$1: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);

【问题讨论】:

    标签: java apache-poi pivot-table


    【解决方案1】:

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

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

    【讨论】:

    • 这里有一个问题,ctPivotField.setSubtotalCaption("");实际上并没有删除单元格 ctPivotField.setSubtotalCaption(null);也不会删除小计单元格,因此仍在寻找将数据透视字段的小计标记为“无”的方法
    • 你有没有想过这个问题?我也想做同样的事情。
    • @ToddSharp 不是每次都创建数据透视表,而是创建了一个具有所有所需样式的模板 XLS 文件并将其包含在源中,现在我打开该文件,在源中填充必要的数据选项卡,并使用不同名称的动态数据保存 XLS 文件;由于数据透视表选项卡被标记为在打开时刷新,因此它可以完成工作。如果您要为动态数据生成相同样式的数据透视表,那么创建模板并使用它会更加容易和灵活,而不是通过 POI API 来限制数据透视表。
    • @UCJava 你是如何创建一个数据透视表模板然后用数据 n java 填充它的?请给我一个例子或提示如何在java中编辑现有数据透视表的数据?
    • @ninjaxelite 看我下面的例子
    【解决方案2】:

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

    【讨论】:

    • 这是一段时间,但非常感谢示例
    • 我也在做同样的事情。但在我的情况下,当源工作表中有十多个记录时,数据透视表中的计算是正确的,但是有一些行从数据透视表中溢出。这是我的问题的链接:stackoverflow.com/questions/48443001/… 请告知
    【解决方案3】:

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

    【讨论】:

    • 问题是,如果您的数据行多于模板中的数据行,则必须扩展数据透视表的数据源区域。否则它将不会获取数据透视表的所有可用行,而只会获取模板区域引用中的行。
    • 我只是简单地将模板中的数据源区域扩展至最大。现在它可以正常工作了,谢谢。
    • 上面的代码也会动态地做同样的事情;当您通过调用“row = sheet.createRow(rowNum);”添加行时,您基本上是在扩展数据源。代码并不关心你放入了多少数据。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-30
    • 2013-06-16
    相关资源
    最近更新 更多