我使用Apache POI 3.11创建了一个数据透视表.像这样:
FileInputStream file = new FileInputStream(new File(path+fname)); XSSFWorkbook workbook = new XSSFWorkbook(file); XSSFSheet sheet = workbook.getSheetAt(0); //area of pivot data AreaReference a=new AreaReference("A1:J4"); CellReference b=new CellReference("N5"); XSSFPivotTable pivotTable = sheet.createPivotTable(a,b); //insert row pivotTable.addRowLabel(3); pivotTable.addRowLabel(6); //insert column pivotTable.addColumnLabel(DataConsolidateFunction.COUNT,5); //export FileOutputStream output_file = new FileOutputStream(new File(path+"POI_XLS_Pivot_Example.xlsx")); workbook.write(output_file);//write excel document to output stream output_file.close(); //close the file
img http://www.pivot-table.com/wp-content/uploads/2010/12/calculateditem04.png
有谁知道这个问题的解决方案?
谢谢.
解决方法
以下方法(稍微修改过的XSSFPivotTable.addRowLabel版本)添加了“普通”透视列标签:
public static void addColLabel(XSSFPivotTable pivotTable,int columnIndex) { AreaReference pivotArea = new AreaReference(pivotTable.getPivotCacheDefinition().getCTPivotCacheDefinition() .getCacheSource().getWorksheetSource().getRef()); int lastRowIndex = pivotArea.getLastCell().getRow() - pivotArea.getFirstCell().getRow(); int lastColIndex = pivotArea.getLastCell().getCol() - pivotArea.getFirstCell().getCol(); if (columnIndex > lastColIndex) { throw new IndexOutOfBoundsException(); } CTPivotFields pivotFields = pivotTable.getCTPivotTableDefinition().getPivotFields(); CTPivotField pivotField = CTPivotField.Factory.newInstance(); CTItems items = pivotField.addNewItems(); pivotField.setAxis(STAxis.AXIS_COL); pivotField.setShowAll(false); for (int i = 0; i <= lastRowIndex; i++) { items.addNewItem().setT(STItemType.DEFAULT); } items.setCount(items.sizeOfItemArray()); pivotFields.setPivotFieldArray(columnIndex,pivotField); CTColFields rowFields; if (pivotTable.getCTPivotTableDefinition().getColFields() != null) { rowFields = pivotTable.getCTPivotTableDefinition().getColFields(); } else { rowFields = pivotTable.getCTPivotTableDefinition().addNewColFields(); } rowFields.addNewField().setX(columnIndex); rowFields.setCount(rowFields.sizeOfFieldArray()); }