parent
8c06e4e8cf
commit
a5547a550d
3 changed files with 108 additions and 8 deletions
@ -0,0 +1,84 @@ |
||||
package org.jeecg.common.util; |
||||
|
||||
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 org.springframework.util.CollectionUtils; |
||||
|
||||
import java.util.HashMap; |
||||
import java.util.List; |
||||
import java.util.Map; |
||||
|
||||
/** |
||||
* @Description: TODO |
||||
* @Author: Z.H.C |
||||
* @CreateTime: 2024-11-22 09:16 |
||||
* @Version: 1.0 |
||||
*/ |
||||
public class WordUtils { |
||||
|
||||
/** |
||||
* @description: word文件合并 |
||||
* @param: [wordList] |
||||
* @return: org.apache.poi.xwpf.usermodel.XWPFDocument |
||||
* @author: z.h.c |
||||
* @date: 24/11/22 09:19 |
||||
*/ |
||||
public static XWPFDocument mergeWord(List<XWPFDocument> wordList) throws Exception { |
||||
if (CollectionUtils.isEmpty(wordList)) { |
||||
throw new RuntimeException("待合并的word文档list为空"); |
||||
} |
||||
XWPFDocument doc = wordList.get(0); |
||||
int size = wordList.size(); |
||||
if (size > 1) { |
||||
doc.createParagraph().setPageBreak(true); |
||||
for (int i = 1; i < size; i++) { |
||||
// 从第二个word开始合并
|
||||
XWPFDocument nextPageDoc = wordList.get(i); |
||||
// 最后一页不需要设置分页符
|
||||
if (i != (size - 1)) { |
||||
nextPageDoc.createParagraph().setPageBreak(true); |
||||
} |
||||
appendBody(doc, nextPageDoc); |
||||
} |
||||
} |
||||
return doc; |
||||
} |
||||
|
||||
private 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<>(); |
||||
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("<")); |
||||
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); |
||||
} |
||||
} |
Loading…
Reference in new issue