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的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分别表示字符、数值、日期类型的单元格
if (c2.getType() == CellType. LABEL) {
LabelCell nc = (LabelCell) c2;
String number b2 = nc. getString();
}
if (c2.getType() == CellType. DATE) {
DateCell nc = (DateCell) c2;
Date number b2 = nc. getDate();
}
if (c2.getType() == CellType.NUMBER) {
NumberCell nc = (NumberCell) c2;
double number b2 = nc.getValue();
}
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);
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);设置单元格背景色