You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Apache POI透视表技术问询:如何移除红色标记的分组汇总行?

Apache POI透视表:移除行小计的方法

你提到的红色标记行官方名称是行小计(Row Subtotals),这是Excel透视表针对行分组自动生成的汇总行。

要移除这些行,需要在代码中为每个行字段设置禁用小计,修改后的完整代码如下:

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.*;

public class CreatePivotTableComplex {

 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", "Date"},
    new Object[]{"A", "C1", 2d, 123.56, "2023-05-22"},
    new Object[]{"B", "C1", 4d, 34.56, "2023-05-23"},
    new Object[]{"A", "C2", 1d, 56.78, "2023-05-24"},
    new Object[]{"B", "C2", 7d, 23.45, "2023-05-25"},
    new Object[]{"A", "C1", 3d, 234.56, "2023-05-26"},
    new Object[]{"A", "C1", 2d, 132.56, "2023-05-27"},
    new Object[]{"B", "C1", 5d, 78.90, "2023-05-28"}
   };
   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.getCTPivotTableDefinition().getPivotFields().getPivotFieldArray(0).setSubtotal(false);
   
   pivotTable.addRowLabel(1);
   pivotTable.getCTPivotTableDefinition().getPivotFields().getPivotFieldArray(1).setSubtotal(false);
   
   pivotTable.addRowLabel(4);
   pivotTable.getCTPivotTableDefinition().getPivotFields().getPivotFieldArray(4).setSubtotal(false);

   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(false);

   pivotTable.getCTPivotTableDefinition().setRowGrandTotals(false);
   
   pivotTable.getCTPivotTableDefinition().setColGrandTotals(true);
   pivotTable.getCTPivotTableDefinition().setRowGrandTotals(true);
   pivotTable.getCTPivotTableDefinition().setEnableDrill(false);

   for (org.openxmlformats.schemas.spreadsheetml.x2006.main.CTPivotField pivotField : pivotTable.getCTPivotTableDefinition().getPivotFields()
         .getPivotFieldList()) {
      pivotField.setCompact(false);
      pivotField.setOutline(false);
   }

   workbook.write(fileout);

  }

 }
}

核心修改说明:

  • 在添加每个行标签后,通过getPivotFieldArray(index)获取对应透视字段,调用setSubtotal(false)即可禁用该行分组的小计行。
  • 注意行字段的索引要与数据列的索引对应(Name对应0、Country对应1、Date对应4)。

内容的提问来源于stack exchange,提问作者cilap

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 16:05:43