JExcel 是一個API, 支持從Java應用程序中操作Excel工作表、工作薄等。JExcel API 是自2003年以來出現的一個穩定的開放源代碼產品。
API 簡單易操作而且功能強大。除了基本功能如讀取,輸入,修改Excel 表之外,它還提供了更爲複雜的功能如讀取和輸入公式,支持字體、數字、日期的格式化,支持單元格的陰影,嵌入以及顏色的操作,複製圖表,支持插入和複製圖像到Excel表格中。
JExcelApi 主頁:http://jexcelapi.sourceforge.net/.
JExcelApi JAR, jxl.jar下載:http://www.java2s.com/Code/JarDownload/jxl.jar.zip.
如何應用 API
不用大費周章的,在這裏我舉出兩個簡單的例子。 第一個例子會展示如何1)導入一個Excel表2)讀取並操作它的數據。第二個例子會展示如何導出電子表格到客戶端。
示例1:導入和操作Excel 表
爲了簡化文件訪問操作,我決定在我所舉的例子中使用的Struts。
以下表格將被導入例子中,修改,然後返回客戶端。
1. 建立文件上傳表
第一步是建立一個JSP, 能允許客戶端選擇表格上傳到服務器(見列表1)。
列表 1: Excel 文件上傳表格
< %@ taglib uri="/WEB-INF/tlds/struts-html.tld"
Struts < html:file> 標籤允許你編輯數據org.apache.struts.upload.FormFile(見第二步)
表格內容類型"multipart/form-data" 是用來提交包括非ASCII數據和二進制數據的文件。
2. 創建Struts Action 表(Struts Action Form)
第二步是創建一個可以容納上傳文件的Action Form(見列表2)
列表 2: Struts上傳表格功能表
package test.excel.form;
import org.apache.struts.action.*; import org.apache.struts.upload.FormFile; public class StrutsUploadForm extends ActionForm { private FormFile excelFile; public FormFile getExcelFile() { return excelFile; } public void setExcelFile(FormFile excelFile) { this.excelFile = excelFile; } } |
Struts action 會有一個代碼從StrutsUploadForm 功能表中得到文件,檢查content type並且通過文件的輸入流到達Workbook class。Workbook是代表了一個工作薄的JExcelApi class。這個種類包括各種各樣的工廠方法(factory methods並且提供了多種可以提供工作表入徑的accessors(見列表3)。
列表 3: Excerpt from ExcelUploadAction.java struts action class 從ExcelUploadAction.java struts action class摘錄
...
StrutsUploadForm uploadForm = (StrutsUploadForm)form;; FormFile myFile = uploadForm.getExcelFile(); Workbook workbook = Workbook.getWorkbook(myFile.getInputStream()); ... |
現在你可以把工作表加進Workbook class,你就可以開始遍歷其行。以下的代碼將會從工作簿中得到第一個工作表,還有很多行和列並且重複每一行,顯示每格的內容。(見列表4)
Listing 4: 從ExcelUploadAction.java struts action class摘錄
...
Sheet sheet = workbook.getSheet(0); int numberOfRows = sheet.getRows(); int numberOfColumns = sheet.getColumns(); for (int row = 0; row < numberOfRows; row ++ ) { for (int column = 0; column < numberOfColumns; column ++ ) { Cell cell = sheet.getCell(column,row); System.out.print(cell.getContents() + " | "); } System.out.println(); } ... |
列表 5: 在Java 中計算平均年齡
...
LabelCell labelCell = sheet.findLabelCell("Age"); int ageColumnNumber = labelCell.getColumn(); double ageSum = 0; for (int row = 1; row < numberOfRows; row ++ ) { Cell cell = sheet.getCell(ageColumnNumber,row); if (CellType.NUMBER.equals(cell.getType())){ ageSum = ageSum + Integer.parseInt(cell.getContents()); } } double averageAge = ageSum / (numberOfRows - 1); System.out.println("Sum Age : " + ageSum); System.out.println("Average Age : " + averageAge); ... |
在這個例子中,你會創建一個Excel 表並且把它交回到瀏覽器。
在以下的例子中你將會看到,用JExcelApi創建一個Excel表是一件非常簡單的流程。在你用的doPost()方法中,設置HTTP Response content type到"ms-excel" 並且設置Content-Disposition 到"attachment",然後提供附件名稱(見列表6)。
列表 6: 從Servlet輸出一個Excel文件
...
response.setContentType("application/vnd.ms-excel"); response.setHeader("Content-Disposition", "attachment; filename=sampleName.xls"); WritableWorkbook writableWorkbook = Workbook.createWorkbook(response.getOutputStream()); WritableSheet writableSheet = writableWorkbook.createSheet("Demo", 0); writableSheet.addCell(new Label(0, 0, "Hello World")); writableWorkbook.write(); writableWorkbook.close(); ... |
prefix="html"%>
< html>
< head>
< title>Struts File Upload< /title>
< html:base />
< /head>
< html:form action="/uploadExcel" method="post"
enctype="multipart/form-data">
< table>
< tr>
< td align="left" colspan="3">< font color="red">
< html:errors />< /font>
< /td>
< /tr>
< tr>
< td align="right">Select Microsoft Excel File : < /td>
< td>
< html:file property="excelFile"/>
< /td>
< td>
< html:submit>Upload File< /html:submit>
< /td>
< /tr>
< /table>
< /html:form>
< /body>
< /html>