?
使用JXL組件操作Excel和導出文件
?
原文鏈接:http://tianweili.github.io/blog/2015/01/29/use-jxl-produce-excel/
前言:這段時間參與的項目要求做幾張Excel報表,由于項目框架使用了jxl組件,所以把jxl組件的詳細用法歸納總結一下。
1、簡介
jxl是一個韓國人寫的java操作excel的工具, 在開源世界中,有兩套比較有影響的API可供使用,一個是POI,一個是jExcelAPI。其中jExcelAPI功能相對POI比較弱一點。但jExcelAPI對中文支持非常好,API是純Java的,并不依賴Windows系統,即使運行在Linux下,它同樣能夠正確的處理Excel文件。另外需要說明的是,這套API對圖形和圖表的支持很有限,而且僅僅識別PNG格式。
2、搭建環境
網上下載jxl.jar包,然后導入工程項目lib中,即可使用。
3、基本操作
1、創建文件
以下實例是生成一個名為“test.xls”的Excel文件,其中第一個工作表被命名為“第一頁”。編譯執行后,會產生一個Excel文件。
// 生成Excel的類 import java.io.File;import jxl.Workbook; import jxl.write.Label; import jxl.write.WritableSheet; import jxl.write.WritableWorkbook;public class CreateExcel {public static void main(String args[]) {try {// 打開文件WritableWorkbook book = Workbook.createWorkbook(new File("c:/test.xls"));// 生成名為“第一頁”的工作表,參數0表示這是第一頁WritableSheet sheet = book.createSheet(" 第一頁 ", 0);// 在Label對象的構造子中指名單元格位置是第一列第一行(0,0)// 以及單元格內容為testLabel label = new Label(0, 0, " test ");// 將定義好的單元格添加到工作表中 sheet.addCell(label);// 生成一個保存數字的單元格,必須使用Number的完整包路徑,否則有語法歧義。//單元格位置是第二列,第一行,值為123.456jxl.write.Number number = new jxl.write.Number(1, 0, 123.456);sheet.addCell(number);// 寫入數據并關閉文件 book.write();book.close();} catch (Exception e) {System.out.println(e);}} }
2、單元格操作
Excel中很重要的一部分是對單元格的操作,比如行高、列寬、單元格合并等,所幸jExcelAPI提供了這些支持。這些操作相對比較簡單,下面只介紹一下相關的API。
合并單元格
合并既可以是橫向的,也可以是縱向的。合并后的單元格不能再次進行合并,否則會觸發異常。
// 方法作用是從(m,n)到(p,q)的單元格全部合并 WritableSheet.mergeCells( int m, int n, int p, int q);// 合并第1列第1行到第3列第4行的所有單元格 sheet.mergeCells(0, 0, 2, 3);// 先合并單元格,再添加內容。并且定義的列行方位在合并的單元格第一個列行方位,否則添加不上內容,如下所示: Label label = new Label(0, 0, " 測試 "); sheet.addCell(label);
行高和列寬
// 作用是指定第i+1行的高度 WritableSheet.setRowView( int i, int height);// 將第一行的高度設為200 sheet.setRowView(0, 200);// 作用是指定第i+1列的寬度 WritableSheet.setColumnView( int i, int width);// 將第一列的寬度設為30 sheet.setColumnView(0, 30);
3、數據格式化
字串格式化
字符串的格式化涉及到的是字體、粗細、字號等元素,這些功能主要由WritableFont和WritableCellFormat類來負責。
WritableFont有非常豐富的構造子方法,供不同情況下使用,jExcelAPI的java-doc中有詳細列表,這里不再列出。
WritableCellFormat類非常重要,通過它可以指定單元格的各種屬性,后面的單元格格式化中會有更多描述。
//字體樣式:宋體;11號;粗體 WritableFont font1 = new WritableFont(WritableFont.createFont("宋體"), 11, WritableFont.BOLD); WritableCellFormat format1 = new WritableCellFormat(font1); Label label = new Label( 0 , 0 , "test", format1);
對齊方式
在WritableCellFormat類中,還有一個很重要的方法是指定數據的對齊方式,比如針對我們上面的實例,可以指定:
// 把水平對齊方式指定為居中 format1.setAlignment(jxl.format.Alignment.CENTRE); // 把垂直對齊方式指定為居中 format1.setVerticalAlignment(jxl.format.VerticalAlignment.CENTRE);
4、讀取文件
// 讀取Excel的類 import java.io.File;import jxl.Cell; import jxl.Sheet; import jxl.Workbook;public class ReadExcel {public static void main(String args[]) {try {Workbook book = Workbook.getWorkbook(new File("c:/test.xls"));// 獲得第一個工作表對象Sheet sheet = book.getSheet(0);// 得到第一列第一行的單元格Cell cell = sheet.getCell(0, 0);String contents = cell.getContents();//得到單元格內容 System.out.println(contents);book.close();} catch (Exception e) {System.out.println(e);}} }
程序的輸出結果是:test。
Cell接口的方法還可以獲取單元格行、列位置,單元格是否隱藏等屬性。具體的參考jxl的API。
5、修改文件
修改Excel文件除了打開文件的方式不同之外,其他與創建Excel是一樣的。
// 修改Excel的類 import java.io.File;import jxl.Workbook; import jxl.write.Label; import jxl.write.WritableSheet; import jxl.write.WritableWorkbook;public class UpdateExcel {public static void main(String args[]) {try {// 獲得Excel文件Workbook wb = Workbook.getWorkbook(new File("c:/test.xls"));// 打開一個文件的副本,并且指定數據寫回到原文件WritableWorkbook book = Workbook.createWorkbook(new File("c:/test.xls"), wb);//修改原工作表數據WritableSheet sheet1 = book.getSheet(0);sheet1.addCell(new Label(0, 0, "覆蓋原來的test"));// 添加一個新工作表WritableSheet sheet2 = book.createSheet(" 第二頁 ", 1);sheet2.addCell(new Label(0, 0, " 第二頁的測試數據 "));book.write();book.close();} catch (Exception e) {System.out.println(e);}} }
4、導出文件
附上一個導出文件例子。
JS代碼
$( function() {/** 報表導出按鈕 */$( '#exportBtn' ).click( function() {if( !$( '#frm' ).validationEngine( 'validate' ) )return false;$( '#frm' )[ 0 ].action = '${ctx }/exportAction.do?m=exportExcel';$( '#frm' )[ 0 ].submit();$( this ).attr( 'disabled', true );window.setTimeout( function() {document.getElementById( 'exportBtn' ).disabled = false;}, 5000 );} ); } );
JAVA代碼
/** 根據瀏覽器類型,轉換為當前瀏覽器支持的中文*/ String fileName = "Excel工作表";/** header 瀏覽器key */ String userAgent = request.getHeader("USER-AGENT").toUpperCase(); if (userAgent != null && userAgent.length() != 0 && fileName != null && fileName.length() != 0) {/** header IE */if ( -1 != userAgent.indexOf("MSIE") )fileName = URLEncoder.encode(fileName, "UTF-8");/** header Mozilla */else if ( -1 != userAgent.indexOf("MOZILLA") )fileName = new String(fileName.getBytes(), "ISO8859-1");/** header Safari */else if ( -1 != userAgent.indexOf("SAFARI") )fileName = new String( fileName.getBytes(), "ISO8859-1");/** header Opera */else if ( -1 != userAgent.indexOf("OPERA") )fileName = new String( fileName.getBytes(), "ISO8859-1");/** header 其它內核瀏覽器 */elsefileName = new String( fileName.getBytes(), "ISO8859-1"); }response.setCharacterEncoding("UTF-8"); response.setContentType("application/vnd.ms-excel"); response.setHeader("Content-disposition", new StringBuffer("attachment").append( ";filename=" ).append( fileName ).append(".xls").toString() );WritableWorkbook book = Workbook.createWorkbook(response.getOutputStream()); WritableSheet sheet = book.createSheet("Excel工作表", 0);//... book.write(); book.close();
?原文鏈接:http://tianweili.github.io/blog/2015/01/29/use-jxl-produce-excel/