Java POI实现word合并

it2024-07-28  36

如下

import org.apache.poi.openxml4j.opc.OPCPackage; import org.apache.poi.xwpf.usermodel.BreakType; import org.apache.poi.xwpf.usermodel.Document; import org.apache.poi.xwpf.usermodel.XWPFDocument; import org.apache.poi.xwpf.usermodel.XWPFPictureData; import org.apache.xmlbeans.XmlOptions; import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTBody; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.OutputStream; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; public class WordTest02 { public static void main (String[] args) throws Exception { List<File> srcfile = new ArrayList<>(); //合并此文件文件夹下的所有文件 File file = new File("E:\\test"); getFile(srcfile, file); //输出文档位置 File newFile = new File("e:\\test02.docx"); try { OutputStream dest = new FileOutputStream(newFile); ArrayList<XWPFDocument> documentList = new ArrayList<>(); XWPFDocument doc = null; for (int i = 0; i < srcfile.size(); i++) { FileInputStream in = new FileInputStream(srcfile.get(i).getPath()); OPCPackage open = OPCPackage.open(in); XWPFDocument document = new XWPFDocument(open); documentList.add(document); if (i !=0 && i!= srcfile.size()-1) { //分页 document.createParagraph().createRun().addBreak(BreakType.PAGE); } } doc = documentList.get(0); for (int i = 1; i < documentList.size(); i++) { appendBody(doc,documentList.get(i)); } doc.write(dest); } catch (Exception e) { e.printStackTrace(); } System.out.println("success"); } private static void getFile(List<File> srcfile, File file) { if(file.isDirectory()){ File []files = file.listFiles(); for(File fileIndex : files){ if (fileIndex.isDirectory()) { getFile(srcfile, fileIndex); }else { srcfile.add(fileIndex); } } } } public static void appendBody(XWPFDocument src, XWPFDocument append) throws Exception { CTBody src1Body = src.getDocument().getBody(); CTBody src2Body = append.getDocument().getBody(); List<XWPFPictureData> allPictures = append.getAllPictures(); // 记录图片合并前及合并后的ID Map<String,String> map = new HashMap<String, String>(); for (XWPFPictureData picture : allPictures) { String before = append.getRelationId(picture); //将原文档中的图片加入到目标文档中 String after = src.addPictureData(picture.getData(), Document.PICTURE_TYPE_PNG); map.put(before, after); } appendBody(src1Body, src2Body,map); } private static void appendBody(CTBody src, CTBody append,Map<String,String> map) throws Exception { XmlOptions optionsOuter = new XmlOptions(); optionsOuter.setSaveOuter(); String appendString = append.xmlText(optionsOuter); String rgex = "<[\\s]*?w:sectPr[^>]*?>[\\s\\S]*?<[\\s]*?\\/[\\s]*?w:sectPr[\\s]*?>"; appendString = appendString.replaceAll(rgex, ""); String srcString = src.xmlText(); String prefix = srcString.substring(0,srcString.indexOf(">")+1); String mainPart = srcString.substring(srcString.indexOf(">")+1,srcString.lastIndexOf("<")); String sufix = srcString.substring( srcString.lastIndexOf("<") ); String addPart = appendString.substring(appendString.indexOf(">") + 1, appendString.lastIndexOf("<")); if (map != null && !map.isEmpty()) { //对xml字符串中图片ID进行替换 for (Map.Entry<String, String> set : map.entrySet()) { addPart = addPart.replace(set.getKey(), set.getValue()); } } //将两个文档的xml内容进行拼接 CTBody makeBody = CTBody.Factory.parse(prefix+mainPart+addPart+sufix); src.set(makeBody); } }

参考:https://www.cnblogs.com/xingmangdieyi110/p/10185752.html

          https://www.cnblogs.com/himonkey/p/11110726.html

          https://blog.csdn.net/john1337/article/details/104955154/

最新回复(0)