前几天被叫去看一个老系统,做好大概几个月了。
说是excel导入出了问题,有一批数据就是不能导入。而且也是excel格式的,看不出问题。
然后我过去本机跑了一下,报的不是业务异常,是jxl读文件的异常,如下:
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:221)
at jxl.Workbook.getWorkbook(Workbook.java:198)
然后去查了下jxl的源代码,这里抛出的异常。
for (int i = 0; i < IDENTIFIER.length; i++)
{
if (data[i] != IDENTIFIER[i])
{
throw new BiffException(BiffException.unrecognizedOLEFile);
}
}
说明咱导入的这个excel不是jxl认定的标准OLE file,真是见鬼了。。打开也好好的是excel。怎么就不是标准的OLE file?
接着查这批不能导入的excel到底有什么问题,查来查去后来无意中用ultraEdit打开了一下,结果发现居然不是2进制文件,而是一个网页文件。马上打开另外一个可以导入的xls文件,发现直接出来的是2进制。继续打开前一个不能导入的excel文件仔细查看,结果在选择另存为的时候跳出来是这个样子:
原来发现本质是个网页文件。。
然后再尝试不加引号保存,发现保存完图标也变了。文件名变成demo.xls.htm 这下基本确定这批excel文件其实都是网页文件,解决办法我就是先让客户全部另存一下,选择ms excel工作簿保存再导入。
然后客户需求来了,问我为啥要另存一下,不是数据都在的么?
查了半天资料,解决不掉这个囧问题。 总结了下面几点:
1.加引号“demo.xls” 和不加引号保存成网页文件为什么结果不同?如果加了引号但是不加".xls"的话还是保存为网页格式,并不会批个xls的外壳。
2.jxl没有能力辨别这样的xls文件。。只能抛BiffException。。以后各位兄弟操作excel的时候如果抛了BiffException异常,各位可以看下是不是这个原因。。
3.有兄弟遇见过这个囧问题么?有啥解决办法么? 去客户那里了解了一下,他们这些excel是让另外一个公司做的,在网页上自动生成下载的,以后让他们一个一个另存估计要骂娘。
问题补充
要说容错性的话,除了上面碰到的这个情况。其他的抛不能读取的情况我貌似还没见到过。
如果上面的类型转换不能通过java来解决的话,只有让用户自己去另存这个唯一的办法了?sigh。。。
问题补充:
我囧。。。
半年前的东西怎么出现到这里来了。。
最后我是用Lucas Lee的做法解决的,先判断是不是OLE格式,然后如果是的话就走jxl路线,如果不是 就当处理html一样按文本方式读入解决。。很累人。。