parent
46a92f9c0e
commit
0cb02195fc
1 changed files with 129 additions and 0 deletions
@ -0,0 +1,129 @@ |
|||||||
|
package org.jeecg.test.word; |
||||||
|
|
||||||
|
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.jeecgframework.poi.word.WordExportUtil; |
||||||
|
import org.junit.Test; |
||||||
|
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.*; |
||||||
|
|
||||||
|
/** |
||||||
|
* @Description: TODO |
||||||
|
* @Author: Z.H.C |
||||||
|
* @CreateTime: 2024-11-18 15:33 |
||||||
|
* @Version: 1.0 |
||||||
|
*/ |
||||||
|
public class WordExportUtil_test { |
||||||
|
|
||||||
|
/** |
||||||
|
* 简单导出没有图片和Excel |
||||||
|
*/ |
||||||
|
@Test |
||||||
|
public void SimpleWordExport() { |
||||||
|
Map<String, Object> map = new HashMap<String, Object>(); |
||||||
|
map.put("department", "Easypoi"); |
||||||
|
map.put("person", "JueYue"); |
||||||
|
map.put("time", new Date()); |
||||||
|
map.put("me", "JueYue"); |
||||||
|
map.put("date", "2015-01-03"); |
||||||
|
try { |
||||||
|
//jeecg-boot/jeecg-boot-base-core/src/main/resources/templates/email/work/test1118.docx
|
||||||
|
XWPFDocument doc = WordExportUtil.exportWord07("src/main/resources/templates/email/work/test1118.docx", map); |
||||||
|
FileOutputStream fos = new FileOutputStream("D:/1.docx"); |
||||||
|
doc.write(fos); |
||||||
|
fos.close(); |
||||||
|
} catch (Exception e) { |
||||||
|
e.printStackTrace(); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
@Test |
||||||
|
public void test2() { |
||||||
|
File newFile = new File("C:\\Users\\YX\\Desktop\\testword\\合并2.docx"); |
||||||
|
List<File> srcfile = new ArrayList<>(); |
||||||
|
|
||||||
|
File file1 = new File("C:\\Users\\YX\\Desktop\\testword\\1.docx"); |
||||||
|
File file2 = new File("C:\\Users\\YX\\Desktop\\testword\\2.docx"); |
||||||
|
File file3 = new File("C:\\Users\\YX\\Desktop\\testword\\3.docx"); |
||||||
|
srcfile.add(file1); |
||||||
|
srcfile.add(file2); |
||||||
|
srcfile.add(file3); |
||||||
|
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); |
||||||
|
} |
||||||
|
for (int i = 0; i < documentList.size(); i++) { |
||||||
|
doc = documentList.get(0); |
||||||
|
if (i == 0) {//首页直接分页,不再插入首页文档内容
|
||||||
|
documentList.get(i).createParagraph().createRun().addBreak(BreakType.PAGE); |
||||||
|
// appendBody(doc,documentList.get(i));
|
||||||
|
} else if (i == documentList.size() - 1) {//尾页不再分页,直接插入最后文档内容
|
||||||
|
appendBody(doc, documentList.get(i)); |
||||||
|
} else { |
||||||
|
documentList.get(i).createParagraph().createRun().addBreak(BreakType.PAGE); |
||||||
|
appendBody(doc, documentList.get(i)); |
||||||
|
} |
||||||
|
} |
||||||
|
doc.write(dest); |
||||||
|
dest.close(); |
||||||
|
|
||||||
|
System.out.println("*****合成成功********"); |
||||||
|
|
||||||
|
// Runtime.getRuntime().exec("cmd /c start winword C:/Users/gouwe/合并.docx");//直接调用cmd打开合成文档
|
||||||
|
} 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(); |
||||||
|
// 记录图片合并前及合并后的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 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