Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/381.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用Java合并MS-Word文档_Java_Ms Word - Fatal编程技术网

用Java合并MS-Word文档

用Java合并MS-Word文档,java,ms-word,Java,Ms Word,我正在寻找读写MS Word文档的java库。 我要做的是: 读取模板文件.dot或.doc,并用从DB读取的一些数据填充它 从另一个Word文档中获取数据,并将其与上述文件合并,保留段落格式 用户可以对文件进行更新 我已经搜索并找到了POI Apache和UNO OpenOffice。 第一个可以很容易地读取模板,并用我自己的数据库数据替换任何占位符。我没有发现任何关于合并两个或更多文档的信息。 OpenOffice UNO看起来更稳定,但也更复杂。此外,我不确定它是否有能力合并文档 我们

我正在寻找读写MS Word文档的java库。 我要做的是:

  • 读取模板文件.dot或.doc,并用从DB读取的一些数据填充它
  • 从另一个Word文档中获取数据,并将其与上述文件合并,保留段落格式
用户可以对文件进行更新

我已经搜索并找到了POI Apache和UNO OpenOffice。 第一个可以很容易地读取模板,并用我自己的数据库数据替换任何占位符。我没有发现任何关于合并两个或更多文档的信息。 OpenOffice UNO看起来更稳定,但也更复杂。此外,我不确定它是否有能力合并文档

我们正在寻找正确的方向

我认为的另一个解决方案是将doc文件转换为docx。通过这种方式,我找到了更多可以帮助我们合并文档的库。 但是我怎么能做到呢

谢谢

您可以看一下,因为它提供了您提到的四个功能(数据填充、模板/文档合并、文档格式和java接口)。它有两种风格(下载、在线服务),但你可以注册免费试用云服务,看看Docmosis是否可以做你想做的事情(这样你就不必安装任何东西)或阅读在线文档

它使用了OpenOffice(您可以从开发者指南的安装说明中看到),它可以在文档之间进行相当不错的转换。UNO API有一些复杂之处——我建议Docmosis或JODReports将您的项目与UNO直接隔离

希望对您有所帮助。

导入java.io.File;
import java.io.File;
import java.util.List;

import javax.xml.bind.JAXBException;

import org.docx4j.dml.CTBlip;
import org.docx4j.openpackaging.exceptions.Docx4JException;
import org.docx4j.openpackaging.packages.WordprocessingMLPackage;
import org.docx4j.openpackaging.parts.Part;
import org.docx4j.openpackaging.parts.PartName;
import org.docx4j.openpackaging.parts.WordprocessingML.ImageBmpPart;
import org.docx4j.openpackaging.parts.WordprocessingML.ImageEpsPart;
import org.docx4j.openpackaging.parts.WordprocessingML.ImageGifPart;
import org.docx4j.openpackaging.parts.WordprocessingML.ImageJpegPart;
import org.docx4j.openpackaging.parts.WordprocessingML.ImagePngPart;
import org.docx4j.openpackaging.parts.WordprocessingML.ImageTiffPart;
import org.docx4j.openpackaging.parts.relationships.RelationshipsPart;
import org.docx4j.openpackaging.parts.relationships.RelationshipsPart.AddPartBehaviour;
import org.docx4j.relationships.Relationship;

public class MultipleDocMerge {


    public static void main(String[] args) throws Docx4JException, JAXBException {
        File first = new File("D:\\Mreg.docx");
        File second = new File("D:\\Mreg1.docx");
        File third = new File("D:\\Mreg4&19.docx");
        File fourth = new File("D:\\test12.docx");   
        WordprocessingMLPackage f = WordprocessingMLPackage.load(first);
        WordprocessingMLPackage s = WordprocessingMLPackage.load(second);
        WordprocessingMLPackage a = WordprocessingMLPackage.load(third);
        WordprocessingMLPackage e = WordprocessingMLPackage.load(fourth);

        List body = s.getMainDocumentPart().getJAXBNodesViaXPath("//w:body", false);
        for(Object b : body){
            List filhos = ((org.docx4j.wml.Body)b).getContent();
            for(Object k : filhos)
                f.getMainDocumentPart().addObject(k);
        }

        List body1 = a.getMainDocumentPart().getJAXBNodesViaXPath("//w:body", false);
        for(Object b : body1){
            List filhos = ((org.docx4j.wml.Body)b).getContent();
            for(Object k : filhos)
                f.getMainDocumentPart().addObject(k);
        }

        List body2 = e.getMainDocumentPart().getJAXBNodesViaXPath("//w:body", false);
        for(Object b : body2){
            List filhos = ((org.docx4j.wml.Body)b).getContent();
            for(Object k : filhos)
                f.getMainDocumentPart().addObject(k);
        }


        List<Object> blips = e.getMainDocumentPart().getJAXBNodesViaXPath("//a:blip", false);
        for(Object el : blips){
            try {

                   CTBlip blip = (CTBlip) el;
                   RelationshipsPart parts = e.getMainDocumentPart().getRelationshipsPart();
                   Relationship rel = parts.getRelationshipByID(blip.getEmbed());
                   Part part = parts.getPart(rel);
                   if(part instanceof ImagePngPart)
                        System.out.println(((ImagePngPart) part).getBytes()); 
                   if(part instanceof ImageJpegPart)
                        System.out.println(((ImageJpegPart) part).getBytes()); 
                    if(part instanceof ImageBmpPart)
                        System.out.println(((ImageBmpPart) part).getBytes()); 
                    if(part instanceof ImageGifPart)
                        System.out.println(((ImageGifPart) part).getBytes()); 
                    if(part instanceof ImageEpsPart)
                        System.out.println(((ImageEpsPart) part).getBytes()); 
                    if(part instanceof ImageTiffPart)
                        System.out.println(((ImageTiffPart) part).getBytes()); 
                    Relationship newrel = f.getMainDocumentPart().addTargetPart(part,AddPartBehaviour.RENAME_IF_NAME_EXISTS);
                    blip.setEmbed(newrel.getId());
                    f.getMainDocumentPart().addTargetPart(e.getParts().getParts().get(new PartName("/word/"+rel.getTarget())));
                } catch (Exception ex){
                        ex.printStackTrace();
                } }

        File saved = new File("D:\\saved1.docx");
        f.save(saved);




    }

}
导入java.util.List; 导入javax.xml.bind.JAXBException; 导入org.docx4j.dml.CTBlip; 导入org.docx4j.openpackaging.exceptions.docx4jeexception; 导入org.docx4j.openpackaging.packages.WordprocessingMLPackage; 导入org.docx4j.openpackaging.parts.Part; 导入org.docx4j.openpackaging.parts.PartName; 导入org.docx4j.openpackaging.parts.WordprocessingML.ImageBmpPart; 导入org.docx4j.openpackaging.parts.WordprocessingML.imagepspart; 导入org.docx4j.openpackaging.parts.WordprocessingML.ImageGifPart; 导入org.docx4j.openpackaging.parts.WordprocessingML.ImageJpegPart; 导入org.docx4j.openpackaging.parts.WordprocessingML.ImagePngPart; 导入org.docx4j.openpackaging.parts.WordprocessingML.ImageTiffPart; 导入org.docx4j.openpackaging.parts.relationships.RelationshipsPart; 导入org.docx4j.openpackaging.parts.relationships.RelationshipsPart.addPartBehavior; 导入org.docx4j.relationships.Relationship; 公共类乘法器{ 公共静态void main(字符串[]args)抛出Docx4JException、JAXBException{ 文件优先=新文件(“D:\\Mreg.docx”); 文件秒=新文件(“D:\\Mreg1.docx”); 第三个文件=新文件(“D:\\Mreg4&19.docx”); 第四个文件=新文件(“D:\\test12.docx”); WordprocessingMLPackage f=WordprocessingMLPackage.load(第一); WordProcessingMLPackages=WordprocessingMLPackage.load(秒); WordprocessingMLPackage a=WordprocessingMLPackage.load(第三个); WordprocessingMLPackage e=WordprocessingMLPackage.load(第四); List body=s.getMainDocumentPart().getJAXBNodesViaXPath(“//w:body”,false); 用于(对象b:主体){ List filhos=((org.docx4j.wml.Body)b.getContent(); 用于(对象k:filhos) f、 getMainDocumentPart().addObject(k); } List body1=a.getMainDocumentPart().getJAXBNodesViaXPath(“//w:body”,false); 用于(对象b:body1){ List filhos=((org.docx4j.wml.Body)b.getContent(); 用于(对象k:filhos) f、 getMainDocumentPart().addObject(k); } List body2=e.getMainDocumentPart().getJAXBNodesViaXPath(“//w:body”,false); 用于(对象b:body2){ List filhos=((org.docx4j.wml.Body)b.getContent(); 用于(对象k:filhos) f、 getMainDocumentPart().addObject(k); } List blips=e.getMainDocumentPart().getJAXBNodesViaXPath(“//a:blip”,false); 用于(对象el:光点){ 试一试{ CTBlip blip=(CTBlip)el; RelationshipsPart parts=e.getMainDocumentPart().getRelationshipsPart(); Relationship=parts.getrelationshippyid(blip.getEmbed()); Part Part=parts.getPart(rel); if(ImagePngPart的零件实例) System.out.println(((ImagePngPart)part.getBytes()); if(图像JPEG部件的部件实例) System.out.println(((ImageJpegPart)part.getBytes()); if(ImageBmpPart的部件实例) System.out.println(((ImageBmpPart)part.getBytes()); if(ImageGifPart的部件实例) System.out.println(((ImageGifPart)part.getBytes()); if(ImagesPart的部件实例) System.out.println(((imagepspart)part.getBytes()); if(ImageTiffPart的部件实例) System.out.println(((ImageTiffPart)part.getBytes()); 关系newrel=f.getMainDocumentPart().addTargetPart(part,AddPartBehavior.RENAME_,如果_NAME_存在); setEmbed(newrel.getId()); f、 getMainDocumentPart().addTargetPart(例如getParts().getParts().get(新部件名(“/word/”+rel.getTarget())); }捕获(例外情况除外){ 例如printStackTrace(); } } 保存的文件=新文件(“D:\\saved1.docx”); f、 保存(已保存); } }
我开发了下一个类(使用ApachePOI):


Apache POI代码不适用于图像。

谢谢,但要求是.doc文档!“合并”文档是什么意思?只是附加了
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;
import org.apache.poi.openxml4j.opc.OPCPackage;
import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTBody;

public class WordMerge {

    private final OutputStream result;
    private final List<InputStream> inputs;
    private XWPFDocument first;

    public WordMerge(OutputStream result) {
        this.result = result;
        inputs = new ArrayList<>();
    }

    public void add(InputStream stream) throws Exception{            
        inputs.add(stream);
        OPCPackage srcPackage = OPCPackage.open(stream);
        XWPFDocument src1Document = new XWPFDocument(srcPackage);         
        if(inputs.size() == 1){
            first = src1Document;
        } else {            
            CTBody srcBody = src1Document.getDocument().getBody();
            first.getDocument().addNewBody().set(srcBody);            
        }        
    }

    public void doMerge() throws Exception{
        first.write(result);                
    }

    public void close() throws Exception{
        result.flush();
        result.close();
        for (InputStream input : inputs) {
            input.close();
        }
    }   
}
public static void main(String[] args) throws Exception {

    FileOutputStream faos = new FileOutputStream("/home/victor/result.docx");

    WordMerge wm = new WordMerge(faos);

    wm.add( new FileInputStream("/home/victor/001.docx") );
    wm.add( new FileInputStream("/home/victor/002.docx") );

    wm.doMerge();
    wm.close();

}