jsp文件下载 excel导出下载代码及相关问题
云起网2019-04-20
Web开发553
网上下载,直接a链接到文件就可以实现下载,但是这样把文件的路径都暴露了,很多应用场景都不适合这样的方式。下面以java的方式下载文件。
jsp文件下载,适合所有文件,如excel,以byte方式下载。
File file = new File(filePath); if (file.exists()) { try { response.reset(); // 要用servlet 来打开一个 EXCEL 文档,需要将 response 对象中 header 的 contentType 设置成"application/x-msexcel"。 response.setContentType("application/x-msexcel"); //response.setContentType("application/vnd.ms-excel"); // 处理中文文件名 fileName = new String(fileName.getBytes("UTF-8"), "ISO-8859-1"); //servlet中,要在 header中设置下载方式 response.setHeader("Content-Disposition","attachment;filename=" + fileName); long fileLength = file.length(); String length1 = String.valueOf(fileLength); response.setHeader("Content_Length", length1); //FileInputStream输入流 //FileInputStream bis = new FileInputStream(file); //缓冲流(BufferedStream)可以一次读写一批数据,,缓冲流(Buffered Stream)大大提高了I/O的性能。 BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file)); //OutputStream输出流 OutputStream bos = response.getOutputStream(); byte[] buff = new byte[1024]; int n = 0; while ((n = bis.read(buff)) != -1) { bos.write(buff, 0, n); } if (bis != null) { bis.close(); } bos.flush(); if (bos != null) { bos.close(); } //out = pageContext.pushBody(); } catch (Exception e) { //logList.add("下载"+filePath+"发生错误:"+e.getMessage()); //writeLog(logList,"salary","error"); e.printStackTrace(); }
jsp导出Excel功能的实现
借助POI的excel接口,可以方便得实现excel导出功能:
首先需要引入poi对应的jar包
import org.apache.poi.hssf.usermodel.*; /** * 根据列数组和值数组,生成excel文件 * @param fileRealPath 生成路径 * @param sheetName * @param colList 列数组 * @param excelList 二维数组,一条记录是一个数组 * @param strColumn 字符串列的序号,需要区分数字列和字符串列,导出格式区分,如 列1,2 */ public void createExcel(String fileRealPath, String sheetName, List<String> colList, List<List<String>> excelList,String strColumn) { List<String> logList = new ArrayList<String>(); OAOperationUtil oaOperationUtil = new OAOperationUtil(); logList.add("enter createExcel......"); /* //不写文件了 FileOutputStream fout = null; String realFile = ""; try { File fileWrite = new File(fileRealPath); fileWrite.createNewFile(); fout = new FileOutputStream(fileWrite); } catch (Exception e1) { logList.add(e1.getMessage() + ":" + realFile); oaOperationUtil.writeLog(logList,"salary","error"); } */ //创建工作簿 HSSFWorkbook hsshworkbook = new HSSFWorkbook(); //由工作簿创建工作表,注意的一点是下标从0开始,就像数组一样 HSSFSheet hsshsheet = hsshworkbook.createSheet(); //设置工作表的名称,该方法需要三个参数,第一个是工作表在工作薄中的位置,第二个就是工作表的名称,第三个是字符编码 if ("".equals(sheetName)) sheetName = "Sheet1"; hsshworkbook.setSheetName(0, sheetName, HSSFWorkbook.ENCODING_UTF_16); //对应excel的行 HSSFRow hssfrow = hsshsheet.createRow(0); //创建表头 单元格,设置每个单元格的值(作为表头),对应excel的列 //很多方法的参数是short而不是int,所以需要做一次类型转换 HSSFCell hssfcell = null; HSSFCellStyle headStyle = hsshworkbook.createCellStyle(); HSSFFont font = hsshworkbook.createFont(); //font2.setFontName("仿宋_GB2312"); font.setBoldweight(HSSFFont.BOLDWEIGHT_NORMAL);//粗体显示 font.setFontHeightInPoints((short) 12); headStyle.setFont(font);//选择需要用到的字体格式 HSSFCellStyle numStyle = hsshworkbook.createCellStyle(); HSSFDataFormat df = hsshworkbook.createDataFormat(); //此处设置数据格式 numStyle.setDataFormat(df.getFormat("#,#0.00")); //小数点后保留两位,可以写contentStyle.setDataFormat(df.getFormat("#,#0.00")); HSSFCellStyle strStyle = hsshworkbook.createCellStyle(); strStyle.setWrapText(true); for (int c = 0; c < colList.size(); c++) { hssfcell = hssfrow.createCell((short) c);//, HSSFCell.CELL_TYPE_NUMERIC hssfcell.setEncoding(HSSFCell.ENCODING_UTF_16); hssfcell.setCellValue(colList.get(c));//设定单元格的值,值的类型有:double,int,String,Date,boolean hssfcell.setCellStyle(headStyle); } //处理后的EXCEL内容结果集 try { logList.add("before getExcelList"); // 获得处理后的EXCEL内容结果集,excelList存放的是一条条完整的记录 // arrayList存放的是每一条记录的所有列 ArrayList arrayList = null; //如果excelList没有记录 则返回 if (excelList.size() < 1) { logList.add("没有查询到记录...."); return; } if (null != excelList && excelList.size() > 0) { //得到结果集的记录条数 int count = excelList.size(); logList.add("count:" + count); //excelList得到的是含有表头的数据集,i=1表示除去表头后的第一条记录 for (int i = 0; i < count; i++) { arrayList = (ArrayList) excelList.get(i); hssfrow = hsshsheet.createRow(i + 1); for (int j = 0; j < arrayList.size(); j++) { hssfcell = hssfrow.createCell((short) j, HSSFCell.CELL_TYPE_NUMERIC); hssfcell.setEncoding(HSSFCell.ENCODING_UTF_16); if(j==0) { String money = arrayList.get(j).toString(); if("".equals(money)) hssfcell.setCellValue(""); else hssfcell.setCellValue(Integer.parseInt(money)); } else if((","+strColumn+",").indexOf(","+j+",")>-1){ //j包含在strColumn中,则是字符串列 //else if(j==1 ||j==2 || j==9|| j==10 || j==11 ) { //字符串列 hssfcell.setCellValue(arrayList.get(j).toString()); if(j==1)hssfcell.setCellStyle(strStyle);//利润中心列换行 }else { String money = arrayList.get(j).toString(); if("".equals(money)) money="0"; hssfcell.setCellValue(Double.parseDouble(money)); hssfcell.setCellStyle(numStyle); } } } } /* //将工作簿对象hsshworkbook写入到文件输出流 hsshworkbook.write(fout); fout.flush(); fout.close(); */ OutputStream os = response.getOutputStream(); hsshworkbook.write(os); os.flush(); os.close(); logList.add("EXCEL文件已生成......"); } catch (IOException e) { logList.add("createExcel error:" + e.getMessage()); return; } logList.add("before DownExcelFile"); //下载已生成的execl文件 logList.add("EXCEL文件下载完成......"); }
下面是调用方式,准备表格的表头和内容数据
List<String> colList = new ArrayList<String>(); colList.add("序号"); colList.add("姓名"); colList.add("金额"); List<String> columnList = new ArrayList<String>(); columnList.add(rowIndex + ""); columnList.add(rs.getString("name")); columnList.add(rs.getString("je")); rowsList.add(columnList); String fileDownPath = "/tempfile/"+fileName; String realFile = application.getRealPath(fileDownPath); oaOperate.createExcel(realFile,"Sheet1",colList,rowsList,"1,2,9,10,11");
上面的代码是直接导出excel,输出流给浏览器。也可以输出文件到服务器路径,见上面代码中注释 部分。
很赞哦! ()