Java-JXL

jxl是一个韩国人写的java操作excel的工具, 在java的开源世界中,有两套比较有影响的API可供使用,一个是POI,一个是jExcelAPI(即jxl)。jxl功能相对POI比较弱一点。

jxl优缺点

Jxl特征有如下描述:
● 支持Excel 95-2000的所有版本
● 生成Excel 2000标准格式
● 支持字体、数字、日期操作
● 能够修饰单元格属性
● 支持图像和图表
应该说以上功能已经能够大致满足我们的需要。最关键的是这套API是纯Java的,并不依赖Windows系统,即使运行在Linux下,它同样能够正确的处理Excel文件。另外需要说明的是,这套API对图形和图表的支持很有限,而且仅仅识别PNG格式。

开发指南

jxl操作excel包括对象Workbook,Sheet ,Cell。
一个excel就对应一个Workbook对象,
一个Workbook可以有多个Sheet对象
一个Sheet对象可以有多个Cell对象

workBook工作簿 sheet表格 cell单元格

读取excel

通过Workbook,Sheet ,Cell这三个对象我们就可以实现Excel文件的读取工作。我们先想想一下读取步骤,不管是什么样的Excel操作框架必定都要经历
1、 选取Excel文件得到工作薄
2、 选择工作表
3、 选择Cell
4、 读取信息

读取工作簿

选取Excel文件得到工作薄Workbook

Workbook workbook = Workbook.getWorkbook(new File(“myfile.xls”));

读取工作表

通过Workbook的getSheet方法选择第一个工作表(从0开始)

Sheet sheet = workbook.getSheet(0);

也可以通过工作表的名称来得到sheet表格

读取单元格

通过Sheet的getCell方法选择位置为C2的单元格(两个参数都从0开始)
Cell c2 = sheet.getCell(2,1);

1、读取单元格的值
2、 通过Cell的getContents方法
把单元格中的信息以字符的形式读取出来
String stringc2 = c2.getContents();
3 、Cell提供了一个getType方法
能够返回单元格的类型信息,同时JXL提供了一个CellType类用来预设Excel中的类型信息,而且JXL提供了一些Cell类的子类用来分别用来表示各种类型的单元格,如LabelCell,NumberCell,DateCell分别表示字符、数值、日期类型的单元格

  1. if (c2.getType() == CellType. LABEL) {
  2. LabelCell nc = (LabelCell) c2;
  3. String number b2 = nc. getString();
  4. }
  5. if (c2.getType() == CellType. DATE) {
  6. DateCell nc = (DateCell) c2;
  7. Date number b2 = nc. getDate();
  8. }
  9. if (c2.getType() == CellType.NUMBER) {
  10. NumberCell nc = (NumberCell) c2;
  11. double number b2 = nc.getValue();
  12. }

4、以释放资源
workbook.close()
当你完成对Excel电子表格数据的处理后,一定要使用close()方法来关闭先前创建的对象,以释放读取数据表的过程中所占用的内存空间,在读取大量数据时显得尤为重要
最后不要忘记关闭workbook以释放资源:workbook.close();

写excel操作

通过WritableWorkbook,WritableSheet,Label这三个对象我们就可以实现Excel文件的插入工作。我们先想想一下插入,不管是什么样的Excel操作框架必定都要经历
1、 创建Exce工作薄
2、 创建工作表
3、 创建单元格

创建工作簿

API提供了两种方式来处理可写入的输出流,一种是直接生成本地文件,如果文件名不带全路径的话,缺省的文件会定位在当前目录,如果文件名带有全路径的话,则生成的Excel文件则会定位在相应的目录;另外一种是将Excel对象直接写入到输出流,例如:用户通过浏览器来访问web服务器,如果HTTP头设置正确的话,浏览器自动调用客户端的Excel应用程序,来显示动态生成的Excel电子表格。

1 创建可写入的Excel工作薄

WritableWorkbook wwb = Workbook.createWorkbook(new File(targetfile));

2 将WritableWorkbook直接写入到输出流

OutputStream os = new FileOutputStream(targetfile); WritableWorkbook wwb = Workbook.createWorkbook(os);

创建工作表

WritableSheet ws = wwb.createSheet(“通讯录”, 0);//创建sheet

创建单元格

1、添加文本类单元格

Label labelC = new Label(0, 0, “This is a Label cell”);

2、添加带有字型Formatting的对象

WritableFont wf = new WritableFont(WritableFont.TIMES, 18, WritableFont.BOLD, true); WritableCellFormat wcfF = new WritableCellFormat(wf); labelCF = new Label(1, 0, “This is a Label Cell”, wcfF); ws.addCell(labelCF);

3、添加带有字体颜色Formatting的对象

WritableFont wfc = new WritableFont(WritableFont.ARIAL,10,WritableFont.NO_BOLD, false, UnderlineStyle.NO_UNDERLINE, jxl.format.Colour.RED); WritableCellFormat wcfFC = new WritableCellFormat(wfc); Label labelCFC = new Label(1, 0, “This is a Label Cell”, wcfFC); ws.addCell(labelCF);

4、添加Number对象

Number labelN = new jxl.write.Number(0, 1, 3.1415926); ws.addCell(labelN);

5、添加带有formatting的Number对象

NumberFormat nf = new NumberFormat(“#.##”); WritableCellFormat wcfN = new WritableCellFormat(nf); Number labelNF = new Number(1, 1, 3.1415926, wcfN); ws.addCell(labelNF);

6、添加Boolean对象

Boolean labelB = new jxl.write.Boolean(0, 2, false); ws.addCell(labelB);

7、添加DateTime对象

DateTime labelDT = new DateTime(0, 3, new java.util.Date()); ws.addCell(labelDT);

8、添加带有formatting的DateFormat对象

DateFormat df = new DateFormat(“dd MM yyyy hh:mm:ss”); WritableCellFormat wcfDF = new WritableCellFormat(df); DateTime labelDTF = new DateTime(1, 3, new Date(), wcfDF); ws.addCell(labelDTF);

9、添加公式单元格

Fornual formual = new Formual(0,11,”Sum(A1:A9)”); wrb.addCell(formual);

10、添加图像

WritableImage wrimage=new WritableImage(1,5,10,10,new File(imageFilepath)); wrb.addImage(wrimage);

注意,API中注明只支持png文件。

Sheet接口提供的方法

String getName() 获取工作表的名称
int getColumns() 获取Sheet表中所包含的总列数
Cell[] getColumn(int column) 获取某一列的所有单元格,返回的是单元格对象数组
int getRows() 获取Sheet表中所包含的总行数
Cell[] getRow(int row) 获取某一行的所有单元格,返回的是单元格对象数组
Cell getCell(int column, int row)获取指定单元格的对象引用,需要注意的是它的两个参数,第一个是列数,第二个是行数,这与通常的行、列组合有些不同
WritableSheet.setRowView(int i,int height); 指定第i+1行的高度
WritableSheet.setColumnView(int i,int width); 指定第i+1列的宽度

(WritableSheet)sheet.getSettings().setShowGridLines(false);//去掉整个sheet中的网格线
WritableCellFormat.setBackground(Color.YELLOW);设置单元格背景色