有没有Java API可以创建丰富的Word文档?

113

我有一个新的应用程序需要生成一个包含表格、图形、目录和文本的 Word 文档。有哪些好的 API 可以使用?您对其支持图形、目录和表格感到多么确定?在使用它们时有哪些隐藏的注意事项?

一些澄清:

  • 我无法输出 PDF,他们想要 Word 文档。
  • 他们正在使用 MS Word 2003(或 2007),而不是 OpenOffice。
  • 应用程序正在运行在 *nix 应用服务器上。

如果我可以从一个模板文档开始,并只填写一些空白表格、图形等内容,那就太好了。

编辑:下面有几个好的答案,每个答案在我的当前情况下都有其缺点。很难从中选择一个“最终答案”。我会让它保持开放状态,并希望能够创建出更好的解决方案。

编辑:OpenOffice UNO 项目似乎是最接近我所要求的。虽然 POI 显然更主流,但对于我想要的东西来说还太不成熟。


27
不确定在最后编辑时间为30个月之后以及在最初提问时间的3年之后关闭这个问题是否有多大的生产力。如果我将标题更改为“如何使用Java API创建丰富的Word文档?”能否解决这个问题? - billjamesdev
1
如果有人需要对可用的Java API进行全面审查,请访问http://www.esupu.com/open-source-office-document-java-api-review/。 - Supun Sameera
你可以看一下 docxtemplater,https://github.com/edi9999/docxtemplater/ 这个库,它是我创建的一个用于从 docx 模板生成 docx 的库。 - edi9999
1
问题应该重新开放。问题已经被重新表述以符合规则,因此我想呼吁有权重新开放此问题的人。在修改前,问题是:有什么好的Java API可以创建Word文档?现在问题是:是否有Java API可以创建富文本Word文档?现在问题清楚地指出了提问者想要的内容:创建带有图表、目录和表格的Word文档。问题也不再要求“好”的Java API。好对每个人来说都不同。 - Sjoerd Pottuit
16个回答

56

在2007年,我的项目成功地使用了OpenOffice.org的通用网络对象(UNO)接口来从Java Web应用程序(一个Struts/JSP框架)中以编程方式生成与MS-Word兼容的文档(*.doc),以及相应的PDF文档。

OpenOffice UNO还可以让您构建与MS Office兼容的图表、电子表格、演示文稿等。我们能够动态地构建复杂的Word文档,包括图表和表格。

我们通过使用带有书签插入的模板MS-Word文档简化了这个过程,软件将内容插入其中,但是您也可以完全从头开始构建文档。目标是让软件生成报告文档,供最终用户在将其转换为PDF进行最终交付和归档之前共享和进一步调整。

如果您希望用户使用OpenOffice而不是MS-Office,则可以选择以OpenOffice格式生成文档。在我们的情况下,用户想要使用MS-Office工具。

UNO已包含在OpenOffice套件中。我们只需将我们的Java应用程序链接到套件中的与UNO相关的库即可。OpenOffice软件开发工具包(SDK)提供了示例应用程序和UNO开发人员指南。

我还没有调查最新的OpenOffice UNO是否可以生成MS-Office 2007 Open XML文档格式。

关于OpenOffice UNO的重要事项:

  1. 它是免费软件
  2. 它支持多种语言(例如Visual Basic、Java、C++等)。
  3. 它是跨平台的(Windows、Linux、Unix等)。

以下是一些有用的网站:


1
到目前为止,这是我要求的工具集中最兼容的。我将标记它为“已接受”。尽管我完全认识到POI更流行,但它还没有我想要的功能。 - billjamesdev

30

我认为Apache POI可以胜任这项工作。根据您的使用目的可能会遇到一个问题,因为HWPF仍处于早期开发阶段。

HWPF是一组API,可使用Java(仅限)读写Microsoft Word 97(-XP)文档。


有关图表和表格的相关知识吗?目录方面怎么样?有人在POI中真正做过这些事情吗? - billjamesdev
1
查看POI文档,似乎这个HWPF还处于早期开发阶段,主要允许从.doc文件中读取文本,不太适合动态创建“复杂”文档。 - billjamesdev
我不相信它能处理更复杂的图表/表格等内容。 - Brian Agnew
POI还是docx4j?https://dev59.com/HGUp5IYBdhLWcg3w1aJ7 - JasonPlutext

9
你可以使用这个: http://code.google.com/p/java2word 我实现了一个名为Java2Word的API。只需几行代码,就可以生成一个Microsoft Word文档。
例如:
IDocument myDoc = new Document2004();
myDoc.getBody().addEle(new Heading1("Heading01"));
myDoc.getBody().addEle(new Paragraph("This is a paragraph...")

以下是翻译:

这里有一些如何使用的示例。基本上,您只需要一个jar文件。 如果您需要任何进一步的设置信息,请告诉我。

*我写这篇文章是因为我们在项目中有一个真正的需求。更多请参见我的博客:

http://leonardo-pinho.blogspot.com/2010/07/java2word-word-document-generator-from.html *

祝福 Leonardo

编辑:链接中的项目已移至https://github.com/leonardoanalista/java2word


1
你有使用实际的 MS Word 进行测试吗?我已经成功创建了一些文件,可以被 OpenOffice 和 LibreOffice 读取,但无法在 Windows 上被 MSWord 读取。(我已经在 http://code.google.com/p/java2word/issues/detail?id=16 报告了这个问题) - Stein G. Strindhaug
2
我无法使用OpenOffice打开由java2word生成的文件?但在Office 2010中可以正常工作。 - Ashika Umanga Umagiliya
它支持创建 .docx 文件吗?@Leonardo - MaheshVarma
新项目主页:https://github.com/leonardoanalista/java2word - vhunsicker

5
尝试使用Aspose.Words for Java,它可以在安装了Java的任何操作系统上运行。如果需要MS Word输出格式,则可以将文档输出为DOC、DOCX或RTF。所有格式都得到同等支持。
使用此API,您可以从头开始创建文档,从节点中设置其格式属性。您还可以使用DocumentBuilder提供的更高级别的方法,例如创建表格行、插入字段等。或者您可以在现有的预创建文档之间复制/合并/移动部分,比如您想组装一个合同,只需从几个文档中抓取和复制片段,Aspose.Words会在结果文档中正确地合并样式、列表格式等。
您将能够使用Aspose.Words插入TOC字段,但是截至今天,当文档在Microsoft Word中打开时,TOC字段将需要进行字段更新。然而,我们将在2010年初发布对TOC字段的完全支持。例如,它将像MS Word一样构建完整的TOC。
我是Aspose.Words团队的一员。

4
仅提到一次,我想特别提一下docx4j库,因为我用docx4j比其他任何东西都更成功。Apache POI对Word文档的支持不太好。此外,与Aspose.Words不同,docx4j是一个开源库。
唯一的缺点是,使用docx4j你必须创建Office Open XML(docx)格式的文档,而不是基于OLE2的(doc)格式的文档。这是Word 2007的默认格式,但是Word 2003及更早版本的用户需要安装兼容性包。

4

试试Aspose.Words for java。

Aspose.Words for Java是一个高级(商业)类库,可让您在Java应用程序中直接执行各种文档处理任务。

Aspose.Words for Java支持DOC、OOXML、RTF、HTML和OpenDocument格式。使用Aspose.Words,您可以生成、修改和转换文档,而无需使用Microsoft Word。


3

我在.NET中使用了Aspose.Words来进行邮件合并。我相信他们也有一个Java版本。


2
有一个称为JODConverter的工具,它连接到Open Office以公开其文件格式转换器,有可用作Web应用程序(位于Tomcat中)的版本,您可以将其发布到命令行工具。我一直在使用它将HTML转换为.doc和.pdf文件,并且已经成功地在一个相当大的项目中使用它,尚未上线,但我认为我将会继续使用它。 http://sourceforge.net/projects/jodconverter/

2
您可以使用Java COM桥接器,例如JACOB。如果是从客户端开始,则另一个选择是使用Javascript。

谢谢,但看起来这需要在Windows机器上运行,对吗?我阅读后澄清了主机机器的操作系统,但还是感谢您提供的信息。 - billjamesdev
在 Web 服务器上使用 JACOB 需要安装 Microsoft Word,因为通过 COM 接口创建和操作 Word 文档需要启动实际的 Word 应用程序。一般来说,在多用户服务器上使用 Word+COM 是相当棘手的,因为 Word 并不是为这种用途而设计的 - 例如,在传统的设置中,复制文档的部分是使用 Selection 对象和 Windows 剪贴板完成的,这在 Web 服务器机器设置中是不可想象的。我曾经因此受到过很大的伤害(尽管找到了一些调整方法)。 - hello_earth

1

我过去曾经开发过基于纯XML的Word文件。我使用了.NET,但是语言并不重要,因为它是真正的XML。这并不是一件容易的事情(几年前有一个需要它的项目)。这些只能在Word 2007或更高版本中使用 - 但你只需要微软的白皮书来描述每个标记的作用。你可以通过标记实现所有你想要的功能,就像你使用Word一样(当然最初可能会有点痛苦)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接