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

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

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

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

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

@ninjaxelite在这里如何:

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