操作excel比较

来源:互联网 发布:淘宝客服忙不忙 编辑:程序博客网 时间:2024/05/01 17:26

鉴于windows操作系统及office办公平台,在个人桌面上的垄断地位,使得excel/word/ppt等文件被广泛应用。通过java读 写excel文档是编程开发中常见问题,比如在swing和web应用中经常遇到。目前通过Java操作Excel的类库大致有[1]:
    1、POI,大名鼎鼎的Apache上的项目。
    2、Java Excel API(亦简称jexcelapi或jxl),纯java的excel开发包。
    3、jexcel,jxl的衍生品,适宜于Swing开发。
    4、jxls,依赖于POI,基于excel模板的可定制化报表输出工具。
    5、Jacob (Java COM Bridge),顾名思义,是采用桥接方式访问COM组件及Win32类库。
    6、其它方式,如数据导出到html格式的表格中,再另存为xls文档

    使用比较
    POI、jxl、jexcel可以划归为一类,通过java封装了Excel的操作,所以需要折腾Workbook,Sheet,Cell等对象,顾及excel的每个细节。这种方式,优点是功能强大。缺点是代码冗长拖沓,阅读困难。
    jxls虽然是基于POI,但其最大突破在于预先定制好Excel模板(如字段、格式、图表等),运行期绑定数据即可呈现多样化报表。其优点是编程轻松,功能灵活方便。缺点是对于过于动态化报表不太适用(如输出字段、格式非常多变)。
    Jacob和COM模型粘在一起,自然被纯java的拥趸者所不顾。所以,应用不是很广。
 

    jxls初体验

    业务部门经常需要我们技术部给推送一些定期报表,这些报表的字段及格式都是预定义好的。显而易见,在这种场合,jxls是再适合不过的工具了。只要定义好 输出报表的模板,绑定查询出的数据即大功告成。日常维护起来也很方便,比如加减字段、改变展现方式、嵌入excel自动图表等都能轻松搞定。
    百闻不如一见,从jxls主页[5]上下载了jXLS v.0.9.6(不知何故,自20080409日后没有再更新),安装起来运行其中自带的范例。自带范例可以通过maven来编译,偶试了试编译成功,但 不知道怎么运行范例。后来没辙,把范例导到eclipse中进行编译运行。编译时下载了最新的poi-3.2-FINAL-20081019.jar,结 果编译成功,但运行报错
    java.lang.NoSuchMethodError: org.apache.poi.hssf.usermodel.HSSFCell.setEncoding(S)V
    后来换成poi-3.1-FINAL-20080629.jar,又报别的错,最后好不容易从CSDN上下载了poi-3.0.1-FINAL- 200705.jar,总算运行成功。体验了一下,效果非常好。让人不解的是,在POI主站上只能下载到最新的POI3.2版本,老版本就是找不到。

    参考资料
    1、http://schmidt.devlib.org/java/libraries-excel.html,java操作Excel的类库清单
    2、http://jakarta.apache.org/poi/,POI主页
    3、http://www.andykhan.com/jexcelapi/index.html,jxl主页
    4、http://www.teamdev.com/jexcel/index.jsf,jexcel主页。
    5、http://jxls.sourceforge.net/,jxls主页
    6、http://jacob-project.wiki.sourceforge.net/,Jacob主页



POI是一个标准的Apache项目,提供了完整的接口,不过也正因为这个POI用起来会很比较复杂不容易上手。相比较JXL就用起来就方便很多,功能也显得少了一些,不过应付起常见操作还是绰绰有余,JXL不支持设置打印区域。在我接触的很多项目中,都是采用的JXL,可以说JXL用POI 20%的代码实现了Poi 80%的功能。jxl的主要功能有:

1.从Excel 95、97、2000等格式的文件中读取数据
2.读取Excel公式(可以读取Excel 97以后的公式)
3.生成Excel数据表(格式为Excel 97)
4.支持字体、数字、日期的格式化
5.支持单元格的阴影操作,以及颜色操作
6.修改已经存在的数据表




POI 主页:http://poi.apache.org/
JXL 的Api http://www.andykhan.com/jexcelapi/

我们利用一段代码做比较,同样是读取一个excel中内容,您会发现jxl的代码量比poi要小,也更容易理解。附件提供了jxl.jarpoi.jar,很显然后者比前者大很多。

JXL操作Excel

public class JxlReadExcel {/** * @param args */public static void main(String[] args) {// TODO Auto-generated method stubString filepath = "C:\\demo.xls";try {Workbook workbook = Workbook.getWorkbook(new File(filepath));Sheet sheet = workbook.getSheet(0);// j为行数,getCell("列号","行号")for (int i = 1, j = sheet.getRows(); i < j; i++) {Cell c1 = sheet.getCell(0, i);String name = c1.getContents();Cell c2 = sheet.getCell(1, i);String score = c2.getContents();System.out.println(" 姓名:" + name + ",成绩:" + score);}} catch (BiffException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}}

POI操作Excel

public class PoiReadExcel {/** * @param args */public static void main(String[] args) {// TODO Auto-generated method stubtry {// HSSFWorkbook workbook=new// HSSFWorkbook(Class.forName("ReadExcel").getResourceAsStream("c:\\demo.xls"));//// 使用流的方式读文件String filepath = "c:\\demo.xls";POIFSFileSystem fs = new POIFSFileSystem(new FileInputStream(filepath));HSSFWorkbook workbook = new HSSFWorkbook(fs);HSSFSheet sheet = workbook.getSheetAt(0);for (int i = 1, j = sheet.getLastRowNum(); i <= j; i++) {HSSFCell c_name = sheet.getRow(i).getCell((short) 0);String name = c_name.toString();HSSFCell c_score = sheet.getRow(i).getCell((short) 1);double score = c_score.getNumericCellValue();System.out.println(" 姓名:" + name + ",成绩:" + score);}} catch (Exception e) {e.printStackTrace();}}}



原创粉丝点击