Java 带XWPFTable的行跨度

Java 带XWPFTable的行跨度,java,apache-poi,xwpf,Java,Apache Poi,Xwpf,如何在Java的POI中使用XWPFTable合并超过2行或更多行(行跨度)的单元格 我知道如何将单元格合并到一行中,但我不知道如何合并,也没有找到任何这样的例子 提前谢谢。找到了!感谢您对getCTTc() import java.io.FileOutputStream; import java.io.IOException; import org.apache.poi.xwpf.usermodel.XWPFDocument; import org.apache.poi.xwpf.userm

如何在Java的POI中使用XWPFTable合并超过2行或更多行(行跨度)的单元格

我知道如何将单元格合并到一行中,但我不知道如何合并,也没有找到任何这样的例子


提前谢谢。

找到了!感谢您对
getCTTc()

import java.io.FileOutputStream;
import java.io.IOException;

import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.apache.poi.xwpf.usermodel.XWPFTable;
import org.apache.poi.xwpf.usermodel.XWPFTableCell;
import org.apache.poi.xwpf.usermodel.XWPFTableRow;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.STMerge;


public class VerticalMerge {

    public static void main(String[] args) {

        int rows = 5;
        int cols = 5;

        XWPFDocument document = new XWPFDocument();
        XWPFTable table = document.createTable(rows, cols);

        fillTable(table);

        mergeCellsVertically(table, 3, 1, 3);

        try {
            FileOutputStream out = new FileOutputStream("vertical merge.docx");
            document.write(out);
            out.close();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }

    private static void fillTable(XWPFTable table) {
        for (int rowIndex = 0; rowIndex < table.getNumberOfRows(); rowIndex++) {
            XWPFTableRow row = table.getRow(rowIndex);

            for (int colIndex = 0; colIndex < row.getTableCells().size(); colIndex++) {
                XWPFTableCell cell = row.getCell(colIndex);
                cell.addParagraph().createRun().setText(" cell " + rowIndex + colIndex + " ");
            }
        }
    }

    private static void mergeCellsVertically(XWPFTable table, int col, int fromRow, int toRow) {

        for (int rowIndex = fromRow; rowIndex <= toRow; rowIndex++) {

            XWPFTableCell cell = table.getRow(rowIndex).getCell(col);

            if ( rowIndex == fromRow ) {
                // The first merged cell is set with RESTART merge value
                cell.getCTTc().addNewTcPr().addNewVMerge().setVal(STMerge.RESTART);
            } else {
                // Cells which join (merge) the first one, are set with CONTINUE
                cell.getCTTc().addNewTcPr().addNewVMerge().setVal(STMerge.CONTINUE);
            }
        }
    }

}
import java.io.FileOutputStream;
导入java.io.IOException;
导入org.apache.poi.xwpf.usermodel.XWPFDocument;
导入org.apache.poi.xwpf.usermodel.XWPFTable;
导入org.apache.poi.xwpf.usermodel.XWPFTableCell;
导入org.apache.poi.xwpf.usermodel.XWPFTableRow;
导入org.openxmlformats.schemas.wordprocessingml.x2006.main.STMerge;
公共类垂直运动{
公共静态void main(字符串[]args){
int行=5;
int cols=5;
XWPFDocument document=新的XWPFDocument();
XWPFTable table=document.createTable(行、列);
填充表(table);
垂直合并单元(表3、1、3);
试一试{
FileOutputStream out=新的FileOutputStream(“vertical merge.docx”);
文件。写(出);
out.close();
}捕获(IOE异常){
e、 printStackTrace();
}
}
专用静态空隙填充表(XWPFTable表){
对于(int rowIndex=0;rowIndex对于(int rowIndex=fromRow;rowIndex)您的意思是您已经有了一个包含N行和M列的表,并且您想要合并一些单元格,比如说“B5”和“B6”(我知道您指的是Word,不是Excel,只是以同样的方式描述单元格坐标)或者,你想从头开始创建一个表?这并不重要,我可以创建或更新表。是的,我想要合并像B5和B6这样的单元格。我问的原因是,如果你想从头开始创建表,那么你可以一个单元格一个单元格地创建表单元格,当你想创建大单元格时,你甚至可以尝试插入一个新的表单元格E在旧表中。我花一些时间尝试它,然后发布代码,你对此感兴趣吗?但是如果你对更新现有表有很大的限制,那么我不知道如何更新这一行。谢谢,这是一个很好的开始。另一方面,我发现这个方法看起来很有用,但我不知道如何使用它table.getRow(0).getCell(0).getCTTc().GetCpr().setVMerge(CTVMerge arg);就是这样。非常感谢:)。没有必要在合并的单元格中连接文本。更重要的是,it事件不应该这样做以与POI HSSF(XSSF)保持一致它只是覆盖合并的单元格。好的,明白了。谢谢你提出的一个好问题和一个提示,没有这个提示我就不会找到答案。我还尝试合并一些单元格块,比如2x3单元格,但效果就像我在1x3垂直块上使用了两个单独的垂直合并。可能是为了删除“墙”在这些块之间,我们必须在之后进行水平合并。嗯,根据您的任务,您可以测试一些“二维合并”祝你好运,@blazej!嗨,很好的解决方案!它工作得非常好。我想补充一点,在垂直合并范围内合并每个单元格中的文本的方法是循环遍历要合并的每个单元格,然后循环遍历所有段落和运行,并从每次运行中获取文本。