使用 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"));
...
..
.
我正在创建一个工作簿,其中包含来自数据源的 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"));
...
..
.