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

 

 

 

各位,新年快樂!

 

讓我們繼續前行

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

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM