POI多级组与初级组行重叠无效

The row overlap between multi-level and primary groups of POI is not effective

  1. maven 版本
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi</artifactId>
            <version>4.1.2</version>
        </dependency>
  1. 代码演示
    private static void collapseRow() throws IOException {
        try (SXSSFWorkbook wb2 = new SXSSFWorkbook(100)) {
            SXSSFSheet sheet2 = wb2.createSheet("new sheet");

            int rowCount = 20;
            for (int i = 0; i < rowCount; i++) {
                sheet2.createRow(i);
            }
            //The first stage
            sheet2.groupRow(0, 10);
            //second stage
            sheet2.groupRow(1, 2);
            //second stage
            sheet2.groupRow(5, 6);
            //second stage
            sheet2.groupRow(8, 10);
            try (FileOutputStream fileOut = new FileOutputStream("outlining_collapsed.xlsx")) {
                wb2.write(fileOut);
            } finally {
                wb2.dispose();
            }
        }
    }
  1. sheet2.groupRow(8, 10);为什么没有生效 sheet2.groupRow(8, 10); Why didn't it take effect

这甚至不可能使用 Excel 本身。

第一阶段 sheet2.groupRow(0, 10); 从第 1 行(行索引 0)到第 11 行(行索引 10)创建大纲级别 1,在第 12 行的 header 行中具有大纲级别处理程序。

第二阶段 sheet2.groupRow(1, 2);sheet2.groupRow(5, 6); 在大纲级别 2 中创建两个组,在第 4 行和第 8 行的第 header 行中具有大纲级别处理程序。

然后 sheet2.groupRow(8, 10); 尝试在大纲级别 2 从第 9 行(行索引 8)到第 11 行(行索引 10)创建另一个组。但是大纲级别处理程序必须在第 12 行的 header 行中。但这是不可能的,因为已经存在大纲级别 1 的大纲级别处理程序。一行不能有两个不同的大纲级别处理程序。

分组 sheet2.groupRow(8, 9); 可行。

或者您必须使用 sheet2.groupRow(0, 11); 在大纲级别 1 中设置第 12 行,因此该大纲级别的大纲级别处理程序将在第 13 行中。

如果您在代码创建 outlining_collapsed.xlsx 后尝试对 Excel 中的第 9 行到第 11 行进行分组,这将为这些行创建一个新的大纲级别。这看起来像这样:

我怀疑这是你想要的。 apache poi 不会使用它的高级 类 创建它。它可以使用底层低级别 类 而不是使用 SXSSF 来实现,因为它无法访问底层低级别 类.

使用 XSSF 的示例:

import java.io.FileOutputStream;

import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.apache.poi.xssf.usermodel.XSSFSheet;

class CreateExcelGroupRowsTest {

 private static void collapseRow() throws Exception {
  try (XSSFWorkbook wb2 = new XSSFWorkbook()) {
   XSSFSheet sheet2 = wb2.createSheet("new sheet");

   int rowCount = 20;
   for (int i = 0; i < rowCount; i++) {
    sheet2.createRow(i);
   }
   //The first stage
   sheet2.groupRow(0, 10);
   //second stage
   sheet2.groupRow(1, 2);
   //second stage
   sheet2.groupRow(5, 6);

   //second stage
   sheet2.groupRow(8, 10);
   //set new outline level for rows 9 to 11
   for (int r = 8; r <= 10; r++) {
    sheet2.getRow(r).getCTRow().setOutlineLevel((short)3);
   }

   try (FileOutputStream fileOut = new FileOutputStream("outlining_collapsed.xlsx")) {
    wb2.write(fileOut);
   } finally {
    //wb2.dispose();
   }
  }
 }
 public static void main(String[] args) throws Exception {
  collapseRow();
 }
}