使用Apache POI访问数据透视表的字段设置

时间:2015-08-12 21:59:06

标签: java apache-poi pivot-table

我正在创建一个工作簿,其中包含来自数据源的工作表填充数据,然后创建第二个工作表,其中包含该数据的数据透视表视图。一切正常,但我似乎无法改变数据透视表的默认外观。我想获取设置(行标签 - >点击列表中的一个 - >字段设置 - >小计 - >无和行标签 - >点击列表中的一个 - &gt ;字段设置 - >布局和打印 - >'以表格形式显示项目标签')在创建数据透视表时检查但无法在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);

3 个答案:

答案 0 :(得分:2)

终于弄清楚了;缺乏良好的文档迫使我尝试了很多东西,最终能够实现我想要的东西;这是代码:

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

答案 1 :(得分:2)

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

答案 2 :(得分:1)

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

             ...
             ..
             .