网上也有各种各样的实现方法,我也参考了一些,现将整个实现思路与过程与大家分享一下:
1、将word模板后缀名改为.vm,然后保存,这个时候打开会发现是一堆代码,其实也就是velocity脚本,这个脚本就是实现这个功能的关键。
可能这个时候很多人会想,我没听过velocity,根本不会!其实,我当初也是这样想的,其实,不然!仔细看一下这些脚本,你会发现,只要有过CSS基础,有编程的一些经验就完全可以操作这种脚本。比如:
<p class=3DMsoNormal align=3Dcenter style=3D'text-align:center;mso-pagina=
tion:widow-orphan;
mso-element:frame;mso-element-frame-hspace:9.0pt;mso-element-wrap:around;
mso-element-anchor-vertical:paragraph;mso-element-anchor-horizontal:page;
mso-element-left:107.25pt;mso-element-top:20.75pt;mso-height-rule:exactly=
'><span
lang=3DEN-US>$cutLinePlatform</span><span lang=3DEN-US style=3D'font-size=
:14.0pt;
font-family:FangSong_GB2312'><o:p></o:p></span></p>
这一段,跟HTML,CSS很相似,要改字体了,直接加个style=“”,至于$cutLinePlatform,则是你需要存放到word中的参数,这个下面在讲。
2、struts配置文件注意问题:
action中 result的type属性需要写velocity,跳转路径则是你的VM文件路径,如
<action name="NetWorkPortOutAction" class="cn.com.starit.local.web.localView.NetWorkPortOutAction">
<result name="SUCCESS" type="velocity">/localView/nwreport.vm</result>
</action>
3、具体的action类,也就是上一步配置的NetWorkPortOutAction
(1)将需要放入word文档的内容写成一个个属性,并添加get()和set方法(),一定要添加,这一步很重要!如果需要存放的不止一个参数,可以放在一个集合中,在vm中通过循环显示。
(2)需要重写execute()方法
(3)获取每一个属性的值,具体怎么获取是你的事,在通过set(“值”)传递到vm文件中
(4)如果有中文汉字的,则需要进行转码,这边提供一种方法:
/**
* 解决乱码的方法
* @param str
* @return
*/
public String encode2HtmlUnicode(String str)
{
if(str == null) return "";
StringBuilder sb = new StringBuilder(str.length() * 2);
for (int i = 0; i < str.length(); i++)
{
sb.append(encode2HtmlUnicode(str.charAt(i)));
}
return sb.toString();
}
(5)当所有的属性都set值之后,就可以导出了:
response.setHeader("Content-disposition", "attachment; filename="
+ URLEncoder.encode("network.doc",
"UTF-8"));
4、VM文件的处理
光有上面那些步骤是不够的,还需要对VM文件进行操作。
将需要传的参数都在word文档中对应位置写好,具体为 $cutLinePlatform,其中cutLinePlatform就是第三步中的属性,然后再次生成VM文件。
值得一提的是vm文件中集合遍历的处理,如:
#foreach($bean2 in $faultTypeIdList)
#if(${bean2.bus_count} != 0)
<span style=3D'font-s=
ize:
16.0pt;font-family:FangSong_GB2312'> 本周发生${bean2.businname}专业故障</span>
<span
lang=3DEN-US ><span style=3D'font-size:14.0pt;font-family:FangSong_GB2312'>${bean2.bus_count}次</span></span>
<span
lang=3DEN-US><o:p></o:p></span></span></p>
#end
#end
这段代码中,通过#foreach遍历集合,集合中的值需要展示的时候,则不能像普通的属性一样用$XXX了,而是${bean2.bus_count},bean2为#foreach中定义的名称,就像java中的增强for循环,sus_count为集合中的元素,这样就可以遍历集合显示在word文档中了(这些集合中的元素不需要写在action类中的属性,action中有这个集合的属性就OK)。
接下来就会发现能够导出你需要的word文档了!