文件下载-excel导出-我们到底能走多远系列(22)
我们到底能走多远系列(22)
扯淡:老规矩,先扯淡,老实说,过年就是回家在亲戚面前吹吹牛喝喝酒,再听听别人的牛,然后回来继续苦逼....
所以不是你把别人吹倒,就是别人把你吹倒,大家要加油吹哦!
-----------------------------------------
最近很多人纠结自己文章被别人抄袭的事。
我一直想不明白:自己写的博客被人抄袭,甚至当成别人的原创这种情况对自己有多大的伤害?
我不明白:除了自己虚荣心上的一点挫折,其他损失还有多少呢?除了部分恶意的抄袭行为,的确要反对外。
我觉得:一个分享的行为,被放大,被传播,本来就是一件很nice,很cool的事。
我个人也会转文章,一般文章署名了,我也会会复制过来,没写的我也懒的一个个标记好是从哪里复制来的了,但是有一点是肯定的,虽然是复制粘贴的几秒钟,我是感谢作者的,至少我会倾佩他几秒,我觉得他教给我一些东西,无形的东西,但却可能有价值。
为什么要纠结别人对你文章的复制粘贴呢?
当你把一些思考,总结,经验贴到自己的博客后。一个月后在另一个博客上看到了自己文章,难道这件事反而会让各位生气吗?这在博客园里应该是件快乐的事情吧,想想自己文章被人反复阅读,并被记录下来,成为别人思想的一部分,这是多么有趣的一件事啊!
到了这里却被看成是有点罪恶感的事了。
写博客正真的收获的是什么?
1,写的时候自己的思考
2,写完后自己对自己文章的阅读重新思考
3,别人看了你的文章的反馈,然后你就可以再进行扩展思考。
整一个过程就是不断的促使自己思考的过程。只要这个过程还能促使你思考,写这篇博客就是有价值的,至少对自己是有的。
所以我个人觉得,还是不要太纠结别人的什么抄袭这种事,别人抄袭你只能代表别人觉得这篇博客有帮到他,觉得你不错,是吧。
主题:
1,下载文件
文件躺在服务器的某个文件夹下,页面点击下载,将文件保存到本地的过程:
action用springmvc实现:
public ModelAndView downloadModelForm(HttpServletRequest request, HttpServletResponse response) throws Exception{ response.setContentType("application/octet-stream"); String fileName = "用户申请表.docx"; String path = request.getSession().getServletContext().getRealPath(BusinessConstants.DOWNLOAD_FILE_PATH + fileName); File file = new File(path); // 清空response response.reset(); if (request.getHeader("User-Agent").toLowerCase().indexOf("firefox") > 0){ fileName = new String(fileName.getBytes("UTF-8"), "ISO8859-1");//firefox浏览器 } else{ fileName = URLEncoder.encode(fileName, "UTF-8");//其他浏览器包括IE浏览器和google浏览器 } // 设置response的Header response.addHeader("Content-Disposition", "attachment;filename="+ fileName); response.addHeader("Content-Length", ""+file.length()); try{ //以流的形式下载文件 InputStream fis = new BufferedInputStream(new FileInputStream(path)); byte[] buffer = new byte[fis.available()]; fis.read(buffer); fis.close(); OutputStream toClient = new BufferedOutputStream(response.getOutputStream()); toClient.write(buffer); toClient.flush(); toClient.close(); }catch(Exception e){ e.printStackTrace(); } return null; }
特别要注意的是代码是哦那个对fileName 编码逻辑,根据不同浏览器来实现不同的编码,这样做是为了在输出文件名时可以使用中文名。
测试对firefox,ie8,谷歌通过,可用。如果不做操作,结果是文件名使用中文的话会出现乱码问题。(可能这只是一种解决方案,如果你有更好的解决方式,请告诉我哦)
2,导出excle文件:
导出的是账单表的内容,数据需要先去数据库中取的,组装成excel。
这里使用最新的pio3.9(开源项目),来完成excel的导出:
service层的方法:组装出一个完整内容的HSSFWorkbook
public HSSFWorkbook export(List<Sale> list) { HSSFWorkbook wb = new HSSFWorkbook(); HSSFSheet sheet = wb.createSheet(BusinessConstants.EXCEL_SHEET_NAME); HSSFRow row = sheet.createRow((int) 0); HSSFCellStyle style = wb.createCellStyle(); style.setAlignment(HSSFCellStyle.ALIGN_CENTER); String[] excelHeader = BusinessConstants.EXCEL_HEADER; for (int i = 0; i < excelHeader.length; i++) { HSSFCell cell = row.createCell(i); cell.setCellValue(excelHeader[i]); cell.setCellStyle(style); sheet.autoSizeColumn(i); } SimpleDateFormat sdf = new SimpleDateFormat(BusinessConstants.DATE_FORMAT); for (int i = 0; i < list.size(); i++) { row = sheet.createRow(i + 1); Sale sale = list.get(i); row.createCell(0).setCellValue(sdf.format(sale.getTime())); //setCellValue方法参数不能是null,会导致异常,所以对每一个内容进行必要的检查 if(sale.getStrType() == null){ row.createCell(1).setCellValue(BusinessConstants.STRIKE); }else{ row.createCell(1).setCellValue(sale.getStrType()); } if(sale.getStrPayType() == null){ row.createCell(2).setCellValue(BusinessConstants.STRIKE); }else{ row.createCell(2).setCellValue(""+sale.getStrPayType()); } if(sale.getAmount() == null){ row.createCell(3).setCellValue(BusinessConstants.STRIKE); }else{ row.createCell(3).setCellValue(sale.getAmount()); } if(sale.getProductNum() == null){ row.createCell(4).setCellValue(BusinessConstants.STRIKE); }else{ row.createCell(4).setCellValue(sale.getProductNum()); } if(sale.getProductValid() == null){ row.createCell(5).setCellValue(BusinessConstants.STRIKE); }else{ row.createCell(5).setCellValue(sale.getProductValid()); } if(sale.getProductName() == null){ row.createCell(6).setCellValue(BusinessConstants.STRIKE); }else{ row.createCell(6).setCellValue(sale.getProductName()); } } return wb; }
action层的代码:
public ModelAndView downloadBill(HttpServletRequest request, HttpServletResponse response) throws IOException { User user = (User) request.getSession().getAttribute("user"); List<Sale> saleList = accountService.getSale(user.getId(), null, null, 0); HSSFWorkbook wb = accountService.export(saleList); // 清空response response.reset(); String fileName = ""; if (request.getHeader("User-Agent").toLowerCase().indexOf("firefox") > 0){ fileName = new String(BusinessConstants.EXCEL_FILE_NAME.getBytes("UTF-8"), "ISO8859-1");//firefox浏览器 } else{ fileName = URLEncoder.encode(BusinessConstants.EXCEL_FILE_NAME, "UTF-8");//其他浏览器包括IE浏览器和google浏览器 } response.setContentType("application/vnd.ms-excel");//Office2003 response.setHeader("Content-disposition", "attachment;filename="+fileName); OutputStream ouputStream = response.getOutputStream(); wb.write(ouputStream); ouputStream.flush(); ouputStream.close(); return null; }
同样的我们需要对fileName进行编码上的设置,以使可以正常使用中文名。
如果进行操作,效果可能是这样的:
导出效果:
以上,希望能帮到你。
补充(2013/08/23):
一个方便的方法是,导出时使用csv格式,windows下打开如果有excel会默认打开的,效果基本和使用上面的excel框架相同。当然一些excel的特殊处理就不行了:
有兴趣的可以尝试一下,瞬间完成需求。好处就是不依赖其他框架,修改迅速。
List<WinnerDO> winners = awardService.getWinnerListByTime(beginDate, endDate); PrintWriter osw = null; BufferedWriter out = null; try { response.reset(); response.setCharacterEncoding("gb2312"); response.setContentType("text/csv"); response.addHeader("Content-Disposition", "attachment;filename=export.csv"); osw = response.getWriter(); out = new BufferedWriter(osw); out.write("ID,用户名,电话号码,EMAIL,奖品,获奖时间"); out.newLine(); for (WinnerDO winner : winners) { out.write(winner.getId() + "," + winner.getName() + "," + winner.getPhone() + "," + winner.getEmail() + "," + winner.getAwardName() + "," + WXDateUtil.toLocaleString(winner.getEditTime())); out.newLine(); } out.close(); osw.close(); } catch (Exception e) { System.err.println("export error: " + e); e.printStackTrace(); }
各位,新年快乐!
让我们继续前行
----------------------------------------------------------------------
努力不一定成功,但不努力肯定不会成功。
共勉。