日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

使用docx4j追尾合并多个docx文件为一个docx文件

發布時間:2023/12/18 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 使用docx4j追尾合并多个docx文件为一个docx文件 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

簡介

使用docx4j將多個docx文件,合并為一個docx文件,采用在文檔最后一個段落追加內容的方式。

依賴

<dependency><groupId>org.docx4j</groupId><artifactId>docx4j</artifactId><version>6.1.2</version></dependency>

工具方法

import org.apache.commons.io.IOUtils; import org.docx4j.jaxb.Context; import org.docx4j.openpackaging.exceptions.Docx4JException; import org.docx4j.openpackaging.packages.WordprocessingMLPackage; import org.docx4j.openpackaging.parts.PartName; import org.docx4j.openpackaging.parts.WordprocessingML.AlternativeFormatInputPart; import org.docx4j.openpackaging.parts.WordprocessingML.MainDocumentPart; import org.docx4j.relationships.Relationship; import org.docx4j.wml.CTAltChunk; import org.slf4j.Logger; import org.slf4j.LoggerFactory;import java.io.*; import java.util.ArrayList; import java.util.List;/*** @author gongl* @date 2022-10-10*/ public class PdfUtils {private static final Logger log = LoggerFactory.getLogger(PdfUtils.class);/*** 合并word文件* @param wordList 待合并文件集合* @param outFilePath 輸出文件路徑*/public static void mergeDoc(List<String> wordList, String outFilePath) {List<InputStream> streamList = new ArrayList<>();for (String wordPath : wordList) {try {streamList.add(new FileInputStream(wordPath));} catch (FileNotFoundException e) {log.error("待合并文件流讀取異常:", e);e.printStackTrace();}}try {mergeDocStream(streamList, new FileOutputStream(new File(outFilePath)));} catch (Exception e) {log.error("臨時文件創建異常:", e);}}private static void mergeDocStream(List<InputStream> streamList, FileOutputStream out) throws Docx4JException, IOException {WordprocessingMLPackage target = null;final File generated = File.createTempFile("generated", ".docx");int chunkId = 0;for (InputStream is : streamList) {if (is != null) {if (target == null) {OutputStream os = new FileOutputStream(generated);os.write(IOUtils.toByteArray(is));os.close();target = WordprocessingMLPackage.load(generated);} else {insertDoc(target.getMainDocumentPart(), IOUtils.toByteArray(is), chunkId++);}}}if (target != null) {target.save(generated);FileInputStream fileInputStream = new FileInputStream(generated);saveTemplate(fileInputStream, out);}}private static void insertDoc(MainDocumentPart mainDocumentPart, byte[] bytes, int chunkId) {try {PartName partName = new PartName("/part" + chunkId + ".docx");AlternativeFormatInputPart afiPart = new AlternativeFormatInputPart(partName);afiPart.setBinaryData(bytes);Relationship relationship = mainDocumentPart.addTargetPart(afiPart);CTAltChunk chunk = Context.getWmlObjectFactory().createCTAltChunk();chunk.setId(relationship.getId());mainDocumentPart.addObject(chunk);} catch (Exception e) {log.error("文件合并臨時文件異常:", e);}}private static void saveTemplate(InputStream targetStream, FileOutputStream out) {int byteread;try {byte[] buffer = new byte[1024 * 10];while ((byteread = targetStream.read(buffer)) != -1) {out.write(buffer, 0, byteread);}targetStream.close();out.close();} catch (IOException e) {log.error("生成文件異常:", e);}} }

測試用例

先創建兩個docx文件:2.docx和1.docx

執行代碼合并為3.docx

public static void main(String[] args) {mergeDoc(Arrays.asList("C:\\Users\\E490\\Desktop\\2.docx", "C:\\Users\\E490\\Desktop\\1.docx"), "C:\\Users\\E490\\Desktop\\3.docx");}

結果如下圖

總結

以上是生活随笔為你收集整理的使用docx4j追尾合并多个docx文件为一个docx文件的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。