在* .docx文档中使用Groovy脚本

介绍

我最近的项目之一要求为客户自动生成合同。 合同是一份约10页的法律文件。 一个合同表格可以适用于许多客户,因此该文档是一个模板,其中客户信息放置在某些位置。

在本文中,我将向您展示如何解决此问题。

要求

这是形式化要求的初始版本:

指定的数据必须放在复杂的DOC / DOCX文件的标记位置

随后对要求进行了完善和扩展:

  1. 指定的数据必须放置在复杂DOCX文件的标记位置。
  2. 输出标记必须类似于scriptlet:$ {},<%%>,<%=%>。
  3. 输出数据不仅可以是字符串,还可以是散列和对象。 现场访问必须是一个选择。
  4. 输出语言必须简短且脚本友好:Groovy,JavaScript。
  5. 在表中显示对象列表的可能性,每个单元格显示一个字段。

背景

事实证明,该领域的现有产品(我在谈论Java世界)不符合最初的要求。

产品简要概述:

碧玉报告

Jasper Reports使用* .jrxml文件作为模板。 模板文件与输入数据(SQL结果集或参数映射)结合在一起,被提供给处理器,该处理器形成以下任何格式:PDF,XML,HTML,CSV,XLS,RTF,TXT。

不适合:

  1. 即使在iReport的帮助下,它也不是所见即所得的。iReport是创建jrxml模板的可视工具。
  2. 必须熟练掌握JasperReports API才能创建和设置复杂模板的样式。
  3. JR不会以合适的格式输出。 PDF可能还可以,但最好具有手工编辑能力。

Docx4java

Docx4j是用于创建和处理Microsoft Open XML(Word docx,Powerpoint pptx和Excel xlsx)文件的Java库。

不适合:

  1. docx4java 文档中没有满足我要求的案例。 提供了有关XMLUtils.unmarshallFromTemplate功能的简短说明,但它仅进行最简单的替换。
  2. 使用准备好的XML源和XPath 链接可以重复输出

Apache POI

Apache POI是用于创建和处理*部分的Java工具。 doc,*。ppt,*。xls文件。 Apache POI api的主要用途是用于文本提取应用程序,例如网络蜘蛛,索引构建器和内容管理系统。

不适合:

  1. 没有任何符合我要求的选项。

Word内容控制工具包

Word Content Control Toolkit是一个独立的轻量级工具,可以打开任何Word Open XML文档并列出其中的所有内容控件。

在用scriptlet开发了自己的解决方案之后,我听说了基于此工具和XSDT转换结合的解决方案。 它可能对某人有用,但是我没有费心去挖掘,因为它只需花费较少的步骤即可直接使用我的解决方案。

解决问题

好玩!

1 。 文档文本内容在zip归档文件中存储为Open XML文件。 传统的JDK 6拉链不支持显式编码参数。 也就是说,使用此拉链可能会生成损坏的docx文件。 我必须使用Groovy-wrapper AntBuilder进行压缩,它确实具有编码参数。

2 。 您在MS Word中输入的任何文本都可能被“任意”分解成用XML包装的部分。 因此,我不得不解决从模板xml生成的清洁垫的问题。 我为此任务使用了正则表达式。 我没有尝试使用XSLT或其他任何东西,因为我认为RegEx会更快。

3 。 我决定将Groovy用作脚本语言,是因为它具有简单性,Java性质和内置的模板处理器 。 我发现了一个与处理器有关的有趣问题。 事实证明,即使在一个10页的小型文档中,也很容易遇到两个小脚本之间字符串长度的限制。
我必须用UUID字符串替换一对小脚本之间的文本,使用修改后的文本运行Groovy模板处理器,最后用初始文本片段将这些UUID占位符切回。

克服这些困难之后,我在现实生活中尝试了该项目。 原来很好!

我创建了一个项目网站并发布了该网站。

项目地址: snowindy.github.com/scriptlet4docx/

代码示例

HashMap<String, Object> params = new HashMap<String, Object>();
params.put("name","John");
params.put("sirname","Smith");

DocxTemplater docxTemplater = new DocxTemplater(new File("path_to_docx_template/template.docx"));
docxTemplater.process(new File("path_to_result_docx/result.docx"), params);

脚本类型说明

$ {数据}
等效于out.print(data)

<%=数据%>
等效于out.print(data)

<%any_code%>
评估包含的代码。 没有应用输出。 可用于分割条件:

<% if (cond) { %>
This text block will be printed in case of "cond == true"
<% } else { %>
This text block will be printed otherwise.
<% } %>

$ [@ listVar.field]

这是一种自定义Scriptlet4docx脚本类型,旨在将对象集合输出到docx表。 它必须在表格单元格内使用。

说,我们有一个人对象列表。 每个字段都有两个字段:“名称”和“地址”。 我们想将它们输出到一个两列的表中。

  1. 使用引用该集合的键“ personList”创建一个绑定。
  2. 在模板docx文档中创建一个两列表:两列,一行。
  3. $ [@ person.name]转到第一列单元格; $ [@ person.address]转到第二个。
  4. 瞧,整个收藏品都会印在桌子上。

实时模板示例

您可以在演示模板中检查所有提到的scriptlet的用法

项目未来

如果我真的开发了一种处理docx模板的新方法,那么推广它会很好。

项目待办事项:

  1. 预处理模板缓存,
  2. 列表中的小脚本支持
  3. 流API

参考: 我们的W4G合作伙伴 Eugene Polyhaev 的* .docx文档中使用Groovy脚本


翻译自: https://www.javacodegeeks.com/2012/05/using-groovy-scriptlets-inside-docx.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值