需要使用Apache POI JAVA在Excel中启用“经典数据透视表布局”选项

3gtaxfhh  于 2023-02-25  发布在  Apache
关注(0)|答案(1)|浏览(237)

我在ExcelSheet中有一些数据,并且我正在尝试创建具有多个列标签和行标签的透视表。我需要在启用“经典透视表布局”选项的情况下生成透视表。我尝试使用以下代码执行此操作,但似乎不起作用。

org.openxmlformats.schemas.spreadsheetml.x2006.main.CTExtensionList extList = pivotTable.getCTPivotTableDefinition().addNewExtLst();
           org.openxmlformats.schemas.spreadsheetml.x2006.main.CTExtension ext = extList.addNewExt();
           String extXML = "<x14:pivotTableDefinition"
                    + " xmlns:x14=\"http://schemas.microsoft.com/office/spreadsheetml/2009/9/main\">"
                    + "<x14:pivotTableStyleInfo showColStripes=\"0\" showRowStripes=\"0\" showLastColumn=\"0\" showRowHeaders=\"1\" showColumnHeaders=\"1\"/></x14:pivotTableDefinition>";
          System.out.println(extXML);
           org.apache.xmlbeans.XmlObject xmlObject = org.apache.xmlbeans.XmlObject.Factory.parse(extXML);          
                ext.set(xmlObject);
                ext.setUri("{EB79DEF2-80B8-43e5-95BD-54CBDDF9020C}");

有没有办法使用APACHE POI/ooxml在excel中启用经典数据透视表布局。

t40tm48m

t40tm48m1#

“经典数据透视表布局”包含以下设置:
在透视表定义中:

  • 将Grid Drop Zones设置为true可显示透视字段的拖放区。
  • 将“压缩”和“压缩数据”设置为false,使整个版面不是压缩版面。
  • Microsoft Excel本身也将“多字段筛选”设置为false,将“项打印标题”设置为true。但这似乎不是真的必要。

在透视字段中:
对于每个透视字段,设置Compact false并设置Outline false。每个透视字段布局既不需要紧凑,也不需要轮廓。
下面的完整示例说明了这一点。它将生成一个使用“经典数据透视表布局”的私有表:

import java.io.FileOutputStream;

import org.apache.poi.ss.*;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.ss.util.*;
import org.apache.poi.xssf.usermodel.*;

class CreatePivotTable {

 public static void main(String[] args) throws Exception {

  try (Workbook workbook = new XSSFWorkbook(); 
       FileOutputStream fileout = new FileOutputStream("Excel.xlsx") ) {

   Sheet pivotSheet = workbook.createSheet("Pivot");
   Sheet dataSheet = workbook.createSheet("Data");

   Row row;
   Cell cell;
   Object[][] data = new Object[][]{
    new Object[]{"Name", "Country", "Count", "Value"},
    new Object[]{"A", "C1", 2d, 123.56},
    new Object[]{"B", "C1", 4d, 34.56},
    new Object[]{"A", "C2", 1d, 56.78},
    new Object[]{"B", "C2", 7d, 23.45},
    new Object[]{"A", "C1", 3d, 234.56},
    new Object[]{"B", "C1", 5d, 78.90}
   };
   for (int r = 0; r < data.length; r++) {
    row = dataSheet.createRow(r);
    Object[] rowData = data[r];
    for (int c = 0; c < rowData.length; c++) {
     cell = row.createCell(c);
     if (rowData[c] instanceof String) {
      cell.setCellValue((String)rowData[c]);
     } else if (rowData[c] instanceof Double) {
      cell.setCellValue((Double)rowData[c]);
     }
    }
   }

   AreaReference areaReference = new AreaReference(
    new CellReference(0,0),
    new CellReference(data.length-1, data[0].length-1),
    SpreadsheetVersion.EXCEL2007);

   XSSFPivotTable pivotTable = ((XSSFSheet)pivotSheet).createPivotTable(areaReference, new CellReference("A4"), dataSheet);

   pivotTable.addRowLabel(0);
   pivotTable.addRowLabel(1);
   pivotTable.addColumnLabel(DataConsolidateFunction.SUM, 2, "Sum of count");
   pivotTable.addColumnLabel(DataConsolidateFunction.SUM, 3, "Sum of value");

   pivotTable.getCTPivotTableDefinition().getPivotTableStyleInfo().setName("PivotStyleDark7");
   
   pivotTable.getCTPivotTableDefinition().setCompact(false);
   pivotTable.getCTPivotTableDefinition().setCompactData(false);
   pivotTable.getCTPivotTableDefinition().setGridDropZones(true);
   //pivotTable.getCTPivotTableDefinition().setMultipleFieldFilters(false);
   //pivotTable.getCTPivotTableDefinition().setItemPrintTitles(true);
   for (org.openxmlformats.schemas.spreadsheetml.x2006.main.CTPivotField pivotField : pivotTable.getCTPivotTableDefinition().getPivotFields().getPivotFieldList()) {
    pivotField.setCompact(false);  
    pivotField.setOutline(false);  
   }

   workbook.write(fileout);

  }

 }
}

相关问题