2つのワード文書をマージし、変わらないスタイルのまま

まず、需要の説明

      例えば、カバーは、ワード上記体内に挿入されます

第二に、輸入依存

< 依存性> 
   < のgroupId > org.apache.poi </ のgroupId > 
    < たartifactId > POI </ たartifactId > 
    < バージョン> 4.1.1 </ バージョン> 
</ 依存> 
< 依存性> 
    < のgroupId > org.apache.poi </ groupId > 
    < たartifactId > POI-OOXML </ たartifactId > 
    < バージョン> 4.1。1 </バージョン> 
</ 依存>  
< 依存性> 
    < のgroupId > org.apache.poi </ のgroupId > 
    < たartifactId > POI-OOXML-スキーマ</ たartifactId > 
    < バージョン> 4.1.1 </ バージョン> 
</ 依存> 


< 依存性> 
    < groupIdを> org.apache.xmlbeans </ groupIdを> 
     < たartifactId > XMLBeansの</ たartifactId> 
     < バージョン> 3.1.0 </ バージョン> 
</ 依存関係>

第三に、準備

2つのワード文書を準備します

第四に、コード

インポートのjava.io.File;
輸入java.io.FileFilter;
輸入java.io.FileInputStream;
輸入java.io.FileOutputStreamは、
インポートにjava.io.OutputStream;
輸入はjava.util.ArrayList;
輸入java.util.HashMapを;
輸入はjava.util.List;
輸入java.util.Map;
輸入org.apache.poi.openxml4j.opc.OPCPackage;
輸入org.apache.poi.xwpf.usermodel.Document;
輸入org.apache.poi.xwpf.usermodel.XWPFDocument;
輸入org.apache.poi.xwpf.usermodel.XWPFPictureData;
輸入org.apache.xmlbeans.XmlOptions。

        ファイルfileRootは = 新しいファイル(パス); 
        リスト

   
    
    <ファイル> subFileList = 新しいのArrayList <ファイル> (); 
        getAllFile(subFileList、fileRoot)。
            以下のための(ファイルのファイル:subFileList){ 
            文字列名 = file.getName(); 
            ファイルにnewFile = 新しいファイル( "F:/最終/" +タイプ+ "/" + 名)。
            一覧 <ファイル> SRCFILE = 新しい ArrayListを<> (); 
            ファイルfile1 = 新しいファイル( "E:/ 1 /确认打印报告/" +タイプ+ "/" + 名)。
            ファイルfile2 = 新しいファイル( "D:/ワード/封面/生成/" +タイプ+ "/" + 名)。

            srcfile.add(FILE2)。

            試します{ 
                たOutputStream DEST = 新しいたFileOutputStream(にnewFile)。
                ArrayListの <XWPFDocument> documentList = 新しい ArrayListを<> (); 
                XWPFDocumentドキュメント = nullを以下のためにINT ; I <srcfile.size(); iが0 = I ++ ){ 
                    FileInputStreamの中 = 新規のFileInputStream(srcfile.get(I).getPath())。
                    OPCPackageオープン = OPCPackage.open(IN)
                    XWPFDocument文書は =新しいXWPFDocument(オープン)。
                    documentList.add(文書)。
                    )(in.close。
                } 
                ためINT iは= 0; I <documentList.size(); I ++ ){ 
                    DOC = documentList.get(0 )。
                    もし(I!= 0 ){ 
                        appendBody(DOC、documentList.get(I))。
                    } 
                } 
//                 doc.createParagraph()setPageBreak(TRUE)。
                doc.write(DEST)。
                System.out.println(名); 
                doc.close();
                dest.close(); 
            } キャッチ(例外e){
                e.printStackTrace(); 
            } 
            } 
    } 
    
    } 

    パブリック 静的 ボイド appendBodyは(XWPFDocument SRC、XWPFDocument追記)スロー例外{ 
        CTBody src1Body = src.getDocument()getBody()。
        CTBody src2Body = 。append.getDocument()getBody(); 

        一覧 <XWPFPictureData> allPictures = append.getAllPictures();
        // 记录图片合并前及合并后的ID 
        地図<文字列、文字列>マップ= 新しいHashMapの();
        (XWPFPictureData画像:allPictures){ 
            文字列の前に = append.getRelationId(画像)
            // 将原文档中的图片加入到目标文档中
            文字列の後= src.addPictureData(picture.getData()、Document.PICTURE_TYPE_PNG)。
            map.put(前、後)。
        } 

        appendBody(src1Body、src2Body、NULL ); 

    } 

    プライベート 静的 ボイド appendBody(CTBody SRC、CTBodyアペンド、地図<文字列、文字列>マップ)スロー例外{ 
        XmlOptions optionsOuter = 新しいXmlOptionsを(); 
        optionsOuter.setSaveOuter();
        ストリングappendString = append.xmlText(optionsOuter)。

        ストリングsrcString = src.xmlText()。
        文字列の接頭辞 = srcString.substring(0、srcString.indexOf( ">")+ 1 )。
        ストリングmainPart = srcString.substring(srcString.indexOf( ">")+ 1、srcString.lastIndexOf( "<" )); 
        ストリングsufix = srcString.substring(srcString.lastIndexOf( "<" )); 
        ストリングaddPart = appendString.substring(appendString.indexOf( ">")+ 1、appendString.lastIndexOf( "<" )); 

        もし(マップ!= nullの &&!map.isEmpty()){
             // 对XML字符串中图片ID进行替换
            のため(のMap.Entry <文字列、 
                addPart = addPart.replace(set.getKey()、set.getValue()); 
            } 
        } 
        // 将两个文档的XML内容进行拼接 
        CTBody makeBody = CTBody.Factory.parse(接頭辞+ addPart + mainPart + sufix); 

        src.set(makeBody); 
    } 
    

  
    プライベート 静的 無効 getAllFile(最終一覧<ファイル> subFileList、ファイルfileRoot){ 
        fileRoot.listFiles(新しいFileFilterの(){ 
            @Override 
            国民は ブール受け入れる(ファイルのファイル) {
                 場合(file.isDirectory()){
                    getAllFile(subFileList、ファイル); 
                    リターン はfalse; 
                } {
                     場合(。)file.getName(endsWith( "DOCX。" )){ 
                        subFileList.add(ファイル)。
                    } 
                    を返す 
                } 
            } 
        })。
    } 
}
コードの表示

 

 

おすすめ

転載: www.cnblogs.com/winddogg/p/11933950.html