文件下载-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进行编码上的设置,以使可以正常使用中文名。 如果进行操作,效果可能是这样的:
导出效果:
以上,希望能帮到你。
各位,新年快乐!
让我们继续前行 ---------------------------------------------------------------------- 努力不一定成功,但不努力肯定不会成功。 |
|