Java 下载解析Excel文件 报错:jxl.read.biff.BiffException: Unable to recognize OLE stream

项目开发需要先下载excel文件,然后解析出内容,最后将内容分批次下发给APP端。
在创建Excel的解析实例Workbook时,发现构造函数的入参是InputStream,心中窃喜。

public static Workbook getWorkbook(InputStream is)

随即就将从HttpURLConnection处得到的InputStream内存流传给了Workbook,结果报错:

jxl.read.biff.BiffException: Unable to recognize OLE stream
    at jxl.read.biff.CompoundFile.<init>(CompoundFile.java:116)
    at jxl.read.biff.File.<init>(File.java:127)
    at jxl.Workbook.getWorkbook(Workbook.java:268)
    at jxl.Workbook.getWorkbook(Workbook.java:253)
    at com.bj58.lbg.chat.manage.utils.FileComp.downLoadExcel(FileComp.java:29)

在网上搜答案,说是excel的格式有要求,必须是xls;不能是xlsx。于是找FE同学另行生成xls。更换之后,却发现仍然报同样的错。
是下载得到的内容有误吗?带着这个疑问,先将excel保存到本地,然后打开,发现正常。核心代码为:

        InputStream instream = new FileInputStream("E:/test.xls");
        Workbook wwb = Workbook.getWorkbook(instream);

看来,Workbook接受FileInputStream类型。
但是,在Java开发中,是很少创建临时文件的,这点与APP开发不同。
向同事诉说问题现象,同事一句: 改用ByteArrayInputStream试试呢?
遂改随验,发现OK!
结论:不同类型的InputStream应该有不同的读写规范,workbook需要的传参是具体的子类。
最终代码附上:

    public static List<String> downLoadExcel(String fileUrl) throws Exception {
        if(StringUtil.isBlank(fileUrl)){
            return null;
        }
        byte[] fileContent = HttpUtils.download(fileUrl);
        ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(fileContent);
        Workbook wwb = Workbook.getWorkbook(byteArrayInputStream);
        List<String> lists = new ArrayList<String>();
        for (Sheet sheet : wwb.getSheets()) {
            if (sheet != null && sheet.getRows() > 0) {
                for (int i = sheet.getRows()-1; i >=0; i--) {
                    for (Cell cell : sheet.getRow(i)){
                        if (StringUtil.isBlank(cell.getContents())) continue;
                        lists.add(cell.getContents());
                    }
                }
            }
        }
        return lists;
    }
public static byte[] download(String urlLocation) {

    HttpURLConnection conn = null;
    InputStream is = null;
    try {
        URL url = new URL(urlLocation);
        conn = (HttpURLConnection)url.openConnection();
        conn.setDoInput(true);
        conn.setDoOutput(false);
        conn.setUseCaches(false);
        conn.setRequestMethod("GET");
        conn.setConnectTimeout(TIME_OUT);
        conn.connect();

        is = conn.getInputStream();
        return IOUtils.toByteArray(is);
    } catch (Exception e) {
        throw new RuntimeException("请求错误!", e);
    } finally {
        IOUtils.closeQuietly(is);
        if(conn != null) conn.disconnect();
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值