Java导出带有单选款(radio)和复选框(checkbox)选中效
果的worddoc⽂。。。
今天客户提出要求,要求把表数据导出成为word⽂档格式。导成word格式的这种需求很寻常,但是看到word模板⾥⾯的这种单选框和多选框(如下图),要求实现选中效果,我就有点懵B了。到处百度,google,查询了下,发现好多都是要使⽤office开发⼯具来实现,我觉得太⿇烦,驾驭不住。
最后想到有没有单选框或者复选框这样的特殊字符。于是在搜狗输⼊法⾥⾯查询特殊,发现还真有特殊字符,但是字符效果不太符合我要求,单选框选中效果太丑,复选框选中效果是⽅框⾥⾯打叉形式,瞬间就被我PASS掉了。皇天不负有⼼⼈,终于让我在word的特殊字符中到想要的效果( Word > 插⼊ > 符号 > 其他符号(M)..), 也就是字体 Wingdings有我们需要的特殊字符
这⾥先展⽰下最终导出的显⽰效果(如下图),可以看到复选框和单选框被选中的效果都已经有了:
这种⽅式唯⼀的弱点就是: ⽆法导出的doc⽂档没有真正的点击效果,也就是你打开word⽂档,点击复选框,复选框不会被置为选中效果,只是使⽤特殊字符,实现展⽰上的选中和⾮选中效果⽽已,但是对我的需求来说已经够⽤了。
下⾯就来看下较为完整的代码实现:
⼀:⾸先是创建freemark的word导出模板, word模板如下图所⽰:
其中${XXXX} 形式的语法为freemarker的语法,不多介绍了。这⾥有个问题就是,${survey_date} 这样的语法内容在第⼆步导出的word xml⽂档中,容易被打断。有的建议是⽤类似⽂本编辑器编写好后⼀次性黏贴到word⾥⾯,不要在word⾥⾯⼀个个字符去输⼊,但是我发现即使都是复制黏贴进去的也会出现被打断的情况。不过没关系,后⾯会说明如何校正回来。
⼆:将⽂档保存为word 2003 XML⽂档格式
⽹络上有些⽂章是说导出为Word 2003 XML⽂档格式,可以⽀持2003版本的word,具体因为我电脑没有2003 word,,没有尝试过,所以我也不确定是不是能兼容2003版本word。
三:修改XML⽂档内容
这时候你如果使⽤寻常的编辑器打开第⼆个步骤⽣成的xml⽂件,发现是⼀堆没有格式化过的XML⽂档,⾮常难处理。有⽹络⼤神说使⽤【firstobject XML Editor】来打开,但是我安装后,打开xml⽂件,直接卡死。于是我⽤另⼀个编辑器【Visual Studio Code】,直接右键点击下 “格式化⽂件” (如果你没有这个功能,可能要安装下插件,在扩展⾥⾯,搜索下 xml format 就会发现有好⼏个XML format 插件。)
通过查 "${" 发现很多freemark的语法内容被打乱了,如下:
调整后效果如下:
然后我们需要将单选框和复选框的判断条件加上,通过查看XML⽂档,到复选框/单选框所在位置:
红⾊部分指定使⽤Wingdings字体中的特殊字符,通过事先插⼊特殊字符(单选/复选),我到分别代表单选框和复选框特殊字符的wordXML内容:
<w:sym w:font="Wingdings" w:char="F0A8"/> 复选框没选中
<w:sym w:font="Wingdings" w:char="F0FE"/> 复选框选中
<w:sym w:font="Wingdings" w:char="F0A1"/> 单选框没选中
<w:sym w:font="Wingdings" w:char="F0A4"/> 单选框选中
现在要做的仅仅是使⽤freemark判断条件,来判断是要展⽰复选框选中效果还是⾮选中效果:
java xml是什么
使⽤Freemark判断条件,来判断单选框选中效果:
然后剩下的⽆⾮是重复性劳动,⼀个个修改过去,反正我是眼睛都瞪累了才全部改完的。
最后记得把⽣成的XML⽂件,修改后缀名为 XXXX.ftl 放到你⾃⼰Freemarker的模板加载路径中去。
四: Spring加⼊Freemarker配置并导出doc⽂件
spring,application⽂件直接加⼊相关Freemarker配置,并加⼊freemarker相关jar包,这⾥简要展⽰下配置信息:
<bean id="freeMarkerConfigurer" class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">
<property name="templateLoaderPaths" value="/template/ftl" />
<property name="freemarkerSettings">
<props>
<prop key="defaultEncoding">UTF-8</prop>
<prop key="url_escaping_charset">utf-8</prop>
<prop key="locale">zh_CN</prop>
<!-- FreeMarker默认每隔N秒检查模板是否被更新,如果已经更新了,就会重新加载并分析模板。
但经常检查模板是否更新可能⽐较耗时。如果你的应⽤运⾏在⽣产模式下,⽽且你预期模板不会经常更新,
则可以将更新的延迟时间延长⾄⼀个⼩时或者更久。可以通过为freemarkerSettings属性设置template
_update_delay达到这⼀⽬的 --> <prop key="template_update_delay">3600</prop>
<prop key="tag_syntax">auto_detect</prop>
<prop key="whitespace_stripping">true</prop>
<prop key="classic_compatible">true</prop>
<prop key="number_format">0.>#</prop>
<prop key="boolean_format">true,false</prop>
<prop key="datetime_format">yyyy-MM-dd HH:mm:ss</prop>
<prop key="date_format">yyyy-MM-dd</prop>
<prop key="time_format">HH:mm:ss</prop>
</props>
</property>
</bean>
简单展⽰下Java代码调⽤Freemarker⽣成doc:
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
Java解析(读取)Json数据{}、[{}]
« 上一篇
发表评论