我在Java中使用的Apache POI创建一个数据透视表和它产生像下面枢轴表默认展开所有行
如何生成Pivote表将所有行倒塌像下面从Java代码。
先感谢您。
代码用于生成透视表
AreaReference a=new AreaReference("A1:G5667", null);
CellReference b=new CellReference("A1");
XSSFSheet pivot_sheet=workbook.createSheet("Pivot_table");
XSSFPivotTable pivotTable = pivot_sheet.createPivotTable(a,b,spreadsheet);
pivotTable.addRowLabel(6);
pivotTable.addRowLabel(0);
pivotTable.addRowLabel(2);
pivotTable.addRowLabel(3);
pivotTable.addColumnLabel(DataConsolidateFunction.SUM, 4,"Sum");
您所提供的代码不能导致第一个显示的结果,因为它不设置不同的列标签。 这不仅增加了列E
数据巩固列。
但我仍然会尝试回答。 所以,我认为列G
应是第一行的标签。 列A
应第二行的标签,其将被折叠,柱C
应的第三行的标签。 但是柱D
是包含“2018年4月”的列中,“MAY 2018”,“2018年6月”,并应列标签然后。
问题是, apache poi
在创建数据透视表不分析内容。 因此,它只是增加了尽可能多的“默认”透视字段项各关键领域如行是在数据范围。 它只是创建了一个非常基本的支点缓存。 只要我们只使用默认值,因为工作Excel
然后就纠正这一点的同时使数据透视表。 但是,如果我们需要别人比默认,倒塌行标签例如,那么这个失败。
因此,我们需要在列独特的内容A
具有所需转动的项目数和正确创建枢轴缓存。 那么我们就需要不同的内容列改变从“默认”,以真正支柱领域的项目,如多支点场项目A
。 这些枢纽场项目必须有属性x
指向枢轴高速缓存组。 而且必须创建枢轴缓存具有正确的列单独特的内容A
。 另外,属性sd
必须设置false
表示该细节被隐藏了这个项目。
完整的例子:
Excel中:
码:
import org.apache.poi.xssf.usermodel.*;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.ss.util.*;
import org.apache.poi.ss.SpreadsheetVersion;
import java.io.FileOutputStream;
import java.io.FileInputStream;
import java.util.List;
import java.util.Set;
import java.util.HashSet;
class ExcelPivotTableTest {
public static void main(String[] args) throws Exception{
XSSFWorkbook workbook = (XSSFWorkbook)WorkbookFactory.create(new FileInputStream("PivotExample.xlsx"));
XSSFSheet dataSheet = workbook.getSheet("Data");
XSSFSheet pivotSheet = workbook.createSheet("Pivot");
AreaReference a = new AreaReference("A1:G" + (dataSheet.getLastRowNum() + 1), SpreadsheetVersion.EXCEL2007);
CellReference b = new CellReference("A1");
XSSFPivotTable pivotTable = pivotSheet.createPivotTable(a, b, dataSheet);
pivotTable.addRowLabel(6); //column G as first row label
pivotTable.addRowLabel(0); //column A as second row label - shall be collapsed
//we need unique contents in column A for creating the pivot cache
Set<String> colAValues = new HashSet<String>();
for (int r = 1; r < dataSheet.getLastRowNum() + 1; r++) {
Row row = dataSheet.getRow(r);
if (row != null) {
Cell cell = row.getCell(0);
if (cell != null) {
colAValues.add(cell.toString());
}
}
}
//now go through all pivot items of first pivot field
List<org.openxmlformats.schemas.spreadsheetml.x2006.main.CTItem> itemList =
pivotTable.getCTPivotTableDefinition().getPivotFields().getPivotFieldArray(0).getItems().getItemList();
int i = 0;
org.openxmlformats.schemas.spreadsheetml.x2006.main.CTItem item = null;
for (String value : colAValues) { //as long as there are different column A values
item = itemList.get(i);
item.unsetT(); //unset the type "default"
item.setX(i++); //set x
pivotTable.getPivotCacheDefinition().getCTPivotCacheDefinition().getCacheFields()
.getCacheFieldArray(0).getSharedItems().addNewS().setV(value); //create pivot cache entry
item.setSd(false); //set sd false = indicates that the details are hidden for this item
}
while (i < itemList.size()) {
item = itemList.get(i++);
item.setSd(false);
}
pivotTable.addRowLabel(2); //column C as third row label
pivotTable.addRowLabel(3); //column D as row label - shall be column label instead
//do changing column D to a col label
pivotTable.getCTPivotTableDefinition().getPivotFields().getPivotFieldArray(3)
.setAxis(org.openxmlformats.schemas.spreadsheetml.x2006.main.STAxis.AXIS_COL); //AXIS_COL
//remove column D from RowFields
pivotTable.getCTPivotTableDefinition().getRowFields().removeField(3);
pivotTable.getCTPivotTableDefinition().getRowFields().setCount(3);
//create ColFields for column D
pivotTable.getCTPivotTableDefinition().addNewColFields().addNewField().setX(3);
pivotTable.getCTPivotTableDefinition().getColFields().setCount(1);
pivotTable.addColumnLabel(DataConsolidateFunction.SUM, 4, "Sum");
workbook.write(new FileOutputStream("PivotExample_New.xlsx"));
workbook.close();
}
}
此代码需要ooxml-schemas-1.3.jar
作为中提到的Apache POI常见问题 。
结果: