簡體   English   中英

使用Apache POI訪問數據透視表的字段設置

[英]Accessing Field Settings of Pivot Table using Apache POI

我正在使用工作表中的數據源填充數據來創建工作簿,然后使用數據透視表視圖創建第二個工作表。 一切正常,但我似乎無法更改數據透視表的默認外觀。 我正在嘗試獲得設置(行標簽->從列表中單擊一個->字段設置->小計->無和行標簽->從列表中單擊一個->字段設置->布局和打印->“以表格形式顯示項目標簽”)在創建數據透視表時已選中,但在POI中找不到句柄/標志。 試圖在ivotTable.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);

終於明白了; 缺乏好的文檔迫使我嘗試不計其數的事情,最終能夠實現我想要的目標; 這是代碼:

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

我不是每次都創建數據透視表,而是創建了一個具有所有所需樣式的模板XLS文件,並將其包含在源代碼中,現在我打開該文件,將其填充到源代碼選項卡中,並用動態文件保存XLS名稱不同的數據; 由於“數據透視表”選項卡被標記為在打開時刷新,因此它可以完成工作。 如果要為動態數據生成相同樣式的數據透視表,則無需遍歷POI 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"));

             ...
             ..
             .

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM