2010-03-22 69 views
7

我需要编写一个可以合并docx文件的java应用程序。有什么建议么?是否有任何允许合并docx文件的java库(也许poi?)?

+0

通过“合并”,你的意思是一些简单的串联?还是更有趣?合并部分或docx(而非doc)部分的难度是? – 2010-03-22 17:57:57

+0

合并应该给出与我们在MS Office第一个文档中手动打开相同的结果,请按Ctrl + C,然后打开第二个文档,直到它结束并按Ctrl + V。 – Roman 2010-03-22 18:07:23

回答

5

下面的Java API可用于处理OpenXML的MS Word文档与Java:

还有一个,但我不记得这个名字了。

至于你的功能要求:合并两个文件在技术上很难达到最终用户期望的结果。大多数API不允许这样做。您需要从两个文档中提取所需信息,然后根据这些信息自行创建一个新文档。

+0

你如何决定使用哪一个?我介于Apache POI和OpenOffice.org之间。第二个将需要安装开放式办公室,我认为这将成为业绩中的热门,这是真的吗? – Roger 2012-12-12 23:08:50

+0

欲了解更多关于技术上棘手的原因,请参阅http://www.docx4java.org/blog/2010/11/merging-word-documents/ – JasonPlutext 2014-03-20 05:37:25

+0

我想确定使用哪种方法的最好方法是尝试使用它们文档。您可以尝试基于docx4j的商业工具,网址为http://webapp.docx4java.org/OnlineDemo/forms/upload_MergeDocx.xhtml – JasonPlutext 2014-03-20 05:53:36

1

Aspose API是目前为止合并word doc或docx文件到目前为止最好的,但这不是免费或开源的,如果你需要一个免费和开源的工具有几个API你可以选择,你可以找到他们在这里进行审查,

http://www.esupu.com/open-source-office-document-java-api-review/

+0

链接断.... – paul 2016-03-07 10:16:00

11

随着POI我的解决方案是:

public static void merge(InputStream src1, InputStream src2, OutputStream dest) throws Exception { 
    OPCPackage src1Package = OPCPackage.open(src1); 
    OPCPackage src2Package = OPCPackage.open(src2); 
    XWPFDocument src1Document = new XWPFDocument(src1Package);   
    CTBody src1Body = src1Document.getDocument().getBody(); 
    XWPFDocument src2Document = new XWPFDocument(src2Package); 
    CTBody src2Body = src2Document.getDocument().getBody();   
    appendBody(src1Body, src2Body); 
    src1Document.write(dest); 
} 

private static void appendBody(CTBody src, CTBody append) 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("<")); 
    CTBody makeBody = CTBody.Factory.parse(prefix+mainPart+addPart+sufix); 
    src.set(makeBody); 
} 

随着Docx4j我的解决方案是:

public class MergeDocx { 
    private static long chunk = 0; 
    private static final String CONTENT_TYPE = "application/vnd.openxmlformats-officedocument.wordprocessingml.document"; 

    public void mergeDocx(InputStream s1, InputStream s2, OutputStream os) throws Exception { 
     WordprocessingMLPackage target = WordprocessingMLPackage.load(s1); 
     insertDocx(target.getMainDocumentPart(), IOUtils.toByteArray(s2)); 
     SaveToZipFile saver = new SaveToZipFile(target); 
     saver.save(os); 
    } 

    private static void insertDocx(MainDocumentPart main, byte[] bytes) throws Exception { 
      AlternativeFormatInputPart afiPart = new AlternativeFormatInputPart(new PartName("/part" + (chunk++) + ".docx")); 
      afiPart.setContentType(new ContentType(CONTENT_TYPE)); 
      afiPart.setBinaryData(bytes); 
      Relationship altChunkRel = main.addTargetPart(afiPart); 

      CTAltChunk chunk = Context.getWmlObjectFactory().createCTAltChunk(); 
      chunk.setId(altChunkRel.getId()); 

      main.addObject(chunk); 
    } 
} 
+0

谢谢你这个答案你的Poi代码适合我,但在我的情况下,我还需要合并.doc文件,所以我必须使用org.apache.poi.hwpf.HWPFDocument。所以通过遵循你的docx代码,我想从.doc文件中获得xml格式,但是我没有找到办法做到这一点。任何想法将不胜感激:) – AmiraGL 2014-03-21 15:08:28

+0

这工作完美。谢谢! – 2015-06-08 20:09:26

+0

@atott POI代码为我工作,但如果附加文档有图像,而不是合并图像不存在,请将所有文本与确切格式合并。 – 2016-10-20 07:10:49

相关问题