freemarker ftl模板_Ftl模板生成复杂Excel表格说明

各位朋友大家好,由于工作繁忙,好久都没有上传工作中遇到的大坑的解决办法了。今天给大家总结一下,ftl模板生成复杂Excel表格之一:动态合并单元格!

本说明只是根据当前工作需要,临时使用freemarker的ftl模板,如有不足之处还望各位朋友不吝赐教!

一.页面展示部分

本次需求是需要制作采购平台的内容数据分析:包括采购员的、物料的和供应商的。采购员和供应商的数据分析十分的简单,只是一对一显示,按照之前的写法循环遍历即可;而物料的数据分析着实让我有些犯难,主要问题就是单元格的动态合并!客户要求的页面显示如下图:

762d7a754182762568da1ea5a90c4f24.png

客户要求在平台页面展示的样式

在页面展示中,相同物料名称等相同项需要合并单元格,其余项分开展示。在脑海中早就有成品样式,但是写法上需要能整合到当前程序代码中。在经过一番试验和百度后,我找到了合适的写法,代码非常简单。

25765eff652c4d9643664657ad52bca9.png

页面循环的前半部分

c95444181db15913a0987dad04db06fe.png

页面循环的后半部分

程序使用的是jsp页面写法,循环两次list,找到一个合并单元格的标志(本次使用的是物料名称),判断之前需要添加几个临时变量,根据变量判断什么时候该合并单元格以及需要合并的行数。这种写法完全能够满足页面展示的需要。灵感源自:https://www.php.cn/js-tutorial-347365.html(JSP中动态合并单元格的实例代码)。

二.Ftl模板写法部分

Ftl模板的合并单元格与页面是一样的,先找到需要合并的字段,获得合并的行数值,根据条件循环遍历即可!但是由于接触freemarker的时间并不长,还属于小学生阶段,所以对部分生成合并单元格的属性并不是很了解,因此耗费了些许时间。

04f7ff75542e8873ffb47342d4be219c.png

ftl模板中的属性及写法

在截图中,ExpandedRowCount表示的是下载表格的行数,例如当ExpandedRowCount=“2”但表格中有3行内容,下载后会打不开表格(显示文件已损坏);因此,一定要在生成ftl模板后将ExpandedRowCount的值修改为较大数值。Index=“n”表示的是表格在同一行中向后移位的属性,当它在Column中代表的是下载表格打开后显示的第n+1列之后的内容,查看全部内容需要移动表格;在Cell中代表的是当前行中的第n列,之后会有截图展示。

8a82be150402b833bb006d02b0f43a8f.png

ftl模板中的临时变量属性

在截图中,assign代表了临时变量的属性,类似于jsp中的var。将所需要的变量赋值,使用方式可参照jsp页面的判断方法。

c1fe92551707171ed92dce70af3fa7af.png

ftl模板中的合并单元格属性

在截图中,MergeDown代表了生成Excel表格中的合并单元格属性,在需要合并行的Cell中输入需要合并的行数-1即可;例如,如果需要合并两行,那么MergeDown=“1”。在合并行后边显示的不需要合并的行的第一行Cell中加入Index属性,ss:Index="n",n的值为当前行的行数;例如,截图中需要合并的行是2/3/4/5/6,从第七行开始不需要再合并,所以n=”7”,之后行中的内容就单行正常显示。

注:当某一行内容可能会含有特殊字符时,使用?html即可解决。防止文件下载后,打开会显示文件已损坏。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
FreeMarker是一种基于模板的Java模板引擎,它允许您使用模板生成任何类型的文本输出FreeMarker使用FTLFreeMarker Template Language)作为其模板语言,FTL基本上是一个文本文件,其包含模板指令和占位符,用于生成所需的输出FTL模板可以包含HTML、XML、JSON或任何其他文本格式。 以下是一个简单的FreeMarker FTL模板示例: ``` <html> <head> <title>Welcome to FreeMarker!</title> </head> <body> <h1>Welcome ${user}!</h1> <p>Here are your orders:</p> <ul> <#list orders as order> <li>${order}</li> </#list> </ul> </body> </html> ``` 在此模板,`${user}`和`${order}`是占位符,它们将被实际值替换。`<#list>`指令用于遍历订单列表。 要使用FreeMarker,您需要创建一个Configuration对象,并将其配置为查找FTL模板的位置。然后,您可以使用Template对象加载模板并将数据模型传递给它。最后,使用Template.process()方法将数据模型与模板合并生成输出。 以下是一个简单的Java示例: ``` Configuration cfg = new Configuration(Configuration.VERSION_2_3_30); cfg.setClassForTemplateLoading(this.getClass(), "/templates"); Template template = cfg.getTemplate("welcome.ftl"); Map<String, Object> data = new HashMap<>(); data.put("user", "John"); data.put("orders", Arrays.asList("Order 1", "Order 2", "Order 3")); Writer out = new StringWriter(); template.process(data, out); String output = out.toString(); ``` 在这个例子,我们将模板放在`/templates`目录下,并将其加载到`Template`对象。然后,我们创建一个包含用户和订单数据的Map,并将其传递给`Template.process()`方法。最后,我们将生成输出保存在一个字符串。 这只是一个简单的例子,FreeMarker还有许多高级功能,例如条件语句、循环、自定义指令等。您可以在FreeMarker官方文档找到更多信息。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值