jxl读取excel文件异常:Unable to recognize OLE stream 的解决方法

问题成因

  1. 使用jxl方式读取,可能只能支持xls格式的文件,对于xlsx格式就不再支持
  2. 如果是从网站导出的excel文件,有的网站比较坑,导出的并不是标准格式的excel,而是将html改扩展名为xls的“伪”excel文件。当用excel打开这类文件时,会弹窗提示其“扩展名和文件类型不匹配”是否还要打开。 而且,使用文本编辑器打开,会发现这个所谓xls文件其实是xml标签的文件。

解决方法

在excel中打开,另存成xls就可以。

但当文件比较多时,可以使用excel vba批量另存

第一种情况直接用vba批量另存即可,但第二种略有麻烦,因为会有报错弹窗,vba运行时会报错。

下面以第二种情况为例详细说明解决步骤。

首先,需要禁止excel的报错弹窗,否则使用vba批量另存时会出错。方法如下:

 1 1、开始 -> 运行 -> 输入regedit -> 确定
 2 2、找到注册表子项
 3
 4 HKEY_CURRENT_USER\Software\Microsoft\Office\12.0\Excel\Security
 5
 6 3、在右侧空白处点击鼠标右键,选择“新建 -> DWORD值(D)”,输入"ExtensionHardening"点击确定。
 7 4、用鼠标右键点击ExtensionHardening,然后单击“修改(M)”,在数值数据中填写"0"即可确定。
 8 5、关闭注册表编辑器,再次打开xls文件看看是不是提示是不是不见了?
 9
10 【拓展:ExtensionHardening设置的值的数据设置含义】
11 0:不检查文件扩展名和文件类型并绕过该函数的警告消息。
12 1:检查文件扩展名和文件类型。如果它们不匹配会显示警告消息。
13 2:检查文件扩展名和文件类型。如果它们不匹配不要打开该文件。

然后我们就可以使用vba批量另存了。

调出vba窗口的方法:新建一个excel文件,按ALT+F11, 接着按住ALT依次按i,m键

vba代码如下:

 1 Private Sub Workbook_Open()
 2 Application.ScreenUpdating = False
 3 Dim fp$, fn$
 4 fp = "D:\test" & "\"
 5 fn = Dir(fp & "*.xls")
 6 Do While fn <> ""
 7     If fn <> ThisWorkbook.Name Then
 8         Workbooks.Open fp & fn
 9         Application.DisplayAlerts = False
10         ActiveWorkbook.SaveAs fp & fn & "-new.xls", xlExcel8
11         Application.DisplayAlerts = True
12         ActiveWorkbook.Close True
13     End If
14     fn = Dir
15 Loop
16 Application.ScreenUpdating = False
17 MsgBox "本文件夹内的所有Excel文件打开另存完毕!"
18 End Sub

使用时根据自身情况,修改文件夹路径。另外,在另存为的时候,这里给所有文件名加上了-new的后缀,可以根据自己需要修改。



通过以上方法另存之后,“伪excel”文件便成为真正的excel的xls格式文件了,此时在使用java jxl来操作excel便不会有问题了。

原文地址:https://www.cnblogs.com/AI-xiaocai/p/11730179.html

时间: 2024-10-07 05:59:13

jxl读取excel文件异常:Unable to recognize OLE stream 的解决方法的相关文章

java 读取excel 文件 Unable to recognize OLE stream 错误

使用 Java 代码读取 excel 文件代码时报错如下: 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.jav

jxl.read.biff.BiffException: Unable to recognize OLE stream异常

java代码读取excel文件时报: 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)    a

Java——jxl读取Excel文件

1.创建文件流,打开EXCEL文件(jxi不支持.xlsx文件,支持.xls) FileInputStream excelFile = new FileInputStream(excelPath); Workbook workbook = Workbook.getWorkbook(excelFile); 2.切换到对应文件名 Sheet excelSheet = workbook.getSheet(sheetName); 3.获取实际行数和列数 int rows = excelSheet.get

使用jxl,poi读取excel文件

作用:在java后台添加一个方法,读取导入的excel内容,根据需要返回相应的sql语句,以完成对临时表的插入操作. 使用jxl读取excel文件 package com.sixthf.bi.sapp.util; import java.io.IOException; import java.io.InputStream; import jxl.Sheet; import jxl.Workbook; import jxl.read.biff.BiffException; import org.a

Java通过jxl读取Excel

package com.hd.all.test.testjava; import java.io.File; import java.io.IOException; import java.util.regex.Matcher; import java.util.regex.Pattern; import jxl.Cell; import jxl.Sheet; import jxl.Workbook; import jxl.read.biff.BiffException; import jxl.

利用jxl读取excel合并的单元格的一个小例子

工作中我们可能要把Excel文件的记录保存到数据库, 今天我用jxl读取Excel文件时遇到了合并格的问题,记录如下: 如Excel文件如下: 读取出来的记录为: 由上图可以看出,合并的单元格只有第一次输出了,这样的话,在保存数据 到数据库时就会有数据遗漏,所以做了一定的改造,代码如下: package temp; import java.io.File; import java.io.IOException; import jxl.Range; import jxl.Sheet; import

读取Excel文件写入数据库 Mybatis , POI , JXL

废话不多说,直接上代码结构图 所用到的lib包 Students 实体类 package com.test.model; public class Students { private int id; private String username; private int age; private int salary; public int getId() { return id; } public void setId(int id) { this.id = id; } public St

Java通过jxl解析Excel文件入库,及日期格式处理方式 (附源代码)

JAVA可以利用jxl简单快速的读取文件的内容,但是由于版本限制,只能读取97-03  xls格式的Excel. 本文是项目中用到的一个实例,先通过上传xls文件(包含日期),再通过jxl进行读取上传的xls文件(文件格式见下user.xls),解析不为空的行与列,写入数据库. 文件user.xls格式为: 下面来看代码实例演示: 一.前端jsp页面(本来内容很多,这里精简了) <%@ page language="java" contentType="text/htm

jxl导出Excel文件

一.java项目实现读取Excel文件和导出Excel文件 实现读取和导出Excel文件的代码: package servlet; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.text.SimpleDateFormat;