我正在创建一个工作簿,其中包含来自数据源的工作表填充数据,然后创建第二个工作表,其中包含该数据的数据透视表视图。一切正常,但我似乎无法改变数据透视表的默认外观。我想获取设置(行标签 - >点击列表中的一个 - >字段设置 - >小计 - >无和行标签 - >点击列表中的一个 - &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);
答案 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"));
...
..
.