1500字范文,内容丰富有趣,写作好帮手!
1500字范文 > java 实现word文档合并(支持文档中有图片和表格)

java 实现word文档合并(支持文档中有图片和表格)

时间:2022-06-07 18:59:55

相关推荐

java 实现word文档合并(支持文档中有图片和表格)

1:maven

<dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>4.1.2</version></dependency>

2:java中使用poi实现合并word文档,兼容图片的合并并分页

package com.wzpm.ponent.util;import org.apache.poi.openxml4j.opc.OPCPackage;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.x.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;/*** @Author fallrain* @Description 文件合并 只支持.docx* @Date /7/30 16:30* @Version 1.0*/public class DocxMerge {public static void main(String[] args) {File file1 = new File("E:\\merge\\mearg3.docx");List<File> targetFile1 = new ArrayList<>();targetFile1.add(new File("E:\\merge\\新昌县人民医院迁建项目策划书2029报送稿.docx"));targetFile1.add(new File("E:\\merge\\设计原型评审会议待明确点.docx"));appendDocx(file1, targetFile1);}/*** 把多个docx文件合并成一个** @param outfile 输出文件* @param targetFile 目标文件*/public static void appendDocx(File outfile, List<File> targetFile) {try {OutputStream dest = new FileOutputStream(outfile);ArrayList<XWPFDocument> documentList = new ArrayList<>();XWPFDocument doc = null;for (int i = 0; i < targetFile.size(); i++) {FileInputStream in = new FileInputStream(targetFile.get(i).getPath());OPCPackage open = OPCPackage.open(in);XWPFDocument document = new XWPFDocument(open);documentList.add(document);}for (int i = 0; i < documentList.size(); i++) {doc = documentList.get(0);if (i != 0) {//解决word合并完后,所有表格都紧紧挨在一起,没有分页。加上了分页符可解决documentList.get(i).createParagraph().setPageBreak(true);appendBody(doc, documentList.get(i));}}doc.write(dest);} catch (Exception e) {e.printStackTrace();}}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();// 记录图片合并前及合并后的IDMap<String, String> map = new HashMap<>();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 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("<"));//下面这部分可以去掉,我加上的原因是合并的时候,有时候出现打不开的情况,对照document.xml将某些标签去掉就可以正常打开了addPart = addPart.replaceAll("w14:paraId=\"[A-Za-z0-9]{1,10}\"", "");addPart = addPart.replaceAll("w14:textId=\"[A-Za-z0-9]{1,10}\"", "");addPart = addPart.replaceAll("w:rsidP=\"[A-Za-z0-9]{1,10}\"", "");addPart = addPart.replaceAll("w:rsidRPr=\"[A-Za-z0-9]{1,10}\"", "");addPart = addPart.replace("<w:headerReference r:id=\"rId8\" w:type=\"default\"/>","");addPart = addPart.replace("<w:footerReference r:id=\"rId9\" w:type=\"default\"/>","");addPart = addPart.replace("xsi:nil=\"true\"","");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);}}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。