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>