我想在docx文件的标题中替换标记。我已经处理了段落和表格中的标记替换,但它没有选择标题数据。我使用apache poi 3.8并使用eclipse ID在java中编码。 Thanx
答案 0 :(得分:9)
此方法将替换整个文档中的表格,标题和段落中的所有选定文本。
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);
}
}
}
答案 1 :(得分:3)
我不知道你是否有这个问题的解决方案。但是,我试图在文档标题中替换标记,它对我有用。
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);
}
}
}
希望这会有所帮助。 :)
答案 2 :(得分:0)
您可以在MS Word中利用“内容控件”。然后,您可以使用openxml库访问内容控件。内容控件充当Word文档中的占位符/输入节。我不是Java人,但只是让你知道这是另一种方法
答案 3 :(得分:0)
引用的代码(由Julio Villane编辑于2016年9月30日在1:19) 仅适用于文档中的标题。 感谢您的代码。 要替换页脚, 在FooterList的内部迭代中必须调用相同的代码。 要跨页眉和页脚以外的文档进行替换, 您必须再次调用replaceParagraph(),replaceTable()才能在整个文档中替换页眉和页脚之外的文本。