我需要编写一个可以合并docx文件的java应用程序。有什么建议么?是否有任何允许合并docx文件的java库(也许poi?)?
回答
下面的Java API可用于处理OpenXML的MS Word文档与Java:
还有一个,但我不记得这个名字了。
至于你的功能要求:合并两个文件在技术上很难达到最终用户期望的结果。大多数API不允许这样做。您需要从两个文档中提取所需信息,然后根据这些信息自行创建一个新文档。
你如何决定使用哪一个?我介于Apache POI和OpenOffice.org之间。第二个将需要安装开放式办公室,我认为这将成为业绩中的热门,这是真的吗? – Roger 2012-12-12 23:08:50
欲了解更多关于技术上棘手的原因,请参阅http://www.docx4java.org/blog/2010/11/merging-word-documents/ – JasonPlutext 2014-03-20 05:37:25
我想确定使用哪种方法的最好方法是尝试使用它们文档。您可以尝试基于docx4j的商业工具,网址为http://webapp.docx4java.org/OnlineDemo/forms/upload_MergeDocx.xhtml – JasonPlutext 2014-03-20 05:53:36
它确实看起来像POI可以与docx
文件一起使用。你是否想弄清楚如何合并它们?
How to extract plain text from a DOCX file using the new OOXML support in Apache POI 3.5?
Aspose API是目前为止合并word doc或docx文件到目前为止最好的,但这不是免费或开源的,如果你需要一个免费和开源的工具有几个API你可以选择,你可以找到他们在这里进行审查,
http://www.esupu.com/open-source-office-document-java-api-review/
链接断.... – paul 2016-03-07 10:16:00
随着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);
}
}
谢谢你这个答案你的Poi代码适合我,但在我的情况下,我还需要合并.doc文件,所以我必须使用org.apache.poi.hwpf.HWPFDocument。所以通过遵循你的docx代码,我想从.doc文件中获得xml格式,但是我没有找到办法做到这一点。任何想法将不胜感激:) – AmiraGL 2014-03-21 15:08:28
这工作完美。谢谢! – 2015-06-08 20:09:26
@atott POI代码为我工作,但如果附加文档有图像,而不是合并图像不存在,请将所有文本与确切格式合并。 – 2016-10-20 07:10:49
- 1. 立即创建* .docx(也许* .doc?)文件?
- 2. 是Android库中允许的java库吗?
- 3. soundcloud:是否允许使用api-v2,并且是否有文档?
- 4. 是否存在允许读取excel文件的任何球拍库?
- 5. Facebook是否允许CORS头文件?
- 6. 是否有任何JQuery插件允许上传文件而不刷新页面?
- 7. Apigee Usergrid:usergrid是否允许子集合?
- 8. 结合@MappedSuperclass和@SecondaryTable - 是否允许?
- 9. 是否有任何允许回调的Thrift式RPC系统?
- 10. 是否有任何允许电子商务的PHP框架?
- 11. 是否有任何允许录像的WebRTC实现?
- 12. 是否有任何TTPickerTextField替代?也许在iOS4?
- 13. 是否允许每个App Engine应用(不是1,000)允许3,000个文件?
- 14. AngularUI typeahead插件是否允许任何类型的值?
- 15. java是否允许嵌套属性?
- 16. 是否允许“复制”API数据库?
- 17. SLX云是否允许自定义库?
- 18. 是否有任何语言允许突破多个循环?
- 19. 是否有任何协议规范允许使用TCP或UDP?
- 20. 是否有任何图像格式允许打开注释框?
- 21. 是否有任何SDK或库允许我读取iPad2上的条形码?
- 22. configSource文件'Unity.xml'也用于父项,这是不允许的
- 23. 是否有ORM允许“插件”扩展数据库?
- 24. 是否有允许异常的文件比较工具?
- 25. 是否有任何库允许Python或Ruby从SVN获取信息?
- 26. JSON语法是否允许元素的裸标签?并允许单引号?
- 27. 是否允许ClickOnce更新?
- 28. MapKit是否允许StreetView?
- 29. 有没有TFS政策只允许合并而不是编辑?
- 30. 是否有任何Rails插件允许视图中的类Excel功能?
通过“合并”,你的意思是一些简单的串联?还是更有趣?合并部分或docx(而非doc)部分的难度是? – 2010-03-22 17:57:57
合并应该给出与我们在MS Office第一个文档中手动打开相同的结果,请按Ctrl + C,然后打开第二个文档,直到它结束并按Ctrl + V。 – Roman 2010-03-22 18:07:23