[实习纠错日记]关于Excel文件的读取

本文介绍了在开发延时工作情况统计系统过程中遇到的Excel读取问题及解决方案,包括使用jxl和poi库失败的原因分析,并提供了通过流方式读取Excel的具体实现代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这段时间在公司做一个延时工作情况统计系统,该系统主要是对公司员工的刷卡记录进行处理,统计出每个员工每个月的延时工作情况,以帮助公司负责人更好的管理团队。系统主要是对导入的刷卡时间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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值