如何使用docx4j确定给定Excel工作表的合并单元格范围?

时间:2018-04-02 07:15:01

标签: java-8 docx4j

我想阅读一个包含一个合并列的Excel工作表,我需要处理该列以确定分组的行。这样我就可以将该组视为一组。同样,每个合并的行都被视为set1,set2,set3等等。然后我将分别处理每一组的行。

enter image description here

更新 正如@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);
    }

1 个答案:

答案 0 :(得分:0)

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

Office Open XML个文件(docx,xl​​sx和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
}

课程org.xlsx4j.sml.CTMergeCell有一个函数getRef,可以为您提供合并为String的单元格的引用,编码为begin:end,如A1:B2(合并了从A1B2的小区:A1A2B1B2)。