【问题标题】:How to insert a docx into another docx's pre-determined row如何将一个 docx 插入另一个 docx 的预定行
【发布时间】:2020-08-07 14:02:59
【问题描述】:

我的目标是将一个 docx(保持样式/格式)插入另一个 docx 的特定行。在第二个 docx 中有一个词,“占位符”,首先,我必须找到这个词,然后将其更改为第一个 docx 文本,保留插入的 docx 样式和格式。

我有个主意。也许我应该创建一个新的 docx,将第二个 docx 与“占位符”分开,将第一部分放入新的 docx,然后放入整个 docx,然后放入第二个 docx 的第二部分。但是我怎样才能保持样式和格式呢?我没有图像/平板电脑或任何东西,只有文本和格式的东西,如列表、标签、文本样式等。

目前我正在使用 apache POI 和 java。 (我尝试了 docx4j,但成功率较低) 示例代码进行了简单的合并,仅此而已。我怎样才能找到“占位符”这个词并在那里插入我的 docx?

public static void merge(InputStream src1, InputStream src2, OutputStream dest) throws Exception {
    OPCPackage src1Package = OPCPackage.open(src1);
    OPCPackage src2Package = OPCPackage.open(src2);
    XWPFDocument src1Document = new XWPFDocument(src1Package);
    CTBody src1Body = src1Document.getDocument().getBody();
    XWPFDocument src2Document = new XWPFDocument(src2Package);
    CTBody src2Body = src2Document.getDocument().getBody();
    appendBody(src1Body, src2Body);
    src1Document.write(dest);
}

private static void appendBody(CTBody src, CTBody append) throws Exception {
    XmlOptions optionsOuter = new XmlOptions();
    optionsOuter.setSaveOuter();
    String appendString = append.xmlText(optionsOuter);
    String srcString = src.xmlText();
    String prefix = srcString.substring(0, srcString.indexOf(">") + 1);
    String mainPart = srcString.substring(srcString.indexOf(">") + 1, srcString.lastIndexOf("<"));
    String suffix = srcString.substring(srcString.lastIndexOf("<"));
    String addPart = appendString.substring(appendString.indexOf(">") + 1, appendString.lastIndexOf("<"));
    CTBody makeBody = CTBody.Factory.parse(prefix + mainPart + addPart + suffix);
    src.set(makeBody);
}

【问题讨论】:

    标签: java apache-poi docx docx4j


    【解决方案1】:

    关于 docx4j,您可以在我们的商业 Docx4j Enterprise 中使用 MergeDocx 在特定位置(例如,在表格单元格中)插入 docx。

    您可以从https://www.plutext.com/m/index.php/products获得试用版

    然后查看 MergeIntoTableCell 示例和文档。

    【讨论】:

      【解决方案2】:

      其他解决方案是:在mainPart 的示例中,我们可以找到文本(使用 indexof / lastindexof / substring 比使用正则表达式更好)并添加(并将文本替换到)addPart 并准备好去吧。

      2个可能的问题:

      • 1:如果我们在 addPart 中有编号列表/项目符号列表,添加到其他文档后可能会很混乱。
      • 2:这种方式不能插入图片,必须用其他方式处理。

      【讨论】:

      • 没错,您的方法仅适用于简单的情况(如果插入的 docx 的内容是可预测的,这在您的应用程序中可能没问题)。它不保留样式/格式,这是您问题中包含的要求...
      • 好吧,解决方案保留以下内容:字体大小和类型/斜体/粗体/下划线/制表符/距边距的距离,这是一个好的开始。 :) 是的,我的样式和列表有问题。 (我也有解决这些问题的想法,当然不是最好的解决方案,但我们会看到)但是稍后我再尝试 Docx4j,也许我们可以稍后讨论。 (但我更喜欢免费/开源解决方案/库)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-06
      • 2019-04-04
      • 2021-11-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多