日常开发中可能会遇到这样的需求:解析用户上传的EXCEL文件、将数据生成EXCEL文件供用户下载使用等等。所以说Java操作EXCEL文件还是有很大的现实意义的,虽然平时我们接触的网上下载的报表之类的大多数为PDF格式,但不同格式的文件的侧重点不同,应用场景也不同,各有优劣。
操作方式
常见的操作方法用三种,或者说三个工具:
(1)Apache POI ;(https://poi.apache.org/)
(2)JXL ;(http://www.quicklyjava.com/jexcel-jar-download/)
(3) fastexcel ;(http://fastexcel.sourceforge.net/#download)
三种方式的对比网上已经有非常多的对比博文,这里不做测试。只是感慨一下Apache软件基金会的神存在,或者说整个Apache开源项目的牛X,感觉到哪都是Apache。言归正传,Apache POI不仅仅是针对EXCEL文件,而是一个针对微软文档的操作工具的大项目,提供了常见的文档如Word、Powerpoint、Visio等的支持,文档也非常齐全,打开上面的网址后可以看到详细的介绍,无论是新版还是旧版文件格式都提供了很好的支持,并且很多高级的特性如字体颜色等也有非常好的支持,官方提供的文档中有非常多的示例。
后面两者则是针对EXCEL来开发的,比较轻量级,操作也很方便,fastexcel也提供了几个简单的操作实例,打开上面的网页也能看到。所以现在只是做一下JXL的简单使用测试。值得注意的是如果你不熟悉JXL,则下载JXL的时候最好连源码一起下载,一并导入IDE,否则其中一些方法的参数你在调用的时候可能无法一下子就联想到其含义,配合源码和注释使用会方便一些。
简单操作
下面以JXL为例来简单测试一下EXCEL文件的操作。且看如下示例代码:
package org.devsong;
import java.io.File;
import jxl.Cell;
import jxl.Sheet;
import jxl.Workbook;
import jxl.write.Label;
import jxl.write.WritableSheet;
import jxl.write.WritableWorkbook;
/**
* JXL简单测试
* @author 12593
*/
public class JXLTest {
/**
* XLS文件简单创建
* @throws Exception
*/
public static void createFile() throws Exception {
String[] head = { "id", "name", "gender", "email" };
File file = new File("src/user.xls");
file.createNewFile();
// 创建工作簿
WritableWorkbook workbook = Workbook.createWorkbook(file);
// 创建sheet
WritableSheet sheet = workbook.createSheet("sheet1", 0);
Label label = null;
// 组织表头字段 id name gender email
for (int i = 0; i < head.length; i++) {
// 参数:列, 行, 内容
label = new Label(i, 0, head[i]);
sheet.addCell(label);
}
// 组织内容写入,存入10个user
for (int i = 1; i <= 10; i++) {
// 每个单元格靠行列坐标来定位
label = new Label(0, i, i + "");
sheet.addCell(label);
label = new Label(1, i, "user_" + i);
sheet.addCell(label);
label = new Label(2, i, "MALE");
sheet.addCell(label);
label = new Label(3, i, "xxxx@xx.com");
sheet.addCell(label);
}
workbook.write();
workbook.close();
}
/**
* XLS文件简单读取
* @throws Exception
*/
public static void readFile() throws Exception {
// 获取文件对象
File file = new File("src/user.xls");
Workbook workbook = Workbook.getWorkbook(file);
// 获取sheet
Sheet sheet = workbook.getSheet(0);
for (int i = 0; i < sheet.getRows(); i++) {
for (int j = 0; j < sheet.getColumns(); j++) {
// 获取指定坐标的单元格
Cell cell = sheet.getCell(j, i);
System.out.print(" " + cell.getContents());
}
System.out.println();
}
workbook.close();
}
public static void main(String[] args) {
try {
createFile();
readFile();
} catch (Exception e) {
e.printStackTrace();
}
}
}
上面只是做了简单的文件创建和读取测试,很多高级的特性如行高、列宽等并未涉及,并且工具本身提供了很多重载方法,可以根据需求使用。
结果
文档生成效果

文档读取输出效果
id name gender email
1 user_1 MALE xxxx@xx.com
2 user_2 MALE xxxx@xx.com
3 user_3 MALE xxxx@xx.com
4 user_4 MALE xxxx@xx.com
5 user_5 MALE xxxx@xx.com
6 user_6 MALE xxxx@xx.com
7 user_7 MALE xxxx@xx.com
8 user_8 MALE xxxx@xx.com
9 user_9 MALE xxxx@xx.com
10 user_10 MALE xxxx@xx.com