用POI中的SS在后台建立EXCEL表的基本思路如下:
1 前台发送请求,传递参数(如数据表名等)
2 ACTION接受参数,调用CreatExcelFromDatabase类中的方法进行创建 生成临时文件
3 返回这个临时文件,供前台下载(或是以下载方式返回)
具体的创建过程又可分为三个过程:
1 取得要返回对象的属性,做为EXCEL的字段Title
2 根据参数返回记录数据
3 根据字段和记录数据生成EXCEL
其中第1步,我考虑了两种方法:
A 用反射机制取得相关属性名称
B 用Hibernate取得相关属性名称
最后发现这两种方法确实能返回某一个对象的属性名称集合,但是做EXCEL时,还要对这些字段名称进行修改,比如 legName ----> Legislation ,并且返回的字段顺序是随机的,造成字段名与值不对是对应的 ,这是最严重的错误,所以必须改用其它方法,否则做出的EXCEL表头字段看起来就很怪/
想到了用XML文件来存储每个对象要建立EXCEL表的显示的字段名称,可以手动修改XML文件,通过DOM4J进行解析,虽然可以解决字段名称的问题,但是却不能解决字段与值对应的问题 (但是如果也将getter方法写入 到时一些抽取出来,两个问题就解决了,看来暂时的办法是用XML来解决问题了)
忙活了一天,终于搞定了,实现前台动态请求导出EXCEL的问题,做单元测试时没有问题,但是启动服务器,从浏览器传递请求,后台能生成EXCEL 但总是向前台返回:
FileInputStream cannot be cast to String
后来通过检查:发现是这个ACTION中有多个方法,对下载EXCEL的方法做了如下配置
<package name="caseExport" namespace="/case" extends="struts-default">
<action name="excel" class="org.macaulites.action.ExportExcelAction" method="getExcelStream">
<result name="success" type="stream">
<param name="contentType">application/vnd.ms-excel</param>
<param name="inputName">excelStream</param>
<param name="contentDisposition">attachment;filename="standard.xls"</param>
<param name="bufferSize">1024</param>
</result>
</action>
</package>
真是画蛇添足啊,去掉
method="getExcelStream"
就对了,只要给出了
<param name="inputName">excelStream</param>
框架会自动到这个ACTION中去找getExcelStream()方法的