java - 如何在 DOCX 中使用 POI 从单元格顶部写入

标签 java apache-poi docx

我正在阅读两个 docx 文件,并将第一个文件的表格单元格中的文本替换为第二个文件中的文本。要替换的单元格中有一个标记([#indicator#])。 文本将写入表格的单元格中,其中确实存在标记。我的问题是,写入后单元格的开头总是有一些空白区域。图中“Rechnerische Ergebnisse:”字样上方empty space at top 。 如何在单元格的开头写入或删除空格? 这是代码:

private void insertText(final XWPFDocument docxErsetzt) throws FileNotFoundException, IOException {
    FileInputStream fis = new FileInputStream("src\\main\\resources\\WordTemplate\\text.docx");
    XWPFDocument textInhalt = new XWPFDocument(fis);
    List<XWPFParagraph> paragraphsInhat = textInhalt.getParagraphs();
    List<XWPFTable> table = docxErsetzt.getTables();
    for (XWPFTable xwpfTable : table) {
        List<XWPFTableRow> row = xwpfTable.getRows();
        for (XWPFTableRow xwpfTableRow : row) {
            List<XWPFTableCell> cell = xwpfTableRow.getTableCells();
            for (XWPFTableCell c : cell) {
                if (c.getText().contains("[#indicator#]")) {
                    // remove [#indicator#] 
                    c.removeParagraph(0);
                    for (XWPFParagraph para : paragraphsInhat) {
                        XWPFRun newRun = c.addParagraph().createRun();
                        newRun.removeBreak();
                        newRun.removeCarriageReturn();
                        newRun.setText(para.getText(), 0);

                        for (XWPFRun run : para.getRuns()) {
                            String textInRun = run.getText(0);
                            if (textInRun == null || textInRun.isEmpty()) {
                                continue;
                            }
                            newRun.setFontSize(run.getFontSize());
                            newRun.setFontFamily(run.getFontFamily());
                            newRun.setBold(run.isBold());
                            newRun.setItalic(run.isItalic());
                            newRun.setStrikeThrough(run.isStrikeThrough());
                            newRun.setUnderline(run.getUnderline());
                            newRun.setColor(run.getColor());
                        }
                    }
                }
            }
        }
    }
    docxErsetzt.write(new FileOutputStream(OUTPUTPATH + "textreplaced.docx"));
    docxErsetzt.close();
    textInhalt.close();
}

最佳答案

一个XWPFParagraph由一个或多个XWPFRun实例组成,不要删除该段落,尝试通过这种方式更改其内容:

public void changeText(XWPFParagraph p, String newText) {
   List<XWPFRun> runs = p.getRuns();
   for(int i = runs.size() - 1; i > 0; i--) {
      p.removeRun(i);
   }
   XWPFRun run = runs.get(0);
   run.setText(newText, 0);
}

关于java - 如何在 DOCX 中使用 POI 从单元格顶部写入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36305361/

相关文章:

java - 正则表达式 + Java : split a text into words and removing punctuation only if they are alone or at the end

java - 无法读取整个 header ;读取 0 字节;预计 512 字节

xml - 如何自动将 Doc/Docx 转换为单个 XML 文件?

xml - 以 word (.docx) 形式将复选框标记为已选中

java - MyBatis 返回 hashmap 真实类型

java - "Back button"不关闭 Activity

jvm - 原始包装器实例化是否会导致 JDK 1.6 中的内存分配

excel - 查找 Excel 文件损坏的原因

java - 打开xls文件时出现异常

JAVA POI DOCX 替换段落中的文本