调用方法前需要提前导入poi的maven依赖。
这个方法可以实现每个word前自定义标题以及合并文字、图片、表格、样式、目录...
import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
import org.apache.poi.xwpf.usermodel.*;
import java.io.*;
import java.util.ArrayList;
import java.util.List;
public class Test {
public static void main(String[] args) {
try {
//自行替换文件路径
List<String> list = new ArrayList<>();
list.add("需要合并的doc路径");
list.add("需要合并的doc1路径");
String fileName = "最终版本的doc路径";
CustomXWPFDocument destDoc = new CustomXWPFDocument();
FileOutputStream out = new FileOutputStream(fileName);
for (String s : list) {
// 创建段落对象
XWPFParagraph paragraph = destDoc.createParagraph();
XWPFRun run = paragraph.createRun();
run.setText("自定义标题:");
run.setBold(true);
run.setFontSize(20);
XWPFDocument content = getWordContent(s);
for (IBodyElement bodyElement : content.getBodyElements()) {
boolean hasImage = false;
BodyElementType elementType = bodyElement.getElementType();
if (elementType == BodyElementType.PARAGRAPH) {
//文字
XWPFParagraph srcPr = (XWPFParagraph) bodyElement;
//复制样式
copyStyle(content, destDoc, content.getStyles().getStyle(srcPr.getStyleID()));
XWPFParagraph destPr = destDoc.createParagraph();
for (XWPFRun srcPrRun : srcPr.getRuns()) {
XWPFRun run1 = destPr.createRun();
run1.setText(srcPrRun.text());
if (srcPrRun.getEmbeddedPictures().size() > 0) {
hasImage = true;
}
for (XWPFPicture pic : srcPrRun.getEmbeddedPictures()) {
byte[] img = pic.getPictureData().getData();
long cx = pic.getCTPicture().getSpPr().getXfrm().getExt().getCx();
long cy = pic.getCTPicture().getSpPr().getXfrm().getExt().getCy();
try {
// Working addPicture Code below...
String blipId = destPr.getDocument().addPictureData(new ByteArrayInputStream(img), Document.PICTURE_TYPE_PNG);
destDoc.createPictureCxCy(blipId, destDoc.getNextPicNameNumber(Document.PICTURE_TYPE_PNG), cx, cy);
} catch (InvalidFormatException e1) {
e1.printStackTrace();
}
}
}
if (hasImage == false) {
int pos = destDoc.getParagraphs().size() - 1;
destDoc.setParagraph(srcPr, pos);
}
}else if (elementType == BodyElementType.TABLE) {
XWPFTable table = (XWPFTable) bodyElement;
destDoc.createTable();
int pos = destDoc.getTables().size() - 1;
destDoc.setTable(pos, table);
}
}
}
destDoc.write(out);
out.flush();
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 获取文档
*
* @param filePath
* @return
*/
public static XWPFDocument getWordContent(String filePath) {
File file = new File(filePath);
try (FileInputStream fis = new FileInputStream(file)) {
XWPFDocument document = new XWPFDocument(fis);
return document;
} catch (IOException e) {
e.printStackTrace();
return null;
}
}
private static void copyStyle(XWPFDocument srcDoc, XWPFDocument destDoc, XWPFStyle style) {
if (destDoc == null || style == null) return;
if (destDoc.getStyles() == null) {
destDoc.createStyles();
}
List<XWPFStyle> usedStyleList = srcDoc.getStyles().getUsedStyleList(style);
for (XWPFStyle xwpfStyle : usedStyleList) {
destDoc.getStyles().addStyle(xwpfStyle);
}
}
}
import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.apache.xmlbeans.XmlException;
import org.apache.xmlbeans.XmlToken;
import org.openxmlformats.schemas.drawingml.x2006.main.CTNonVisualDrawingProps;
import org.openxmlformats.schemas.drawingml.x2006.main.CTPositiveSize2D;
import org.openxmlformats.schemas.drawingml.x2006.wordprocessingDrawing.CTInline;
import java.io.IOException;
public class CustomXWPFDocument extends XWPFDocument {
public CustomXWPFDocument() throws IOException
{
super();
}
public void createPictureCxCy(String blipId,int id, long cx, long cy)
{
CTInline inline = createParagraph().createRun().getCTR().addNewDrawing().addNewInline();
String picXml = "" +
"<a:graphic xmlns:a=\"http://schemas.openxmlformats.org/drawingml/2006/main\">" +
" <a:graphicData uri=\"http://schemas.openxmlformats.org/drawingml/2006/picture\">" +
" <pic:pic xmlns:pic=\"http://schemas.openxmlformats.org/drawingml/2006/picture\">" +
" <pic:nvPicPr>" +
" <pic:cNvPr id=\"" + id + "\" name=\"Generated\"/>" +
" <pic:cNvPicPr/>" +
" </pic:nvPicPr>" +
" <pic:blipFill>" +
" <a:blip r:embed=\"" + blipId + "\" xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\"/>" +
" <a:stretch>" +
" <a:fillRect/>" +
" </a:stretch>" +
" </pic:blipFill>" +
" <pic:spPr>" +
" <a:xfrm>" +
" <a:off x=\"0\" y=\"0\"/>" +
" <a:ext cx=\"" + cx + "\" cy=\"" + cy + "\"/>" +
" </a:xfrm>" +
" <a:prstGeom prst=\"rect\">" +
" <a:avLst/>" +
" </a:prstGeom>" +
" </pic:spPr>" +
" </pic:pic>" +
" </a:graphicData>" +
"</a:graphic>";
//CTGraphicalObjectData graphicData = inline.addNewGraphic().addNewGraphicData();
XmlToken xmlToken = null;
try
{
xmlToken = XmlToken.Factory.parse(picXml);
}
catch(XmlException xe)
{
xe.printStackTrace();
}
inline.set(xmlToken);
//graphicData.set(xmlToken);
inline.setDistT(0);
inline.setDistB(0);
inline.setDistL(0);
inline.setDistR(0);
CTPositiveSize2D extent = inline.addNewExtent();
extent.setCx(cx);
extent.setCy(cy);
CTNonVisualDrawingProps docPr = inline.addNewDocPr();
docPr.setId(id);
docPr.setName("Picture " + id);
docPr.setDescr("Generated");
}
public void createPicture(String blipId,int id, int width, int height)
{
final int EMU = 9525;
width *= EMU;
height *= EMU;
//String blipId = getAllPictures().get(id).getPackageRelationship().getId();
createPictureCxCy(blipId, id, width, height);
}
}