1. 程式人生 > >jxl實現寫入excel模板及匯出(帶圖片)

jxl實現寫入excel模板及匯出(帶圖片)

在上一片部落格中我用的是freemarker(操作簡單),試了很多種方法就是沒有把帶圖片的excel匯出來,沒辦法就換jxl來實現。好了下面就開始進入正題:

第一步:pom.xml中新增jxl的依賴如下:

<!-- jxl通用excel匯入匯出-->
<dependency> 
<groupId>net.sourceforge.jexcelapi</groupId >
 <artifactId>jxl</artifactId > 
 <version>2.6</version >
 </dependency > 

第二步:把excel模板放到專案中

在這裡我要重點說一下,首先我們要把excel另存為2003版的xls,因為jxl只能識別這個版本的,望各位不要中槍,要不然會一直報錯說找到不到檔案。

第三步:當然就是上程式碼了,在這裡先簡單介紹下寫入模板的方法和步驟:

(1):讀取模板

ServletContext application = request.getSession().getServletContext();
               String path = application.getRealPath("template");//通過上下文獲取該檔案的路徑
               File file=new File(path+"\\test.xls");

(2):開啟excel模板

//它是用來遍歷當前模板的資訊,如果只是插入可以不定義它,如果獲取它的資訊則需要
Workbook book = Workbook.getWorkbook(file);

           //開啟excel模板

File out=new File("buildFile");          

                     WritableWorkbook wwb=Workbook.createWorkbook(out, book);//它是寫入excel的一個類

(3)獲取你要操作的工作區間

               //獲取第一個工作區間     
                        WritableSheet sheet=wwb.getSheet(0);

(4)在要輸入的單元格中輸入資料並定義格式

Sheet seet=book.getSheet(0);

    WritableCellFormat format1=new WritableCellFormat(seet.getCell(3, 1).getCellFormat());//獲取3列1行的單元格格式
                        Label lable=new Label(2, 1, (String)datamap.get("username"),format1);//定義2列1行的值和格式

 sheet.addCell(lable);//把這一個lable放到當前工作區間

/***********自定義格式****************/

  /**********樣式設定***************/
              WritableFont font= new WritableFont(WritableFont.createFont("宋體"),12,WritableFont.NO_BOLD); 
               WritableCellFormat cellFormat1 = new WritableCellFormat(font);      
               cellFormat1.setBorder(jxl.format.Border.ALL, jxl.format.BorderLineStyle.THIN); //Border是jxl.format.Border
               cellFormat1.setAlignment(jxl.format.Alignment.CENTRE);//設定文字對其方式,左對齊還是右對齊
               /*************************/

NumberFormat nf=new NumberFormat("¥#,##0.00");
WritableCellFormat formatmoney=new WritableCellFormat(font,nf);

jxl.write.Number num = new jxl.write.Number(0,1,123.456,formatmoney); //貨幣型別

sheet.addCell(num);

(5)匯出並關閉

                 wwb.write();
                 wwb.close();

(6)客戶端下載

 // 設定response的編碼方式
                        response.setContentType("application/x-msdownload");
                        response.setCharacterEncoding("utf-8");
                        // 設定附加檔名
                        response.setHeader("Content-Disposition", "attachment;filename="
                                + new String(newName.getBytes("utf-8"), "iso-8859-1"));
                        // 讀出檔案到i/o流
                        FileInputStream fis = new FileInputStream(out);
                        BufferedInputStream buf = new BufferedInputStream(fis);
                        byte[] b = new byte[1024];// 相當於我們的快取
                        long k = 0;// 該值用於計算當前實際下載了多少位元組
                        // 從response物件中得到輸出流,準備下載
                        OutputStream myout = response.getOutputStream();
                        // 開始迴圈下載
                        while (k < out.length()) {
                            int j = buf.read(b, 0, 1024);
                            k += j;
                            // 將b中的資料寫到客戶端的記憶體
                            myout.write(b, 0, j);
                        }
                        // 將寫入到客戶端的記憶體的資料,重新整理到磁碟
                        myout.flush();
                        myout.close();

好了這就大功告成了,當然瞭如果是有貨幣格式的,通過獲取單元格的格式在給它設定是行不同的,¥會變成亂碼,所以還是要自定義才可以。至於為什麼會出現這種情況,我也想了很多比如在它變成流之前就已經是亂碼了,我給他設定了編碼但是還是不好使,糾結了半天還是沒有結果。。。。效果圖如下: