【问题标题】:Apache POI merge cells from a table in a Word documentApache POI 合并 Word 文档中表格中的单元格
【发布时间】:2015-01-28 08:45:09
【问题描述】:

我需要一个表格,将第一行和第二行的单元格合并。

类似这样的:

桌子图片(我不能发图片)http://i.stack.imgur.com/dAO6j.png

我一直在查看与此主题相关的所有问题,并找到了一些将网格跨度应用于单元格的答案,但我找不到真正的解决方案。

这是我从谷歌和本网站获得的示例代码:

    XWPFDocument document = new XWPFDocument();
    XWPFTable table = document.createTable(7, 2);

    fillTable(table);

    XWPFTableCell cellRow1 = table.getRow(0).getCell(0);
    XWPFTableCell cellRow2 = table.getRow(1).getCell(0);

    cellRow1.getCTTc().addNewTcPr();
    cellRow1.getCTTc().getTcPr().addNewGridSpan();
    cellRow1.getCTTc().getTcPr().getGridSpan().setVal(BigInteger.valueOf(2L));

    cellRow2.getCTTc().addNewTcPr();
    cellRow2.getCTTc().getTcPr().addNewGridSpan();
    cellRow2.getCTTc().getTcPr().getGridSpan().setVal(BigInteger.valueOf(2L));

    FileOutputStream out = new FileOutputStream("Table.docx");
    doc.write(out);
    out.close();

我从这段代码中得到以下信息:

我尝试使用table.getRow(0).removeCell(1); 删除“额外”单元格,但没有成功,我做错了什么吗?

【问题讨论】:

    标签: java apache merge apache-poi cells


    【解决方案1】:

    似乎xml也必须删除:

     XWPFTableCell removed = tableRow.getCell(idx);
     removed.getCTTc().newCursor().removeXml();
     tableRow.removeCell(idx);
    

    【讨论】:

    • 它确实有效,非常感谢你我只需要像这样删除:cellRow = table3.getRow(0).getCell(2); cellRow.getCTTc().newCursor().removeXml(); cellRow = table3.getRow(0).getCell(1); cellRow.getCTTc().newCursor().removeXml();
    • 在删除 XML 之前需要从表格中删除单元格。否则会发生 NPE
    【解决方案2】:

    要水平/垂直合并,您需要创建 2 个 CTHMerge 并使用 setVal:

    • 一个用于您将保留的单元格 (STMerge.RESTART);
    • 第二个用于合并单元格 (STMerge.CONTINUE);

    a) 2x2 表格的水平合并示例:

    |___________|___________| --> |___________ ___________|
    |___________|___________| --> |___________ ___________|

    // First Row
    CTHMerge hMerge = CTHMerge.Factory.newInstance();
    vmerge.setVal(STMerge.RESTART);
    table.getRow(0).getCell(0).getCTTc().getTcPr().setHMerge(hMerge);
    table.getRow(1).getCell(0).getCTTc().getTcPr().setHMerge(hMerge);
    
    // Secound Row cell will be merged/"deleted"
    CTHMerge hMerge1 = CTHMerge.Factory.newInstance();
    hMerge.setVal(STMerge.CONTINUE);
    table.getRow(0).getCell(1).getCTTc().getTcPr().setHMerge(hMerge1);
    table.getRow(1).getCell(1).getCTTc().getTcPr().setHMerge(hMerge1);
    

    b) 垂直合并示例:

     // First Row
    CTVMerge vmerge = CTVMerge.Factory.newInstance();
    vmerge.setVal(STMerge.RESTART);
    table.getRow(0).getCell(0).getCTTc().getTcPr().setVMerge(vmerge);
    table.getRow(0).getCell(1).getCTTc().getTcPr().setVMerge(vmerge);
    
     // Secound Row cell will be merged 
    CTVMerge vmerge1 = CTVMerge.Factory.newInstance();
    vmerge.setVal(STMerge.CONTINUE);
    table.getRow(1).getCell(0).getCTTc().getTcPr().setVMerge(vmerge1);
    table.getRow(1).getCell(1).getCTTc().getTcPr().setVMerge(vmerge1);
    

    【讨论】:

    • 这是一个很好的解决方案。但是,如果您打算稍后将 docx 转换为其他格式,请记住,许多库不支持此标记
    【解决方案3】:

    您还可以避免创建额外的单元格,而不是在合并后删除单元格。它需要按顺序添加行和单元格(而不是使用document.createTable()

    对于您的示例,它将是:

    1. 使用 1 个单元格创建第一行,设置文本
    2. 创建下一行,并在其中创建新单元格,设置文本
    3. 创建下一行并设置文本
    4. 合并

    【讨论】:

      猜你喜欢
      • 2021-05-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多