如何使用 docx4j 确定给定 excel sheet 的合并单元格范围?

How to Determine Merged Cells range for a given excel sheet using docx4j?

我想阅读具有一个合并列的 excel sheet,我需要处理该列以确定与之分组的行。这样我就可以将该组视为一个集合。同样,每个合并的行都被视为 set1、set2、set3 等。然后我将分别处理每个集合及其行。

更新: 应@fireandfuel 的要求,我包括了我已经到达的方法。

    CTMergeCells mergeCells = workSheet.getMergeCells();
    SheetData sheetData = workSheet.getSheetData();
    List<ArrayList<Row>> rowGroups = new ArrayList<ArrayList<Row>>();
    List<CTMergeCell> cTMergeCells = mergeCells.getMergeCell();
    for(CTMergeCell mcells : cTMergeCells){
        String range = mcells.getRef();
        Integer rowStart = Integer.parseInt(range.substring(1, 2));
        Integer rowEnd = Integer.parseInt(range.substring(4, 5));
        ArrayList<Row> rowss = (ArrayList<Row>) sheetData.getRow().stream().filter(row -> {
            return row.getR() >= rowStart.longValue() && row.getR() <= rowEnd.longValue();
        }).collect(Collectors.toList());
        rowGroups.add((ArrayList<Row>) rowss);
    }

使用 docx4j 在 SpreadsheetML 中访问合并单元格的定义非常容易。

Office Open XML 文件(docx、xlsx 和 pptx)只是包含 XML 文件的 ZIP 压缩文件。你可以用最多的存档程序打开它,看看它的文件结构和文件。

下面是使用 docx4j 访问合并单元格定义的一些源代码:

// load yourFile.xlsx file
SpreadsheetMLPackage spreadsheetMLPackage = SpreadsheetMLPackage.load(new File("yourFile.xlsx"));

// get worksheet from /xl/worksheets/yourSheet.xml file from yourFile.xlsx
WorksheetPart worksheetPart = (WorksheetPart) spreadsheetMLPackage.getParts().get(new PartName("/xl/worksheets/yourSheet.xml")); 
Worksheet worksheet = worksheetPart.getJaxbElement();

// get the merged cells
CTMergeCells ctMergedCells = worksheet.getMergeCells();
if(ctMergedCells != null){
    List<CTMergeCell> mergedCellList = ctMergedCells.getMergeCell();
    // do something with the merged cells
}

class org.xlsx4j.sml.CTMergeCell 有一个函数 getRef,它为您提供合并为 String、编码为 begin:end 的单元格的引用,例如A1:B2(从 A1B2 的合并单元格:A1A2B1B2)。