【问题标题】:How to Determine Merged Cells range for a given excel sheet using docx4j?如何使用 docx4j 确定给定 Excel 工作表的合并单元格范围?
【发布时间】:2018-04-02 07:15:00
【问题描述】:

我想阅读一个包含一个合并列的 Excel 工作表,我需要处理该列以确定分组的行。这样我就可以将该组视为一个集合。同样,每个合并的行都被视为 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);
    }

【问题讨论】:

  • 告诉我们您的尝试
  • @sidgate 我只尝试过formatter.formatCellValue(row.getC().get(3))。我不知道要调用什么来获取行范围,就像我们在Apache poi 中所做的那样。我浏览了 docx4j 文档,但没有运气。
  • 您可能对codereview.stackexchange.com 感兴趣以查看您的代码。我发现您的方法存在一些问题,但它不在主题范围内。

标签: java-8 docx4j


【解决方案1】:

使用 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
}

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

【讨论】:

  • 谢谢,我也能达到同样的效果,但getRef 只提供String,因此我需要进行更多操作才能使List&lt;Row&gt; 在该范围内。我们是否有其他方法可以做同样的事情? ` 字符串范围 = mcells.getRef(); ` 整数 rowStart =` Integer.parseInt(range.substring(1, 2)); ` 整数 rowEnd =` Integer.parseInt(range.substring(4, 5)); ArrayList&lt;Row&gt; rowss = (ArrayList&lt;Row&gt;) sheetData.getRow().stream().filter(row -&gt; { return row.getR() &gt;= rowStart.longValue() &amp;&amp; row.getR() &lt;= rowEnd.longValue(); }).collect(Collectors.toList());
  • @SathishKumarkk 由于 docx4j 仅提供低级 API 用于访问 Office Open XML 文件,您必须自己实现该功能。请编辑您的问题并将您的方法添加到您的问题中。 PS:在快速查看您的方法后,它仅在列标记小于 27 时才有效(第 27 列是 AA)。它的替代方法可能是对数据进行 XPath 查询,但请注意它可能会更改文档结构!
猜你喜欢
  • 2022-10-31
  • 2013-06-17
  • 1970-01-01
  • 1970-01-01
  • 2019-07-17
  • 1970-01-01
  • 2017-02-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多