文件下载-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();
        }

 

 

 

各位,新年快乐!

 

让我们继续前行

----------------------------------------------------------------------

努力不一定成功,但不努力肯定不会成功。
共勉。

posted on 2013-02-04 19:37  每当变幻时  阅读(3407)  评论(10编辑  收藏  举报

导航