这段时间在公司做一个延时工作情况统计系统,该系统主要是对公司员工的刷卡记录进行处理,统计出每个员工每个月的延时工作情况,以帮助公司负责人更好的管理团队。系统主要是对导入的刷卡时间Excel文件进行读取和处理,一开始我用的是jxl的方式读取,但是失败了,报的是jxl.read.biff.BiffException: Unable to recognize OLE stream错误。由于我刚接触excel的操作,所以并不是很清楚是什么原因导致了这个异常,后来在网上搜索之后我才明白了,原来是我的excel版本过高,jxl不支持,不过按照网友的解决方案,可以把excel另存为一种兼容模式如右图,我试了一下果然另存在兼容模式之后就能顺利读取了。不过,作为用户使用的系统,我们却不能把这种解决方案作为最佳的解决方案。在同事的帮助下,我了解到另一种excel读取方式,就是利用poi来读取,网上说poi能够兼容读取excel2003和excel2007,听我同事说,poi和jxl实现excel读取方式差不多,只是poi性能差一点,我想我们的系统中使用jxl无法读取excel文件,但是另存为兼容模式后能读取,是否跟excel的版本有关呢?于是我便该jxl用poi操作excel的读取。但是结果还是如此,依旧无法读取,这次报的错误是
网上查找了一下,发现原来我的excel文件格式有问题,换句话说我的excel文件根本不是excel文件格式,这是因为这个excel文件是从一个网页上导出来的,而你无法知道那个网页设计人员是按照什么方式导出这个文件,事到如今,我只能放弃jxl和poi改用最原始的方式:用流得方式来读取,用流得方式来读取会碰到中文乱码问题,这个问题我接下来会将到,先贴代码:
try {
InputStreamReader isr = new InputStreamReader(fileField.getInputStream(), "GBK");//设置编码方式,“GBK”按照你的excel文件的编码方式相应更换。fileField是FileItem类的对象,jsp页面上的file类型的input标签中的name属性要与之对应,也就是说name属性也要命名为fileField
BufferedReader inputStream = new BufferedReader(isr);//字节流转换为字符流
String readLine = inputStream.readLine();
int flag = 1;//我的excel文件第一行为标题,跳过读取
while (readLine != null) {
readLine = inputStream.readLine();
if (readLine != null) {
flag++;
String sTemp = readLine.toString();
String[] sTempArray = sTemp.split("\t");
if (sTempArray.length < 5) {
addActionError("第【" + (flag) + "】行 ,数据不完整");
continue;
}
machinenameStr = sTempArray[0];
visittimeStr = sTempArray[1];
teachernameStr = sTempArray[3];
departmentStr = sTempArray[4];
carcodeStr = sTempArray[5];
if (hasActionErrors()) {
return SUCCESS;
}
visitList.add(sTempArray[1]);
}
}
isr.close();
}
catch (IOException e1) {
e1.printStackTrace();
}
网上更多地是jxl和poi读取excel的代码,这两种方式其实是对流的方式读取的一种封装,使得使用的人更方面,更符合面向对象的设计模式。但是当碰到我上面的类似情况时,这两种方式就有了它的局限性,这也说明,对excel文件的读取的方式还有待完善和改进,或许现在已经有一个方式能兼容读取excel文件了,但我还没有了解到。
上述内容是我对我在做项目时遇到的问题的一个总结,有些地方必然会有一些出入和瑕疵,希望各位读者能够提出一些意见,大家在交流中成长,也希望那些碰到相似问题的人可以从我的文章中找到一点解决思路,如您有更好的excel读取想法可以评论文章,或发送邮件至1034914256@qq.com一起探讨。
附上两个链接,是我在遇到问题时在网络上找到的比较好的资源,一个是产生问题的原因,一个是poi读取Excel(兼容Excel2003、Excel2007)的例子
- jxl读取excel的一个搞脑子的问题http://www.iteye.com/problems/10143
- poi读取Excel(兼容Excel2003、Excel2007)http://blog.youkuaiyun.com/jack0511/article/details/6179593