使用 java 为 docx 中的每个部分查找并替换不同 header 中的文本
find and replace a text in different header for each section in docx using java
我正在尝试使用 Apache poi 在每个页面中查找和替换 header 的文本不同部分,但只获得空数据,但 Docx 也有不同的 header 部分和页脚
package com.concretepage;
import java.io.FileInputStream;
import org.apache.poi.openxml4j.opc.OPCPackage;
import org.apache.poi.xwpf.model.XWPFHeaderFooterPolicy;
import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.apache.poi.xwpf.usermodel.XWPFFooter;
import org.apache.poi.xwpf.usermodel.XWPFHeader;
public class ReadDOCXHeaderFooter {
public static void main(String[] args) {
try {
FileInputStream fis = new FileInputStream("D:/docx/read-test.docx");
XWPFDocument xdoc=new XWPFDocument(OPCPackage.open(fis));
XWPFHeaderFooterPolicy policy = new XWPFHeaderFooterPolicy(xdoc);
//read header
for(int i=0;i<90;i++)
{
XWPFHeader header = policy.getHeader(i);
List<XWPFRun> runs = header.getRuns();
if (runs != null) {
for (XWPFRun r : runs) {
String text = r.getText(0);
if (text != null && text.contains("$$key$$")) {
text = text.replace("$$key$$", "ABCD");//your content
r.setText(text, 0);
}
}
System.out.println(header.getText());
//read footer
XWPFFooter footer = policy.getFooter(i);
System.out.println(footer.getText());
}
} catch(Exception ex) {
ex.printStackTrace();
}
}
}
1.Screen Docx header 部分的截图。
2.Screen Docx 截图 header 另一个部分。
3.Screen Docx 截图 header 另一个部分。
4.Screen射门
在包含多个部分的 *.docx
文档中,每个部分都从一个设置了部分属性的段落开始。要从部分属性中获取页眉和页脚,可以使用 public XWPFHeaderFooterPolicy(XWPFDocument doc, org.openxmlformats.schemas.wordprocessingml.x2006.main.CTSectPr sectPr) 构造函数。
只有最后一节的节属性设置在文档正文中。
所以下面的代码应该从文档的所有部分中获取所有页眉和页脚。
import java.io.FileInputStream;
import org.apache.poi.xwpf.usermodel.*;
import org.apache.poi.xwpf.model.XWPFHeaderFooterPolicy;
public class ReadWordAllHeaderFooters {
static void getAllHeaderFooterFromPolicy(XWPFHeaderFooterPolicy headerFooterPolicy) {
XWPFHeader header;
XWPFFooter footer;
header = headerFooterPolicy.getDefaultHeader();
if (header != null) System.out.println("DefaultHeader: " + header.getText());
header = headerFooterPolicy.getFirstPageHeader();
if (header != null) System.out.println("FirstPageHeader: " + header.getText());
header = headerFooterPolicy.getEvenPageHeader();
if (header != null) System.out.println("EvenPageHeader: " + header.getText());
header = headerFooterPolicy.getOddPageHeader();
if (header != null) System.out.println("OddPageHeader: " + header.getText());
footer = headerFooterPolicy.getDefaultFooter();
if (footer != null) System.out.println("DefaultFooter: " + footer.getText());
footer = headerFooterPolicy.getFirstPageFooter();
if (footer != null) System.out.println("FirstPageFooter: " + footer.getText());
footer = headerFooterPolicy.getEvenPageFooter();
if (footer != null) System.out.println("EvenPageFooter: " + footer.getText());
footer = headerFooterPolicy.getOddPageFooter();
if (footer != null) System.out.println("OddPageFooter: " + footer.getText());
}
public static void main(String[] args) throws Exception {
XWPFDocument document = new XWPFDocument(new FileInputStream("MultipleHeaderFooters.docx"));
XWPFHeaderFooterPolicy headerFooterPolicy;
//are there paragraphs to start sections?
int section = 1;
for (XWPFParagraph paragraph : document.getParagraphs()) {
if (paragraph.getCTP().isSetPPr()) { //paragraph has paragraph properties set
if (paragraph.getCTP().getPPr().isSetSectPr()) { //paragraph property has section properties set
//headers and footers in paragraphs section properties:
headerFooterPolicy = new XWPFHeaderFooterPolicy(document, paragraph.getCTP().getPPr().getSectPr());
System.out.println("headers and footers in section properties of section " + section++ + ":");
getAllHeaderFooterFromPolicy(headerFooterPolicy);
}
}
}
//headers and footers in documents body = headers and footers of last section:
headerFooterPolicy = new XWPFHeaderFooterPolicy(document);
System.out.println("headers and footers in documents body = headers and footers of last section " + section + ":");
getAllHeaderFooterFromPolicy(headerFooterPolicy);
}
}
这个函数应该可以完成工作
static void replaceHeaderText(XWPFDocument document, String searchValue, String replacement)
{
List<XWPFHeader> headers = document.getHeaderList();
for(XWPFHeader h : headers)
{
for (XWPFParagraph p : h.getParagraphs()) {
List<XWPFRun> runs = p.getRuns();
if (runs != null) {
for (XWPFRun r : runs) {
String text = r.getText(0);
if (text != null && text.contains(searchValue)) {
text = text.replace(searchValue, replacement);
r.setText(text, 0);
}
}
}
}
for (XWPFTable tbl : h.getTables()) {
for (XWPFTableRow row : tbl.getRows()) {
for (XWPFTableCell cell : row.getTableCells()) {
for (XWPFParagraph p : cell.getParagraphs()) {
for (XWPFRun r : p.getRuns()) {
String text = r.getText(0);
if (text != null && text.contains(searchValue)) {
text = text.replace(searchValue, replacement);
r.setText(text,0);
}
}
}
}
}
}
}
}
我正在尝试使用 Apache poi 在每个页面中查找和替换 header 的文本不同部分,但只获得空数据,但 Docx 也有不同的 header 部分和页脚
package com.concretepage;
import java.io.FileInputStream;
import org.apache.poi.openxml4j.opc.OPCPackage;
import org.apache.poi.xwpf.model.XWPFHeaderFooterPolicy;
import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.apache.poi.xwpf.usermodel.XWPFFooter;
import org.apache.poi.xwpf.usermodel.XWPFHeader;
public class ReadDOCXHeaderFooter {
public static void main(String[] args) {
try {
FileInputStream fis = new FileInputStream("D:/docx/read-test.docx");
XWPFDocument xdoc=new XWPFDocument(OPCPackage.open(fis));
XWPFHeaderFooterPolicy policy = new XWPFHeaderFooterPolicy(xdoc);
//read header
for(int i=0;i<90;i++)
{
XWPFHeader header = policy.getHeader(i);
List<XWPFRun> runs = header.getRuns();
if (runs != null) {
for (XWPFRun r : runs) {
String text = r.getText(0);
if (text != null && text.contains("$$key$$")) {
text = text.replace("$$key$$", "ABCD");//your content
r.setText(text, 0);
}
}
System.out.println(header.getText());
//read footer
XWPFFooter footer = policy.getFooter(i);
System.out.println(footer.getText());
}
} catch(Exception ex) {
ex.printStackTrace();
}
}
}
1.Screen Docx header 部分的截图。
2.Screen Docx 截图 header 另一个部分。
3.Screen Docx 截图 header 另一个部分。
4.Screen射门
在包含多个部分的 *.docx
文档中,每个部分都从一个设置了部分属性的段落开始。要从部分属性中获取页眉和页脚,可以使用 public XWPFHeaderFooterPolicy(XWPFDocument doc, org.openxmlformats.schemas.wordprocessingml.x2006.main.CTSectPr sectPr) 构造函数。
只有最后一节的节属性设置在文档正文中。
所以下面的代码应该从文档的所有部分中获取所有页眉和页脚。
import java.io.FileInputStream;
import org.apache.poi.xwpf.usermodel.*;
import org.apache.poi.xwpf.model.XWPFHeaderFooterPolicy;
public class ReadWordAllHeaderFooters {
static void getAllHeaderFooterFromPolicy(XWPFHeaderFooterPolicy headerFooterPolicy) {
XWPFHeader header;
XWPFFooter footer;
header = headerFooterPolicy.getDefaultHeader();
if (header != null) System.out.println("DefaultHeader: " + header.getText());
header = headerFooterPolicy.getFirstPageHeader();
if (header != null) System.out.println("FirstPageHeader: " + header.getText());
header = headerFooterPolicy.getEvenPageHeader();
if (header != null) System.out.println("EvenPageHeader: " + header.getText());
header = headerFooterPolicy.getOddPageHeader();
if (header != null) System.out.println("OddPageHeader: " + header.getText());
footer = headerFooterPolicy.getDefaultFooter();
if (footer != null) System.out.println("DefaultFooter: " + footer.getText());
footer = headerFooterPolicy.getFirstPageFooter();
if (footer != null) System.out.println("FirstPageFooter: " + footer.getText());
footer = headerFooterPolicy.getEvenPageFooter();
if (footer != null) System.out.println("EvenPageFooter: " + footer.getText());
footer = headerFooterPolicy.getOddPageFooter();
if (footer != null) System.out.println("OddPageFooter: " + footer.getText());
}
public static void main(String[] args) throws Exception {
XWPFDocument document = new XWPFDocument(new FileInputStream("MultipleHeaderFooters.docx"));
XWPFHeaderFooterPolicy headerFooterPolicy;
//are there paragraphs to start sections?
int section = 1;
for (XWPFParagraph paragraph : document.getParagraphs()) {
if (paragraph.getCTP().isSetPPr()) { //paragraph has paragraph properties set
if (paragraph.getCTP().getPPr().isSetSectPr()) { //paragraph property has section properties set
//headers and footers in paragraphs section properties:
headerFooterPolicy = new XWPFHeaderFooterPolicy(document, paragraph.getCTP().getPPr().getSectPr());
System.out.println("headers and footers in section properties of section " + section++ + ":");
getAllHeaderFooterFromPolicy(headerFooterPolicy);
}
}
}
//headers and footers in documents body = headers and footers of last section:
headerFooterPolicy = new XWPFHeaderFooterPolicy(document);
System.out.println("headers and footers in documents body = headers and footers of last section " + section + ":");
getAllHeaderFooterFromPolicy(headerFooterPolicy);
}
}
这个函数应该可以完成工作
static void replaceHeaderText(XWPFDocument document, String searchValue, String replacement)
{
List<XWPFHeader> headers = document.getHeaderList();
for(XWPFHeader h : headers)
{
for (XWPFParagraph p : h.getParagraphs()) {
List<XWPFRun> runs = p.getRuns();
if (runs != null) {
for (XWPFRun r : runs) {
String text = r.getText(0);
if (text != null && text.contains(searchValue)) {
text = text.replace(searchValue, replacement);
r.setText(text, 0);
}
}
}
}
for (XWPFTable tbl : h.getTables()) {
for (XWPFTableRow row : tbl.getRows()) {
for (XWPFTableCell cell : row.getTableCells()) {
for (XWPFParagraph p : cell.getParagraphs()) {
for (XWPFRun r : p.getRuns()) {
String text = r.getText(0);
if (text != null && text.contains(searchValue)) {
text = text.replace(searchValue, replacement);
r.setText(text,0);
}
}
}
}
}
}
}
}