JAVA读写EXCEL文件方法



JAVA读写EXCEL文件方法。

目前,有两套开源的库可以直接读写Excel文件:
Apache组织下的Jakarta POI项目。
JExcelApi项目。
POI项目是读写微软的OLE2文档的一套API,包括Word文档,Excel文档,不过目前成熟的是操作Exce的HSSF子项目。
JExcelApi是一个韩国人开发的,只是针对Excel文件。
从功能来说,两者都支持:
Excel文档的读写
支持对字体,数字,日期的格式化
支持对单元格加阴影和加色彩
支持公式的读写
修改存在的工作表
支持图片的创建
单元格的合并
不过HSSF的功能似乎更强大一些,还支持
设置打印区域
支持绘制图形(draw shape)
支持PNG,JPG,DIB三种图像格式(JExcelApi只支持PNG)
支持Headers and Footers,包括在页脚上添加页码
两者现在都不支持Excel的图表操作。
从学习的角度来说,HSSF用起来稍微复杂一些,包和包之间的关系比较复杂。而JExcelApi容易上手一些。
JExcelApi主要的类
JExcelApi将根据读写分成两大类,读的一类,写的一类。据说目的是为了提高读Excel的性能,读入Excel文件的时候,只专注于内容,不必解释那些格式化信息,如子题,背景色等等。(我认为将读格式化信息的方法做成懒加载的方式可能更好)
类 作用
Workbook 表示只读的Excel工作簿和构造Workbook的工厂类
WritableWorkbook 可写的Excel工作簿
Sheet 工作簿内的只读工作表
WritableSheet 工作簿内的可写工作表
Cell 单元格的接口,读出单元格的信息
WritableCell 可写单元格的接口
Label 内容为字符类型的Cell,可读可写
Number 内容为数字类型的Cell,可读可写
DateTime 内容为日期类型的Cell,可读可写
Boolean 内容为布尔量的Cell,可读可写
Formula 内容为公式类型的Cell,可读可写
CellFormat 读出单元格格式化信息
WritableCellFormat 设定单元格的格式化信息
Font 字体的接口,读出字体的信息
WritableFont 可以设定字体信息
JExcelApi的用法
读入工作表
Workbook workbook = Workbook.getWorkbook(new File(“demo.xls”)); Sheet sheet = workbook.getSheet(0); //单元格的索引从0开始,getCell(0,0)表示获得第一列第一行的单元格 Cell a1 = sheet.getCell(0,0); Cell b2 = sheet.getCell(1,1); Cell c2 = sheet.getCell(2,1); //获得单元格的内容,一律转化成字符 String stringa1 = a1.getContents(); String stringb2 = b2.getContents(); String stringc2 = c2.getContents();
如果要知道单元格的内容的准确类型,那么要根据Cell.getType方法来判断
String string = null; double number = 0; Date date = null; Cell a1 = sheet.getCell(0,0); Cell b2 = sheet.getCell(1,1); Cell c2 = sheet.getCell(2,1); if (a1.getType() == CellType.LABEL) { LabelCell lc = (LabelCell) a1; string = lc.getString(); } if (b2.getType() == CellType.NUMBER) { NumberCell nc = (NumberCell) b2; number = nc.getValue(); } if (c2.getType() == CellType.DATE) { DateCell dc = (DateCell) c2; date = dc.getDate(); }
如果读出Excel文件内容之后,记得要擦屁股JAVA读写EXCEL文件
//关闭workbook并且释放其所占用的内存 workbook.close();
创建一个Excel文件
前面说过读和写分成两类,写Excel文件就不能用Workbook类来操作了,可写的Excel用WritableWorkbook来表示,不过还是要用Workbook的工厂方法生成。
WritableWorkbook workbook = Workbook.createWorkbook(new File(“output.xls”)); //创建一个工作表,名字为”First Sheet”,位置在第一个 WritableSheet sheet = workbook.createSheet(“First Sheet”, 0); //创建一个字符型的单元格(包含位置信息),将其加入到工作表中 Label label = new Label(0, 2, “A label record”); sheet.addCell(label); //创建一个数字型的单元格(包含位置信息),将其加入到工作表中 Number number = new Number(3, 4, 3.1459); sheet.addCell(number);
一旦创建单元格后,单元格的位置就不能改变,只能改变其内容。单元格的位置是按(列,行)指定的,并且按0开始索引的,如A1就是(0,0),B1是(1,0)。
写入内容后,同样要擦屁股,不过还多了一样事情,就是将内存中的内容写入到文件中。
workbook.write(); workbook.close();
JAVA读写EXCEL文件 提示
不仅可以将workbook写入到文件中,也可以将workbook写入到一个输出流中,这样就可以通过web方式来让用户下载Excel文件。写入到输出流,要调用工厂方法Workbook.createWorkbook(OutputStream os)。
格式化Excel
设置字体
WritableFont arial10font = new WritableFont(WritableFont.ARIAL, 10); WritableCellFormat arial10format = new WritableCellFormat (arial10font); Label label = new Label(1,0, “Arial 10 point label”, arial10format); sheet.addCell(label2);
WritableFont预定义了几个常用字体,如果是其他字体,可以调用其构造函数如:
public WritableFont(FontName name, int pointSize, BoldStyle bs); public WritableFont(FontName name, int pointSize, BoldStyle bs, boolean italic, UnderlineStyle us, Colour c); //调用WritableFont的工厂方法来生成FontName public static FontName createFont(String fontName);
设置对齐方式
WritableCellFormat.setAlignment(jxl.format.Alignment.CENTRE);
合并单元格
//(m,n)到(p,q)的单元格全部合并 WritableSheet.mergeCells(int m,int n,int p,int q);
行高和列宽
//指定第i+1行的高度 WritableSheet.setRowView(int i,int height); //指定第i+1列的宽度 WritableSheet.setColumnView(int i,int width);
格式化数字
NumberFormats表示数字格式,预定了几种格式,象NumberFormats.INTEGER表示取整,NumberFormats.FLOAT表示小数去两位。也可以自己定义数字格式。
WritableCellFormat integerFormat = new WritableCellFormat (NumberFormats.INTEGER); Number number2 = new Number(0, 4, 3.141519, integerFormat); sheet.addCell(number2); WritableCellFormat floatFormat = new WritableCellFormat (NumberFormats.FLOAT); Number number3 = new Number(1, 4, 3.141519, floatFormat); sheet.addCell(number3); NumberFormat fivedps = new NumberFormat(“#.#####”); WritableCellFormat fivedpsFormat = new WritableCellFormat(fivedps); Number number4 = new Number(2, 4, 3.141519, fivedpsFormat); sheet.addCell(number4);
也可以定义具有某种字体的数值格式:
WritableCellFormat fivedpsFontFormat = new WritableCellFormat(times16font, fivedps); Number number5 = new Number(3, 4, 3.141519, fivedpsFontFormat); sheet.addCell(number5);
格式化日期
DateFormat表示日期格式。
Date now = Calendar.getInstance().getTime(); DateFormat customDateFormat = new DateFormat (“dd MMM yyyy hh:mm:ss”); WritableCellFormat dateFormat = new WritableCellFormat (customDateFormat); DateTime dateCell = new DateTime(0, 6, now, dateFormat); sheet.addCell(dateCell);
读入Excel并且修改Excel
读入的Excel是不能修改的,如果要修改,则要创建一个当前读入的Excel的副本,在这副本上进行修改。
Workbook workbook = Workbook.getWorkbook(new File(“myfile.xls”)); //创建可修改的副本 WritableWorkbook copy = Workbook.createWorkbook(new File(“output.xls”), workbook); WritableSheet sheet2 = copy.getSheet(1); WritableCell cell = sheet2.getWritableCell(1, 2); //修改单元格内容 if (cell.getType() == CellType.LABEL) { Label l = (Label) cell; l.setString(“modified cell”); } //新增单元格 Label label = new Label(0, 2, “New label record”); sheet2.addCell(label); Number number = new Number(3, 4, 3.1459); sheet2.addCell(number); //写入并且释放资源 workbook.close(); copy.write(); copy.close();
不管是POI还是JExcelApi都不支持Chart的操作,不过对于chart的数据是固定的,可以先做一个模板文件,然后读入文件,改写有关的单元格数据。