XWPFRun 生成修剪了空格的运行
XWPFRun generating runs with whitespaces trimmed
我开发了一个 Java 代码,它使用 Apache POI 替换模板中的一些字符串模式,然后生成一个输出 docx 文件。替换 headers 和段落中的模式很容易,但我在尝试替换内部文本框时遇到了问题。我正在使用 Axel Ritcher 在 中提供的代码,但问题是它在每个 运行 上修剪了一些空白。
例如:
cp -r basedir destination
变为:
cp-r basedir destination
负责做这个替换的部分代码是这样的(函数的参数是:doc_buffer是一个XWPFDocument,pattern和replacement都是Strings):
for (XWPFParagraph paragraph : doc_buffer.getParagraphs()) {
XmlCursor cursor = paragraph.getCTP().newCursor();
cursor.selectPath(
"declare namespace w='http://schemas.openxmlformats.org/wordprocessingml/2006/main' .//*/w:txbxContent/w:p/w:r");
List<XmlObject> ctrsintxtbx = new ArrayList<XmlObject>();
while (cursor.hasNextSelection()) {
cursor.toNextSelection();
XmlObject obj = cursor.getObject();
ctrsintxtbx.add(obj);
}
for (XmlObject obj : ctrsintxtbx) {
CTR ctr = CTR.Factory.parse(obj.toString());
XWPFRun bufferrun = new XWPFRun(ctr, (IRunBody) paragraph);
String text = bufferrun.getText(0);
if ((text != null) && (text.contains(pattern))) {
text = text.replaceAll(pattern, replacement);
bufferrun.setText(text, 0);
}
obj.set(bufferrun.getCTR());
}
}
如果您需要任何其他信息,请告诉我。
提前致谢!
不知何故,我设法找到了导致此问题的问题。我将 post 放在这里,这样如果有人遇到同样的问题,他们可以看到我是如何解决的。
示例中使用的方法CTR.Factory.parse需要String类型,但是如果您检查XmlObject.Factory docs,有许多解析函数需要不同类型的参数才能使用。所以我改变了这一行:
CTR ctr = CTR.Factory.parse(obj.toString());
到接受 XMLInputStream 作为参数的方法,然后为 XmlObject 创建一个新的 InputStream:
CTR ctr = CTR.Factory.parse(obj.newInputStream());
我开发了一个 Java 代码,它使用 Apache POI 替换模板中的一些字符串模式,然后生成一个输出 docx 文件。替换 headers 和段落中的模式很容易,但我在尝试替换内部文本框时遇到了问题。我正在使用 Axel Ritcher 在
例如:
cp -r basedir destination
变为:
cp-r basedir destination
负责做这个替换的部分代码是这样的(函数的参数是:doc_buffer是一个XWPFDocument,pattern和replacement都是Strings):
for (XWPFParagraph paragraph : doc_buffer.getParagraphs()) {
XmlCursor cursor = paragraph.getCTP().newCursor();
cursor.selectPath(
"declare namespace w='http://schemas.openxmlformats.org/wordprocessingml/2006/main' .//*/w:txbxContent/w:p/w:r");
List<XmlObject> ctrsintxtbx = new ArrayList<XmlObject>();
while (cursor.hasNextSelection()) {
cursor.toNextSelection();
XmlObject obj = cursor.getObject();
ctrsintxtbx.add(obj);
}
for (XmlObject obj : ctrsintxtbx) {
CTR ctr = CTR.Factory.parse(obj.toString());
XWPFRun bufferrun = new XWPFRun(ctr, (IRunBody) paragraph);
String text = bufferrun.getText(0);
if ((text != null) && (text.contains(pattern))) {
text = text.replaceAll(pattern, replacement);
bufferrun.setText(text, 0);
}
obj.set(bufferrun.getCTR());
}
}
如果您需要任何其他信息,请告诉我。
提前致谢!
不知何故,我设法找到了导致此问题的问题。我将 post 放在这里,这样如果有人遇到同样的问题,他们可以看到我是如何解决的。
示例中使用的方法CTR.Factory.parse需要String类型,但是如果您检查XmlObject.Factory docs,有许多解析函数需要不同类型的参数才能使用。所以我改变了这一行:
CTR ctr = CTR.Factory.parse(obj.toString());
到接受 XMLInputStream 作为参数的方法,然后为 XmlObject 创建一个新的 InputStream:
CTR ctr = CTR.Factory.parse(obj.newInputStream());