我要替换 docx 文件头中的标记。我已经处理了段落和表格中的标记替换,但它没有选择标题数据。我使用 apache poi 3.8 并使用 eclipse ID 在 java 中编码。谢谢
问问题
8450 次
4 回答
14
此方法将替换整个文档中表格、标题和段落中的所有选定文本。
public XWPFDocument replacePOI(XWPFDocument doc, String placeHolder, String replaceText){
// REPLACE ALL HEADERS
for (XWPFHeader header : doc.getHeaderList())
replaceAllBodyElements(header.getBodyElements(), placeHolder, replaceText);
// REPLACE BODY
replaceAllBodyElements(doc.getBodyElements(), placeHolder, replaceText);
return doc;
}
private void replaceAllBodyElements(List<IBodyElement> bodyElements, String placeHolder, String replaceText){
for (IBodyElement bodyElement : bodyElements) {
if (bodyElement.getElementType().compareTo(BodyElementType.PARAGRAPH) == 0)
replaceParagraph((XWPFParagraph) bodyElement, placeHolder, replaceText);
if (bodyElement.getElementType().compareTo(BodyElementType.TABLE) == 0)
replaceTable((XWPFTable) bodyElement, placeHolder, replaceText);
}
}
private void replaceTable(XWPFTable table, String placeHolder, String replaceText) {
for (XWPFTableRow row : table.getRows()) {
for (XWPFTableCell cell : row.getTableCells()) {
for (IBodyElement bodyElement : cell.getBodyElements()) {
if (bodyElement.getElementType().compareTo(BodyElementType.PARAGRAPH) == 0) {
replaceParagraph((XWPFParagraph) bodyElement, placeHolder, replaceText);
}
if (bodyElement.getElementType().compareTo(BodyElementType.TABLE) == 0) {
replaceTable((XWPFTable) bodyElement, placeHolder, replaceText);
}
}
}
}
}
private void replaceParagraph(XWPFParagraph paragraph, String placeHolder, String replaceText) {
for (XWPFRun r : paragraph.getRuns()) {
String text = r.getText(r.getTextPosition());
if (text != null && text.contains(placeHolder)) {
text = text.replace(placeHolder, replaceText);
r.setText(text, 0);
}
}
}
于 2015-05-08T19:08:42.827 回答
4
我不知道你是否有这个问题的解决方案。但是,我尝试替换文档标题中的标记,它对我有用。
public XWPFDocument setHeader(XWPFDocument document, String token, String textToReplace){
XWPFHeaderFooterPolicy policy= document.getHeaderFooterPolicy();
XWPFHeader header = policy.getHeader(0);
replaceInParagraphs(header.getParagraphs(), token, textToReplace);
return document;
}
private void replaceInParagraphs(List<XWPFParagraph> paragraphs, String placeHolder, String replaceText){
for (XWPFParagraph xwpfParagraph : paragraphs) {
List<XWPFRun> runs = xwpfParagraph.getRuns();
for (XWPFRun run : runs) {
String runText = run.getText(run.getTextPosition());
if(placeHolder !="" && !placeHolder.isEmpty()){
if(runText != null &&
Pattern.compile(placeHolder, Pattern.CASE_INSENSITIVE).matcher(runText).find()){
runText = replaceText;
}
}
run.setText(runText, 0);
}
}
}
希望这可以帮助。:)
于 2014-02-23T12:49:54.003 回答
0
您可以利用 MS Word 中的“内容控件”。然后,您可以使用 openxml 库访问内容控件。内容控件充当 Word 文档中的占位符/输入部分。我不是 Java 人,但只是让你知道这是另一种方法
于 2013-10-16T00:53:21.613 回答
0
引用的代码(编辑于 2016 年 9 月 30 日 1:19,Julio Villane)仅适用于整个文档的标题。感谢您的代码。要在 Footer 中替换,必须在 FooterList 的内部迭代中调用相同的代码。要在除页眉和页脚之外的文档中替换,您必须再次调用replaceParagraph()、replaceTable() 来替换除页眉和页脚之外的文档中的文本。
于 2019-01-17T11:23:05.307 回答