JExcelAPI(jxl)读写Excel应用
?
? 这篇博文在我的草稿箱里已经放够久了,又到一年樱花时,想起母校到处灿烂的樱花了。不知道老班这个感性的女人今年有没有再去老校区拍些照片传到空间里,也好解下思念母校之苦啊!当然了,今天去蠡湖公园欣赏樱花的来着。呵呵呵~今天结束jxl读写Excel表的应用吧。
? JExcelAPI简称JXL,一套纯Java实现读写Excel功能的API;非常的简洁,只需要一个jxl.jar(该博文对应的jxl版本为2.6.12)就可以。有多个传说中的官网,也不知道怎么搞的,整得乱七八糟的,最后找到这个http://www.andykhan.com/jexcelapi,绝对有你所有想要的资料。
? 我们也知道Apache POI项目相对于JXL,则提供了更为功能强大的Excel读取功能,还包括了Microsoft其它文档的读写API,包括word、powerpoint等等,拥有着强大的社区支持,在2011-03-07已经出了3.8的测试版本,相对于JXL,它的功能确实够强大。不过,要读写不同版本的Excel还得切换不同的API,也不得不说,这是件幸福而烦恼的事情。
? 今天暂且介绍JXL读写Excel,有需要的朋友,学习POI项目还是有必要的,我这都是图省事儿。
? 先说说这个JXL的实用类的由来吧,主要是面向加拿大和美国的项目产品,所以,国际化就成了必不可少的功能,英文能猜个八九不离十,法文就糟糕了。所以,我们这边必须得整理出项目中的单词发给加拿大那边的同事给我们进行法文和英文的翻译,最后我们共同协商决定用Excel统一发过去,N多的国际化资源文件,让你一个个的往Excel里面拷贝,搞这个玩意儿,我相信你搞会儿有够你郁闷的。
? 所以,急需要一个工具类,将*.properties和*.js文件读取到Excel表中,然后再把翻译完的Excel表的内容读出再写到properties和js文件中,所以ExcelOperator.java应运而生。
? 不管怎么样,先得把properties以及js文件写入Excel表中,properties文件我们肯定是很清楚了,也是存储key-value值的一种方式,当然,在我们的项目中,js也采用了这种key-value的方式,便于国际化,现列出properties和js文件的格式:
?? Properties:
???? 1)通过指定的文件名(或者自动生成),得到一个Excel的文件输出流,接着通过WorkBook这个抽象类的静态方法createWorkbook(OutputStream os)创建一个可读写的工作薄实例WritableWorkbook,这里有必要解释一下WorkBook,此抽象类就是代表一个工作簿,即一个具体的Excel,该类包含了多种的工厂方法以及提供了多种访问工作表的访问器。除了通过指定输出流来生成一个可读写的WritableWorkbook实例外,你还可以通过指定File对象,具体的可参见源代码,在此不详述!
?? 2)创建一个工作簿的Sheet对象,如何获取Sheet的文件名,现在大概说一下,我之前有说过,Excel表格的格式,而在我的项目中,它是分别放在中、英、法对应的国际化目录中的,所以,我会将每个国家对应的国家化文件读取到同一个Sheet中。所以,通过指定的SheetName和位置生成一个可读写的WritableSheet对象,如果此Sheet已经存在,则获取,否则新建一个。
? 3)有了工作表之后,之后的工作当然要往里面写入表格内容,每一个元件即对应JXL中的Cell对象,创建当前工作表的表头元件集合,即newInstanceHeaderCell方法:
?
???? 从结果来看,传入三个文件名,生成两个Sheet,Sheet名为Jsi18nTestResource.js的内容,除了FR-BE法文没有内容外,另外两个分别从Jsi18nTestResource_ZH_CN.js和Jsi18nTestResource_EN_US.js中读取并写入。
? 二、将对应的文件写入到Excel表之后,经过国际化的翻译,我还得把它转过来不是嘛~接下来,做这样的事情之前呢,为了能够生成法文文件,所以,将Sheet名为Jsi18nTestResource.js的FR-BE列分别加入testFr1~testFr4
?
???? 1)通过WorkbookSettings对象的setEncoding("ISO-8859-1")来解决乱码的问题,再通过Workbook wb = Workbook.getWorkbook(in, wbs)来获取Workbook对象。记得写Excel表是什么对象来着?!对了:WritableWorkbook,这两个都代表当前的工作薄,唯一的区别就是前者是只读的,后者是可写的。
??? 2)获取当前工作薄里所有内容不为空的Sheet集合,然后循环所有的Sheet对象,通过Sheet的名字及后缀名,生成对象的国际化文件输出流,并将Sheet内容读出写入到对应的国际化文件中。
??? 3)获取当前工作表的所有行,然后从第二行开始遍历(第一行为对应的表头,第二行才是真正的数据)。
???????? Cell[] rowCells = sheet.getRow(i);该方法返回当前行所有的元件集合,然后遍历该行的表格内容,每一行的第一列为国际化文件的主键值,所以通过key = rowCells[j].getContents()返回其内容,否则,则获取数值内容并通过转义保存到对应的国际化文件中。
? 看如下的测试代码:
?
? 该博文的内容看起来虽然不少,但是真正涉及到Excel读写的代码,也就几行,倒是大量的篇幅花在了业务逻辑上
,可以看到JXL读写Excel是多么的简单易用,可惜的是官网说明只支持Excel 95, 97, 2000,即不支持*.xlsx格式,所以,这是一个很遗憾的事情,要想读取*xlsx,还是得选择 POI,事实再一次的证明了研究POI的重要性,所以,有时间,POI再见!
,可以看到JXL读写Excel是多么的简单易用,可惜的是官网说明只支持Excel 95, 97, 2000,即不支持*.xlsx格式,所以,这是一个很遗憾的事情,要想读取*xlsx,还是得选择 POI,事实再一次的证明了研究POI的重要性,所以,有时间,POI再见!