java 关于项目导出功能实现过程中遇到的问题及思路历程
接收到的需求是这样的:在对excel进行导入后马上导出这个excel中各个数据的处理结果,比如说成功失败啊,失败原因是啥之类的。
导入的excel大体就是这样的,这个备注栏则是专门在导出时显示该条数据是否导入成功。
最开始的想法是这样的:直接在导入业务结束后,返回页面之前进行导出,所以导出代码和导入是写在同一个方法里面的。因此代码是这样的
以下是在方法开头进行各种准备,顺便说一下数据在导入过程中已经准备好,在此就不完整贴出来,毕竟没必要也不合适
下面则是导入后进行导出:
然而,在项目运行后效果是这样的
百度了一下,很可能是因为jsp页面out对象与我使用的poi工具使用的输出流冲突了,虽然这个报错并不影响程序运行。再三思考下,我决定换个写法:在类中新建一个export的方法,不再将导入导出写在同一个方法内,将导出对象设为全局对象,并且设置一个exportFlag作为进行前后台的交互标记。在导入行为结束后,将exportFlag赋值为1,然后jsp页面写入一个隐藏域接受exportFlag,当值为一时执行导出方法。代码如下:
这是定义全局变量
这是导出方法,在导入方法时便将exportFlag设为1了,值得注意的是在导出结束后记得重新设置exportFlag的值
另一个方法
这是接受exportFlag的隐藏域
然后是jquery执行方法
最后运行项目,确实可以在导入结束刷新页面后执行导出,committed错误也没有报了,导出的结果也正确。然而在我进行第二次导出测试的时候,项目报错了
经过多次项目重启测试,第二次导出都会报这个错误,而且也无法导出。百度了一下,原因大抵是流被关闭了,导致想要再次引用这个对象时发生错误。我去poi工具类稍微看了下,确实它在捕获异常时有个finally方法关闭了流。
想了一下,既然是这样那么就不能将导出对象设为全局变量,应该是写在导出方法内部,不过这样的或数据的获取就需要采用另一种方法了,不能采用excel.addCell()这个方法来设置excel数据了,最后选择定义一个全局的list对象,并且根据网上的意见加了个return null;代码如下:
这是全局list,list数据同样是在导入过程中设置,在此不详述
这是新的导出方法
注意有个list.clear()方法清空list,不然会导致list一直增长,导出数据错误。到此为此差不多了,多次测试也没发现其它问题。
第一次写博客不足之处还请见谅,而且贴的都是代码片段看着估计也很累,毕竟是公司项目,不可能贴完整代码的,嗯,就这样吧。