如何将一个 docx 插入另一个 docx 的预定行
How to insert a docx into another docx's pre-determined row
我的目标是将一个 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);
}
关于 docx4j,您可以在我们的商业 Docx4j Enterprise 中使用 MergeDocx 在特定位置(例如在 table 单元格中)插入 docx。
您可以从https://www.plutext.com/m/index.php/products
获取试用版
然后查看 MergeIntoTableCell 示例和文档。
其他解决方案是:在我的 mainPart
示例中,我们可以找到文本(使用 indexof / lastindexof / substring 比使用正则表达式更好)并添加(并将文本替换为)addPart
准备出发了。
2个可能的问题:
- 1:如果我们在 addPart 中有编号列表/项目符号列表,添加到其他文档后可能会很乱。
- 2:这种方式无法插入图片,需要其他方式处理
我的目标是将一个 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);
}
关于 docx4j,您可以在我们的商业 Docx4j Enterprise 中使用 MergeDocx 在特定位置(例如在 table 单元格中)插入 docx。
您可以从https://www.plutext.com/m/index.php/products
获取试用版然后查看 MergeIntoTableCell 示例和文档。
其他解决方案是:在我的 mainPart
示例中,我们可以找到文本(使用 indexof / lastindexof / substring 比使用正则表达式更好)并添加(并将文本替换为)addPart
准备出发了。
2个可能的问题:
- 1:如果我们在 addPart 中有编号列表/项目符号列表,添加到其他文档后可能会很乱。
- 2:这种方式无法插入图片,需要其他方式处理