1

用来自 MySQL 数据库的数据替换 .docx 文档(Word 2010)中的占位符的最佳方法是什么?

我可以使用服务器端语言打开文件并为每个占位符进行字符串替换吗?

是否有任何现有的工具/库可用?

谢谢

4

9 回答 9

3

**披露:我领导docx4j项目 **

有大量可用的现有工具/库!

是的,您可以只进行字符串替换,但这是一种脆弱的方法,因为 Word 可能已经在运行中拆分了字符串。

您可以使用 MERGEFIELD 或内容控制数据绑定。

docx4j 支持所有三种方法,但内容控制数据绑定是最强大的。

特别要考虑的一件事是“重复”。如果你想在 Word 中说表中的一行,对于 MySQL 表中的每个匹配行,那么你需要一种方法来实现这一点。

docx4j 通过围绕表格行的“重复”内容控件来做到这一点;无论您选择哪种解决方案,我都会预先确保它可以处理重复。

于 2012-09-05T22:11:25.120 回答
3

披露:我为 Invantive 工作。

使用 Invantive Composition ( http://www.invantive.com/products/invantive-composition ),您可以使用数据库(IBM DB2、Oracle、MySQL、Teradata 和 SQL)中的数据填充 Word 文档(信件、法律诉状、保险单)服务器),然后手动完全更改内容。它适用于通过中央 Web 服务和带有查询的模型访问数据库的真正 Microsoft Word 最终用户(制作模板的人和使用模板的人)。Invantive Composition 允许嵌套重复的数据组和布局。使用单击一次集成到 Microsoft Word。

过去,我个人也一直在使用 JasperReports ( http://community.jaspersoft.com/project/jasperreports-library ) 使用 JasperReports 的 RTF 输出目标生成字母。只要您不想编辑超过几个字的输出并且具有 Java/SQL 开发技能,它是免费的并且可以正常工作。就像 Invantive Composition 一样,它适用于大量不同的报告。

只要能完全控制环境,也可以考虑使用RTF作为中间语言(不针对最终用户,只针对真正的开发者)。将文档另存为 RTF,替换您需要替换的部分文本,编写一个接受参数并转储返回结果 RTF 的 Web 服务。需要一些时间来生成更复杂的表格(表格显然是人类在编写 RTF 规范之后发明的东西 :-) 这种方法仅适用于数量非常有限的模板,并且当您有足够的开发人员时间来启动它时运行并稳定。

作为一名独立审阅者,我也看到了使用 XML 模板的案例,但结果不如 JasperReports。

于 2013-10-24T07:36:46.907 回答
2

如果您想使用 PHP,最完整​​的可用解决方案是PHPDocX

您可以在教程中查看如何用来自任何数据源(如 MySQL DB)的数据替换占位符变量。

特别是,您可以使用不定数量的条目填充表格行,并且您可以删除整个 Word 文档块,具体取决于提供给应用程序的数据或构建动态 Word 图表。

您可以查看可用的 DEMO 以获得一个简单但非常说明性的示例(其内部工作原理在教程部分中进行了解释)。

于 2012-09-05T19:54:33.647 回答
1

披露:我领导 docxgenjs 项目

我认为您不必自己编写所有代码,这就是为什么我为 docx创建了一个类似 Mustache 的模板引擎

演示:

http://javascript-ninja.fr/docxgenjs/examples/demo.html

回购

https://github.com/edi9999/docxgenjs

它是基于 JS 的,可以在客户端和服务器端工作。

于 2013-09-16T12:29:43.670 回答
1

您可以使用开放的Open XML SDK并像这样替换占位符。

于 2012-09-05T17:37:29.973 回答
0

是的,您可以使用服务器端语言来做到这一点。检查apache POI。

http://poi.apache.org

于 2012-09-05T16:18:28.167 回答
0

您好,我阅读了上面的评论,尤其是评论,Ivantive 看起来令人印象深刻——但我需要的解决方案要简单得多。在 Word 中使用 Selection.Range.InsertDatabase 从 access 数据库或 excel 电子表格甚至只是另一个 word 文档中获取记录。使用访问解决方案,您可以选择要获取的记录的布局,并让它根据字段(例如 ID)仅获取特定的记录。谷歌上面的话,它会带你到 MS 指导和一个示例 VB 脚本。在短短几分钟内工作得很好。现在寻找 VB 脚本,询问该人他们想要从 dbase 获得什么 ID,我们就完成了。

于 2013-12-20T11:59:30.947 回答
0

它使用具有与 java 对象合并字段的 docx 模板(这些对象具有您从 mysql 或任何其他来源加载的信息)。xdoc 报告是一个 java 语言的项目,项目的主页是https://code.google.com/p/xdocreport/

于 2014-04-11T02:34:18.650 回答
0

*披露:我创建了 templ4docx 项目 *

你好

您可以使用 maven 中央存储库上的 templ4docx java 库,因此您可以将其添加到您的 maven 依赖项中:

<dependency>
    <groupId>pl.jsolve</groupId>
    <artifactId>templ4docx</artifactId>
    <version>2.0.0</version>
</dependency>

示例用法:

    Docx docx = new Docx("E:\\template.docx");
    Variables variables = new Variables();
    variables.addTextVariable(new TextVariable("${firstName}", "John"));
    variables.addTextVariable(new TextVariable("${lastName}", "Sky"));
    docx.fillTemplate(variables);
    docx.save("E:\\filledTemplate.docx");

您可以在此处找到更多详细信息:http: //jsolve.github.io/java/templ4docx/

于 2015-07-14T05:39:25.940 回答