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