使用 XWPFParagraph 和 XWPFRun,如何使行打印在同一行上。请看说明

Using XWPFParagraph and XWPFRun, how to make the lines printing on the same. See the description please

我正在使用 Apache POI 从 Java 生成一个 .docx 文件。 我有一个 table 列,如.. table without any entry 我正在使用以下代码在第二行中编写内容。

String itemNames[] = {“Item 1”, “Item Name 2”, "Item 3"};
for(int i=0; i<3; i++) {
 //getRow(1) represents second row of the table
 //printing sr. no
 paragraph = table.getRow(1).getCell(0).addParagraph();
 paragraph.setAlignment(ParagraphAlignment.CENTER);
 paragraph.setVerticalAlignment(TextAlignment.CENTER);
 run = paragraph.createRun();
 run.setText(i+1);

//printing item names
paragraph = table.getRow(1).getCell(1).addParagraph();
paragraph.setAlignment(ParagraphAlignment.CENTER);
paragraph.setVerticalAlignment(TextAlignment.CENTER);
run = paragraph.createRun();
run.setText(itemNames[i]);

//printing qty
paragraph = table.getRow(1).getCell(2).addParagraph();
paragraph.setAlignment(ParagraphAlignment.CENTER);
paragraph.setVerticalAlignment(TextAlignment.CENTER);
run = paragraph.createRun();
run.setText(1 + (i*10));
}

这就是生成如下所示的输出。 Error picture 在这里,如您所见,第 2 行的项目名称不能写在 1 行中,因为单元格宽度小于内容。因此,设置了自动换行,以便该行以 2 行完成写入。但是,其余内容只需要 1 行。

所以当代码打印第三个条目时,它会在 sr no、item name 和 qty 中创建一个新段落并写入值。但是,正如您在图像中看到的那样,输出并不像它应该的那样。

我也尝试获取段落和 运行 中的行数,但我无法获取实际数量,并且由于项目名称较大,我想在其他列中添加中断以将其保存在适当的形式。但是如何找到第 2 行中单元格 2 的每个 运行 的行号?

我要做的是将 table 的第 2 行的内容写入已经存在的行,然后为每个进一步的内容行,使用 XWPFTable.createRow 创建一个新的 XWPFTableRow .

示例:

WordTableExample.docx 中的第一个 table:

import java.io.FileInputStream;
import java.io.FileOutputStream;

import org.apache.poi.xwpf.usermodel.*;

public class WordInsertTableRows {

 public static void main(String[] args) throws Exception {

  XWPFDocument doc = new XWPFDocument(new FileInputStream("WordTableExample.docx"));
  XWPFTable table = doc.getTableArray(0);
  XWPFTableRow row;
  XWPFParagraph paragraph;
  XWPFRun run;

  String itemNames[] = {"Item 1", "Item Name 2", "Item 3"};

  for(int i=0; i<itemNames.length; i++) {
   row = table.getRow(1+i); //getRow(1) represents second row of the table
   if (row == null) row = table.createRow(); //if there is not a row already, then create one
   //printing sr. no
   paragraph = row.getCell(0).getParagraphArray(0);
   if (paragraph == null) paragraph = row.getCell(0).addParagraph();
   paragraph.setAlignment(ParagraphAlignment.CENTER);
   //paragraph.setVerticalAlignment(TextAlignment.CENTER); //this sets valign for the paragraph
   row.getCell(0).setVerticalAlignment(XWPFTableCell.XWPFVertAlign.CENTER); //I suspect you wants set valign for the cell
   run = paragraph.createRun();
   run.setText(""+(i+1));

   //printing item names
   paragraph = row.getCell(1).getParagraphArray(0);
   if (paragraph == null) paragraph = row.getCell(1).addParagraph();
   paragraph.setAlignment(ParagraphAlignment.CENTER);
   //paragraph.setVerticalAlignment(TextAlignment.CENTER);
   row.getCell(1).setVerticalAlignment(XWPFTableCell.XWPFVertAlign.CENTER);
   run = paragraph.createRun();
   run.setText(itemNames[i]);

   //printing qty
   paragraph = row.getCell(2).getParagraphArray(0);
   if (paragraph == null) paragraph = row.getCell(2).addParagraph();
   //paragraph.setVerticalAlignment(TextAlignment.CENTER);
   row.getCell(2).setVerticalAlignment(XWPFTableCell.XWPFVertAlign.CENTER);
   run = paragraph.createRun();
   run.setText(""+(1 + (i*10)));
  }

  doc.write(new FileOutputStream("WordTableExampleNew.docx"));

  doc.close();
 }
}