使用servlet来下载文件,其原理非常简单,只要得到文件的输入流(或相应字节),然后写输出流即可。现就其中的几个细节问题展开:
1. MIME类型的设置:
Web 浏览器使用 MIME 类型来识别非 HTML 文档,并决定如何显示该文档内的数据。
例如EXCEL文件的 MIME 类型是 "application/vnd.ms-excel "。要用servlet 来打开一个 EXCEL 文档,需要将 response 对象中 header 的 contentType 设置成“application/vnd.ms-excel ”。
response.setContentType(contentType);

2. Content disposition
HTTP response header中的content-disposition 允许 servlet 指定文档表示的信息。使用这种header ,你就可以将文档指定成单独打开(而不是在浏览器中打开),还可以根据用户的操作来显示。
如果用户要保存文档,你还可以为该文档建议一个文件名。这个建议名称会出现在 Save As 对话框的“文件名”栏中。如果没有指定,则对话框中就会出现 servlet 的名字。
servlet 中,将 header 设置成下面这样:
response.setHeader("Content-disposition","p_w_upload;filename="+ "Example.xls" );

response.setHeader("Content-Disposition", "inline; filename="fliename)
点击打开会在ie中打开。

需要说明的有三点:
Ø 中文文件名需要进行iso8859-1转码方可正确显示:
fileName = new String(fileName.getBytes("GBK"),"iso8859-1");
Ø 传递的文件名,需要包含后缀名(如果此文件有后缀名),否则丢失文件的属性,而不能自行选择相关程序打开。
Ø 有下载前询问(是打开文件还是保存到计算机)和通过IE浏览器直接选择相关应用程序插件打开两种方式,前者如上代码所示,后者如下:
response.setHeader("Content-disposition","filename="+ "Example.xls" );
3. 在研究文件的上传及下载过程中,有几点体会
程序的I/O操作往往是性能的瓶颈所在,java io定义了两个基本的抽象类:InputStream和OutputStream,对于不同的数据类型比如磁盘,网络又提供了不同的实现,java.io也提供了一些缓冲流(BufferedStream),使硬盘可以很快的读写一大块的数据, 而Java基本的I/O类一次只能读写一个字节,但缓冲流(BufferedStream)可以一次读写一批数据,,缓冲流(Buffered Stream)大大提高了I/O的性能。所以:
Ø小块小块的读写数据会非常慢,因此,尽量大块的读写数据
Ø使用BufferedInputStream和BufferedOutputStream来批处理数据以提高性能
Ø对象的序列化(serialization)非常影响I/O的性能,尽量少用

<%@ page extends="tradeex.ec4.jsp.BaseJSPPage" import="java.util.*,java.text.*,java.sql.*,java.net.*" import="oracle.jdbc.driver.*,jxl.*,tradeex.ec4.util.*" contentType="text/html;charset=UTF8"%>
<%
String sorefitem=request.getParameter("SOREFITEM");
sorefitem = "24326";
String sheetname = "productsitems";
String excelsql = "select oi.sorefitem,po.psuppliercompany suppliername,oi.pname productname,oi.ivendpartnumber productcode,oi.oqty quantity,oi.osellprice price,oi.pricecurrefitem currency,po.ponumber "
+" from ecorders.orderitems oi,ecorders.purchaseorders po "
+" where (oi.ostatus>3 or oi.ostatus=3 and oi.osubstatus=4) AND oi.sorefitem="+sorefitem
+" AND oi.sorefitem=po.sorefitem and oi.osellerid=po.psupplierid" ;
int col_num = 0;

java.sql.Statement stm = null;
java.sql.ResultSet rs = null;
java.sql.Connection conn = null;try...{
Class.forName("oracle.jdbc.driver.OracleDriver");
}catch (ClassNotFoundException e)
...{ System.out.println ("no exist driver");
System.exit(0);
}
try
...{

response.reset();
response.setContentType("application/vnd.ms-excel;charset=UTF-8");
response.setHeader("Content-Disposition" ,"p_w_upload;filename="+new String("导出采购商明细报表Excel.xls".getBytes(),"iso-8859-1"));
OutputStream os = response.getOutputStream();//将 WritableWorkbook 写入到输出流
jxl.write.WritableWorkbook wwb = jxl.Workbook.createWorkbook(os); //创建Excel工作表
jxl.write.WritableSheet ws = wwb.createSheet("sheet_1",0);
col_num = 7;
jxl.write.Label label_head;

label_head = new jxl.write.Label(0,0,"请购单号");
ws.addCell(label_head);
label_head = new jxl.write.Label(1,0,"供应商名");
ws.addCell(label_head);
label_head = new jxl.write.Label(2,0,"产品规格型号");
ws.addCell(label_head);
label_head = new jxl.write.Label(3,0,"产品编码");
ws.addCell(label_head);
label_head = new jxl.write.Label(4,0,"数量");
ws.addCell(label_head);
label_head = new jxl.write.Label(5,0,"单价");
ws.addCell(label_head);
label_head = new jxl.write.Label(6,0,"定单号");
ws.addCell(label_head);//结果集中的数据添加到excel中

jxl.write.Number label_num;
jxl.write.Label label_str;
jxl.write.WritableCellFormat floatFormat;
int numrow = 1;
System.out.println(System.currentTimeMillis()+" welcome to hehe!!!!!!!!!!!");

conn = java.sql.DriverManager.getConnection("jdbc:oracle:thin:@192.168.1.180:1521:DB","system","manager");
stm = conn.createStatement();
rs = stm.executeQuery(excelsql);

while(rs.next())
...{
System.out.println(System.currentTimeMillis()+" welcome to while!!!!!!!!!");
label_num = new jxl.write.Number(0,numrow,rs.getInt("sorefitem"));
ws.addCell(label_num);
label_str = new jxl.write.Label(1,numrow,rs.getString("suppliername"));
ws.addCell(label_str);
label_str = new jxl.write.Label(2,numrow,rs.getString("productname"));
ws.addCell(label_str);
label_str = new jxl.write.Label(3,numrow,rs.getString("productcode"));
ws.addCell(label_str);
floatFormat = new jxl.write.WritableCellFormat (jxl.write.NumberFormats.FLOAT);
label_num = new jxl.write.Number(4,numrow,rs.getDouble("quantity"),floatFormat);
ws.addCell(label_num);
label_num = new jxl.write.Number(5,numrow,rs.getDouble("price"),floatFormat);
ws.addCell(label_num);
label_str = new jxl.write.Label(6,numrow,rs.getString("ponumber"));
ws.addCell(label_str);
numrow ++;
}
wwb.write();
wwb.close();
os.flush();
os.close();
}
catch(java.sql.SQLException sqle)...{
System.out.println("sql error");
}
catch(Exception e)...{
System.out.println("catch error ------");
e.printStackTrace();
}
finally...{
System.out.println(System.currentTimeMillis()+ "welcome to finally!!!!!!!");
if(stm != null)
try...{
stm.close();
}catch(Exception fe) ...{ }
if(conn != null)
try...{
conn.close();
}
catch(Exception fe2)...{ }
}
%>
JXL包下载页面:http://sourceforge.net/project/showfiles.php?group_id=79926

如果要输出文件到服务器保存:
jxl.write.WritableWorkbook wwb = jxl.Workbook.createWorkbook(new File("D:/JSPweb/112WebModule1/download_excel/"+excelfilename+"交接箱统计故障数.xls")); //创建Excel工作表

转载于:https://blog.51cto.com/zorro/691310

Java Excel文件下载相关推荐

  1. Java 之 Excel文件下载

    Java 之 Excel文件下载 可以直接当作工具类使用 Controller业务层使用 做为Utils工具类使用 实例截图 图片三联 可以直接当作工具类使用 老规矩,废话不多说直接上代码: Cont ...

  2. java后台实现excel文件下载功能

    java后台实现excel文件下载功能  java中对于excel文件的操作,有读取,写入,上传等功能,在对excel文件进行操作时,为了让使用者更加直观的制作excel数据,必然会有下载模板exce ...

  3. java excel api 下载文件_java excel api实现输出EXCEL文件下载

    java excel api实现输出EXCEL文件下载 [// 下载本地文件String fileName = 苹果知识库授权网点整理汇总副本20130210.xls.toString(); // 文 ...

  4. java将excel文件下载到本地

    1.代码如下,可直接复制 注:workbook 格式必须是HSSFWorkbook类型的,文件名后缀是 .xls,不然会报错. //测试excel文件是否导入成功,将导入的excel文件下载到本地St ...

  5. java迅雷下载excel,用servlet实现excel文件下载,用迅雷下载时文件名有关问题

    用servlet实现excel文件下载,用迅雷下载时文件名问题 用servlet实现的excel下载,在用浏览器直接下载时,获得的文件名是设置在header中的文件名, 但如果用迅雷下载,生成的文件名 ...

  6. Java Web文件下载

    Web文件下载有两种.一种是文件在站点文件夹下.在浏览器中直接输入文件路径就可以下载.如http://www.xxx.com/file.zip.第二种是文件不在站点文件夹下或者文件是动态生成的(导出报 ...

  7. poi导出Excel文件下载数据

    poi导出Excel文件下载数据 poi上传Excel文件批量的添加数据 : https://blog.csdn.net/kangshifu007/article/details/103149764 ...

  8. excel文件下载工具分享

    好久没和大家分享点东西了,今天就和大家分享一个excel文件下载工具,项目中有很多下载功能,尤其管理系统,每个菜单下都有下载功能,如果没有一个公共的工具类,就会乱套,维护起来也很吃力(不同菜单下的下载 ...

  9. sqlite java excel,Android将Excel表数据导入SQLite数据库

    前两天接了个私活,需求方给了一个Excel表格,需要使用到里面的7000+条数据进行查询,最开始以为7000条一条条加入数据库也还好,以下是其中一部分数据: 但当我添加了20多条的时候突然发现这样的方 ...

最新文章

  1. psnr 与 ssim评测步骤
  2. 使用redis和mysql的开源项目_干货!带你了解为什么那么多开源项目都是用Redis!...
  3. python语言介绍-Python这门语言的大概介绍
  4. java虚拟机起不来的原因,JVM理解其实并不难!
  5. 如何使用JSON和Servlet创建JQuery DataTable
  6. Error:Artifact com.*******:war exploded: java.nio.file.InvalidPathException: Illeg
  7. 【转】Ubuntu Desktop下自动启动终端并运行脚本
  8. Ceres配置(vs2013+Win10)
  9. 181123每日一句
  10. 在iOS开发的Quartz2D使用中实现图片剪切和截屏功能
  11. 联想 Thinkserver TS250服务器RAID1 重建测试
  12. 论文公式自动编号及引用(自动更新)
  13. 顶级期刊:关于提升人体免疫力的一切!5点有益建议
  14. Excel quot;定位条件quot;使用技巧(1)快速在空格,批量写入公式。
  15. Http 常见的 Headers
  16. 【渝粤教育】国家开放大学2019年春季 24建筑工程管理与实务 参考试题
  17. 若问杭州何处好,此中听得野莺啼——关于杭州
  18. 基于JAVA疫情物资商城和疫情数据可视化系统设计与实现 开题报告
  19. soso地图api接口地理解析geocoder检索示例----并在信息框显示经纬度
  20. United Plugins发布TrapTune人声插件

热门文章

  1. 机器学习实战—朴素贝叶斯及要点注解
  2. define macro in xcode project
  3. WIN7 VS2010下配置 CGAL-4.7
  4. linux fls函数,Linux学习笔记- find 命令详解
  5. javafx项目_爬虫系列(5):JavaFx界面
  6. python安装好后打不开_解决安装pyqt5之后无法打开spyder的问题
  7. 数据库管理学习笔记(一)——实体关系建模
  8. 【Python数据分析】数据挖掘建模——分类与预测——回归分析
  9. 利用lightgbm做learning to rank 排序,解析模型中特征重要度
  10. 基于知识库的自动问答:seq2seq模型实践