excel 导出

javaweb中,做的导出数据功能,数据导出的excel跑到服务器上了, 没导到用户本机上,求高手解答,另外求教怎么做导出时选择导出路径的方法
↑开裆裤↓  |  浏览 5623 次
推荐于2016-03-21 11:03:38 最佳答案

一般来说做下载功能的确是先导到服务器的一个临时目录上的,然后再用一段代码把这个excel读出来,并且输出到response流里面去,给你一段可以用的代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
                 //------------------------------
                 //step1. 保存一个临时excel到temp目录下
                 //------------------------------
                 //这部分自己实现,我相信你已经实现了
                 //假设你已经实现了保存一个excel到一个<a href="https://www.baidu.com/s?wd=%E4%B8%B4%E6%97%B6%E6%96%87%E4%BB%B6%E5%A4%B9&tn=44039180_cpr&fenlei=mv6quAkxTZn0IZRqIHckPjm4nH00T1d-PWnLujKWPjcvujmdn16Y0ZwV5Hcvrjm3rH6sPfKWUMw85HfYnjn4nH6sgvPsT6KdThsqpZwYTjCEQLGCpyw9Uz4Bmy-bIi4WUvYETgN-TLwGUv3EPH6kn10znWcd" target="_blank" class="baidu-highlight">临时文件夹</a>里面去
                 //并且已经生成了一个File 指向这个临时的 excel,名叫exportFile
                 
                 //-------------------------------
         //step2. 弹出下载对话框
         //-------------------------------
         if (exportFile ==  null ){
             logger.error( "生成excel错误! exportFile 为空" );
             return ;
         }
         
         //先建立一个文件读取流去读取这个临时excel文件
         FileInputStream fs =  null ;
         try  {
             fs =  new  FileInputStream(exportFile);
         catch  (FileNotFoundException e) {
             logger.error( "生成excel错误! "  + exportFile +  " 不存在!" ,e);
             return ;
         }
         // 设置响应头和保存文件名
         HttpServletResponse response = ServletActionContext.getResponse();
         //这个一定要设定,告诉浏览器这次请求是一个下载的数据流
         response.setContentType( "APPLICATION/OCTET-STREAM" );
         try  {
         //这边的 "采购部门本月采购报表.xls" 替换成你自己要显示给用户的文件名
             excelName = URLEncoder.encode( "采购部门本月采购报表.xls" "UTF-8" );
         catch  (UnsupportedEncodingException e1) {
             logger.error( "转换excel名称编码错误!" ,e1);
         }
         response.setHeader( "Content-Disposition" "attachment; filename=\""  + excelName +  "\"" );
         // 写出流信息
         int  b =  0 ;
         try  {
                 //这里的 response 就是你 servlet 的那个传参进来的 response
             PrintWriter out = response.getWriter();
             while  ((b = fs.read()) != - 1 ) {
                 out.write(b);
             }
             fs.close();
             out.close();
             logger.debug(sheetName +  " 文件下载完毕." );
         catch  (Exception e) {
             logger.error(sheetName +  " 下载文件失败!." ,e);
         }

把这段代码放到你的servlet的最后一部分

追问
ServletActionContext这个方法是struts的?我用wicket做的,这个方法不能找到,是什么意思

nsrainbow 

采纳率:21% 擅长: 音乐

其他回答

就是在jsp中用file标签就可以选择路径啦。然后你导出的时候你现在可能默认是在server的某个目录,你写成你页面选择的路径即可
qnmlgbbwc    |  发布于2013-08-16 09:35
评论 
0  0
要导出到用户的电脑上就不叫导出了,叫做下载。路径问题也是选择下载路径就可以了。。和迅雷类似。用IO流直接将你要下载的数据写入到本地就可以了
妖精の血    |  发布于2013-08-16 10:29
评论 
2  0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
public  void  downLoadFile(String filePth) {
         HttpServletResponse response = ServletActionContext.getResponse();
         HttpServletRequest request = ServletActionContext.getRequest();
             try  {
             
             //得到当前路径
             //String filePath=request.getSession().getServletContext().getRealPath(File.separator);
             File temFile =  new  File(filePth);
             if (!temFile.exists()){
                 response.getWriter().write( "ERROR:File Not Found" );
                 return  ;
             }
             String fileName = filePth.substring(filePth.lastIndexOf(File.separator)+ 1 );
             String browser = request.getHeader( "<a href=" https: //www.baidu.com/s?wd=user-agent&tn=44039180_cpr&fenlei=mv6quAkxTZn0IZRqIHckPjm4nH00T1d-PWnLujKWPjcvujmdn16Y0ZwV5Hcvrjm3rH6sPfKWUMw85HfYnjn4nH6sgvPsT6KdThsqpZwYTjCEQLGCpyw9Uz4Bmy-bIi4WUvYETgN-TLwGUv3EPH6kn10znWcd" target="_blank" class="baidu-highlight">user-agent</a>");
             Pattern p = Pattern.compile( ".*MSIE.*?;.*" );
             Matcher m = p.matcher(browser);
             
             if (m.matches()){
                 response.setHeader( "Content-Disposition" "attachment; filename="  +URLEncoder.encode(fileName,  "UTF-8" ).replace( "+" , "" ));
             } else {
                 response.setHeader( "Content-Disposition" "attachment; filename="  + new  String(fileName.getBytes( "UTF-8" ), "ISO8859-1" ).replace( " " "" ));
             }
             response.setContentType( "application/x-download" );
             OutputStream ot=response.getOutputStream();
             BufferedInputStream bis  =  new  BufferedInputStream( new  FileInputStream(temFile));
             BufferedOutputStream bos =  new  BufferedOutputStream(ot);
             byte [] buffer =  new  byte [ 4096 ];
             int  length =  0 ;
             while ((length = bis.read(buffer)) >  0 ){
                 bos.write(buffer, 0 ,length);
             }
             bos.close();
             bis.close();
             ot.close();
         catch  (Exception e) {
             e.printStackTrace();
         }
     }

运行效果!不懂再问!

追问
我使用这个 HttpServletResponse response = ServletActionContext.getResponse();ServletActionContext这个方法是不是struts中的,但是我没用struts开发
张策是gou    |  发布于2013-08-16 09:34
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值