poi 导出excel 异常处理方式--曲线救国法
excel 导出不算什么新鲜的话题。目前各种生成excel的开源jar包,poi,jxtl等。但是下载过程中如果出现异常该如何处理呢。
翻了之前的几个项目中的excel导出,有的异常就直接抛了出去,有的打印了异常。Action 中异常已经在最顶层了,抛出显然不是明智之举。但是捕获异常之后不做任何处理,用户体验也不好。有人一定会问,那还不好办,定义一个异常标识,捕获异常之后传给页面,提示用户;没有异常就正常导出就好了吗!问题就在这里。我第一次的js的写法
window.location.href="policyExportInfo.action";
js定向到这个地址:然后执行一系列的excel组装操作,最后得到一个inputstream,然后我是用struts2的type=stream,直接将这个流输出。这是一个无返回值的操作,我根本得不到返回值。
那第二个方法,使用ajax。
$.ajax({
url: "policyExportInfo.action",
success: function(returnData){
if(returnData==0){
alert("导出失败,请重试");
}
});
这样子可已接受到返回值了吧!但问题是,如果导出成功,excel的inputstream也同样呗当做流返回回来了。查了一些资料使用ajax导出是不行的。
然后我想,如果是没有返回值的ajax,是不是行呢。
我在java 里面把异常信息print出来。
response.reset();
response.setContentType("text/html charset=GBK");
try {
response.getWriter().write("<script>");
response.getWriter().write("alert('导出失败,请重试');");
response.getWriter().write("</script>");
} catch (IOException e1) {
e1.printStackTrace();
}
结果是否定的,不行。
折腾了2天之后,决定尝试最后一种方法,不行就放弃。
在java中定义一个标识,标志导出成功或者失败,如果导出成功就将这个excel存在服务器上(其实随便存在哪里都行了)。返回给页面的是这个标识。如果是导出成功的,执行下载操作,下载之后这个文件删除;
有人会问:那下载中的异常怎么办。在同一台服务器上,除非服务器挂了,否则下载失败是小概率事件,我觉得这个是可以忽略的。但是生成excel不同。这期间包含系统的逻辑处理,同时还会有一些跨服务器的访问,你这了没问题,难免别人不会有问题。
具体代码片段如下:
jsp中:
$.ajax({
url: "policyExportInfo.action", success: function(returnData){
if(returnData==0){
alert("导出失败,请重试");
}else{
window.location.href="policyExportInfo.action";
}
}
});
java 中:
public String policyExportInfo(){
HttpServletResponse response = ServletActionContext.getResponse();
HttpSession session = request.getSession();
WrUser user = (WrUser) session.getAttribute("user");
String userCode = user.getUserCode();
String dirPath="";
String excelPath = "";
PubTools pTool = new PubTools();
try {
dirPath= pTool.getUrlBykey("sysconfig.filePath");
} catch (IOException e2) {
e2.printStackTrace();
}
excelPath = dirPath + "//" + userCode + new DateTime(new Date(), new DateTime().YEAR_TO_DAY);//导出excel存放的路径
logger.info(excelPath);
File uploadFilePath = new File(excelPath);
// 如果该目录不存在,则创建之
if (uploadFilePath.exists() == false) {
uploadFilePath.mkdirs();
}
String as = excelPath + "//" + "承保查询"+new DateTime(new Date(), new DateTime().YEAR_TO_DAY)+".xls";
session.setAttribute("exportFile", as);//下载文件
File myFilePath = new File(as);
if (!myFilePath.exists()) {
GcspPolicy policy = (GcspPolicy) session.getAttribute("policy");//获取查询对象
if(user!=null&&policy!=null){
policy.setThisComCode(user.getComCode());
}
custType = user.getCustType(); String reqXML = this.getXML(custType,"POLICYEXPORT",policy);
GcspServerClient client = new GcspServerClient();
// String xmlData1="E:\\policyReturn.txt";
// String returnValue = this.readFile(xmlData1);
String returnValue = "";
String returnValueDecompress = "";
response.setContentType("text/html; charset=UTF-8");
ServletOutputStream out = null;
try {
out = response.getOutputStream();
} catch (IOException e1) {
e1.printStackTrace();
}
try { //总线保存采用GZIP压缩,并用base64转码;接收到总线返回报文后,需先使用base64解码,并解压缩
returnValue = client.requestXML(reqXML);//获取报文
byte[] b = new sun.misc.BASE64Decoder().decodeBuffer(returnValue);//使用BASE64解码
byte[] b1= client.decompress(b);//解压缩
StringUtil s= new StringUtil();
returnValueDecompress = s.byteToChar(b1, "GBK");
policyList = new ArrayList<GcspPolicy> (); String rtnPage = this.messageParsingPage(returnValueDecompress);
if(rtnPage.contains(";")){
String strTemp[] = rtnPage.split(";");
if(strTemp.length>0){
policyList = this.messageParsingPolicy(returnValueDecompress);
}
} else {
out.print("0");
return "none";
} if(policyList!= null){
HSSFWorkbook workbook;
workbook = exportExcelStyle(policyList); FileOutputStream output = new FileOutputStream(as); // 输出流
//ByteArrayOutputStream output = new ByteArrayOutputStream();
workbook.write(output);
output.flush();
//byte[] ba = output.toByteArray();
//inputStream = new ByteArrayInputStream(ba,0,ba.length); output.close();
}else{
out.print("0");
return "none";
}
} catch (Exception e) {
try {
out.print("0");
return "none";
} catch (IOException e1) {
e1.printStackTrace();
}
}
try {
out.print("1");
return "none";
} catch (IOException e) {
e.printStackTrace();
}
}else{
//下载
String exportFile = (String) session.getAttribute("exportFile");
try {
Downfile downfile = new Downfile();
downfile.downfileByPath(response, request, exportFile);
downfile.deleteDirectory(excelPath);// 删除excel 文件夹
downfile.deleteFile(exportFile);// 删除生成的压缩文件
} catch (IOException e) {
e.printStackTrace();
}
} return "none";
}
以上是个人的一点小小愚见,欢迎拍砖!
poi 导出excel 异常处理方式--曲线救国法的更多相关文章
- 关于poi导出excel三种方式HSSFWorkbook,SXSSFWorkbook,csv的总结
poi导出excel最常用的是第一种方式HSSFWorkbook,不过这种方式数据量大的话会产生内存溢出问题,SXSSFWorkbook是一种大数据量导出格式,csv是另一种excel导出的一种轻快的 ...
- 关于poi导出excel方式HSSFWorkbook(xls).XSSFWorkbook(xlsx).SXSSFWorkbook.csv的总结
1.HSSFWorkbook(xls) import org.apache.poi.hssf.usermodel.HSSFCell; import org.apache.poi.hssf.usermo ...
- 用POI导出excel时,较长的数字不想被自动变为科学计数法的解决方式(转)
做过很多次导出excel了.都碰到一个问题,内容里如果包含一个比较长的数字,比如订单号“2546541656596”,excel会自动变成科学计数法... 弄过好几次都没有解决,最近又要导出excel ...
- POI导出excel的三种方式
原文链接:https://www.cnblogs.com/zhaoblog/p/7661245.html poi导出excel最常用的是第一种方式HSSFWorkbook,不过这种方式数据量大的话会产 ...
- POI导出excel的简单demo
目前使用过两种导出excel的方式,一种是如题所示的使用POI的方式进行数据的导出,这种方式一般只有在处理比较多的数据或者说需要导出的excel表格中有图片之类的需要特殊处理的文件的时候使用:还有一种 ...
- POI导出EXCEL经典实现
1.Apache POI简介 Apache POI是Apache软件基金会的开放源码函式库,POI提供API给Java程式对Microsoft Office格式档案读和写的功能. .NET的开发人员则 ...
- Java POI 导出EXCEL经典实现 Java导出Excel
转自http://blog.csdn.net/evangel_z/article/details/7332535 在web开发中,有一个经典的功能,就是数据的导入导出.特别是数据的导出,在生产管理或者 ...
- java中使用poi导出excel表格数据并且可以手动修改导出路径
在我们开发项目中,很多时候会提出这样的需求:将前端的某某数据以excel表格导出,今天就给大家写一个简单的模板. 这里我们选择使用poi导出excel: 第一步:导入需要的jar包到 lib 文件夹下
- 重构:以Java POI 导出EXCEL为例
重构 开头先抛出几个问题吧,这几个问题也是<重构:改善既有代码的设计>这本书第2章的问题. 什么是重构? 为什么要重构? 什么时候要重构? 接下来就从这几个问题出发,通过这几个问题来系统的 ...
随机推荐
- zencart 新页面调用好功能代码集:
其实很多就是看变量,就可以直接调用,而变量的定义地方很多,比如language 1. includes\languages\语言.php 2. 写个文件,放进includes\extra_confi ...
- Viewpager以及ViewPagerIndicator的相关使用
ViewPagerIndicator开源框架可以用来在ViewPager上方做标题,可以在ViewPager下方做跟随移动的小圆点,这个类库必须和自己的项目在电脑的同一磁盘盘符下,比如都在D盘或者E盘 ...
- 第13章 Swing程序设计----标签组件与图标
在Swing中显示文本或提示信息的方法是使用标签.本节将探讨Swing标签的用法.如何创建标签,以及如何在标签上放置文本和图标. 1.标签的使用 标签可以显示一行只读文本.一个图像或带图像的文本,它并 ...
- 在web项目中使用cxf开发webservice,包含spring支持
本文主要介绍了,如何使用cxf内置的例子,学会开发webserivce,在web项目中使用,且包含spring支持. webserivce的开发可以使用cxf或者axis,好像还有httpclient ...
- 优化C/C++代码的小技巧(转)
源:http://www.cnblogs.com/lizhenghn/p/3969531.html 说明: 无意看到一篇小短文,猜测作者应该是一个图形学领域的程序员或专家,介绍了在光线(射线)追踪程序 ...
- angularJS 系列(五)--controller AS 语法
原文: http://www.cnblogs.com/whitewolf/p/3493362.html 这篇国外的文章也非常好: http://codetunnel.io/angularjs-cont ...
- PAT (Advanced Level) 1044. Shopping in Mars (25)
双指针. #include<cstdio> #include<cstring> #include<cmath> #include<vector> #in ...
- how to enable #ifdef macro in the command line of make?
Compilers normally use the -D flags eg Code: test.o: test.cpp $(CC) $(CFLAGS) -DTEST1 test.cpp -o $@
- 如何用70行Java代码实现深度神经网络算法
http://www.tuicool.com/articles/MfYjQfV 如何用70行Java代码实现深度神经网络算法 时间 2016-02-18 10:46:17 ITeye 原文 htt ...
- Apache 隐藏入口文件 index.php
新建 .htaccess文件至站点目录下,并写入如下代码: RewriteEngine on RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQ ...