使用jexcel导入excel sheet时抛出空指针异常的解决办法

    我做的项目中不同的成员写了一堆调查文档,sheet格式一致,我想把所有人的某一个sheet全部导入到一个excel中去分析,显然手工copy不仅效率低,容易出错,文档随时都有可能变化,所以手工复制不是一个好办法,于是就想到用jexcel去自动导入,读了一下相关的文档---文档写得够烂的,好不容易找到了一个方法叫importSheet(Workbook中的)可以实现sheet从一个工作簿导入到另一个,但一运行抛出一个大空指针异常:

    于是打开SheetCopier这个类的第996行,分析了一遍,原来是个小bug,开发者应该使用&&来判断c.getCellFeatures()和c.getCellFeatures().hasDataValidation(),结果他却使用了短路与,当前者为null的时候仍然跑去判断第二个条件了.

 

于是改成&&,再运行build目录下的ant文件去重新build,又抛出了一堆编码的异常来.

F:/My Doc/program/java/lib/jexcelapi/src/jxl/format/PaperSize.java:95: 警告:编码 GBK 的不可映射字符

  又看了下这个类的源代码,发现它的注释中用了很多乘号之类的特殊字符,在gbk中无法正常显示,在iso8859-1中才能正常显示,于是在build.xml的javac命令中,指定encoding属性为"iso8859-1",再编译,除了一些警告,编译正常.再回来运行我的导入类,成功.不过jexcel还是不太完美,生成的excel背景色变了,还生成了一些多余的单元格.而且jexcel只能操作excel2003以前的,对excel2007无法操作.

BTW:实际上,用什么库来导入导出sheet页来,花了1天的时间来研究,如果单纯从无到有地生成一份excel文件来,无论是jexcel,poi都可以完成,但到了导入导出,复制sheet来,则因为excel格式的问题,两个库都有问题,poi更差一些,它根本就没有复制的方法,只有手工读取每一行每一个单元格地进行复制,还要判断使用了什么style,还要判断数据类型,工作量非常大,自己实现起来实在恐怖,有一个外国的网友最初自己写了一个类来干这事,有点bug,后来不知是经他本人还是别人的共同努力,增加了一些方法和类,就是现在的jxls,它是基于poi的,但仍然有一个bug未改正,就是Util类有个地方的Set应该使用HashSet,他却用了TreeSet,这个类要求元素必须实现Comparable接口的,但存储的元素却没有实现这个接口,当excel文件中有合并的单元格时,调用了涉及这个Set的contains方法时就出错了,改起来倒也容易,但把sheet复制到另一个工作簿的时候,却总是报可恶的"Exception in thread "main" java.lang.IllegalArgumentException: This Style does not belong to the supplied Workbook. Are you trying to assign a style from one workbook to the cell of a differnt workbook?"异常,真晕.最后也只剩下jexcel可以用了,但它不能操作excel2007,原因是2007和2003之前的版本格式完全不同,微软又不可能告诉他具体的格式细节,于是不支持了,想了又想,唯一的办法是先把2007的文件通过某种方式转成2003,然后再用jexcel来完成导入操作.2007转换成2003最简单的办法是使用宏,这个网页有介绍:http://www.cnblogs.com/icedog/archive/2010/12/09/1901663.html, 还可以看我发的一个帖子看看宏如何运行,http://topic.csdn.net/u/20110212/17/6b1b71e8-a85d-4fc1-98de-a64081f30528.html.

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值