原文地址:https://blog.csdn.net/it_wangxiangpan/article/details/42778167

我们使用POI中的HSSFWorkbook来读取Excel数据。

public void test(File file) throws IOException {InputStream inp = new FileInputStream(file);HSSFWorkbook workbook = new HSSFWorkbook(inp);// workbook...遍历操作

}

View Code

上边代码,读取Excel2003(xls)的文件没问题,但是一旦读取的是Excel2007(xlsx)的文件,就会报异常:

“The supplied data appears to be in the Office 2007+ XML. You are calling the part of POI that deals with OLE2 Office Documents.

You need to call a different part of POI to process this data (eg XSSF instead of HSSF)”

查阅了资料,Excel2007版本的Excel文件需要使用XSSFWorkbook来读取,如下:

 1
 2 public void test(File file) throws IOException {
 3
 4 InputStream inp = new FileInputStream(file);
 5
 6 XSSFWorkbook workbook = new XSSFWorkbook(inp);
 7
 8
 9 // workbook...遍历操作
10
11 }

View Code

注意:XSSFWorkbook需要额外导入poi-ooxml-3.9-sources.jar和poi-ooxml-schemas-3.9.jar。

这样,Excel2007的导入没问题了,但是导入Excel2003又报异常。

所以,在导入Excel的时候,尽量能判断导入Excel的版本,调用不同的方法。

我想到过使用文件后缀名来判断类型,但是如果有人将xlsx的后缀改为xls时,如果使用xlsx的函数来读取,结果是报错;虽然后缀名对了,但是文件内容编码等都不对。

最后,推荐使用poi-ooxml中的WorkbookFactory.create(inputStream)来创建Workbook,因为HSSFWorkbook和XSSFWorkbook都实现了Workbook接口。代码如下:

Workbook wb = WorkbookFactory.create(is);

可想而知,在WorkbookFactory.create()函数中,肯定有做过对文件类型的判断,一起来看一下源码是如何判断的:

 1 /**
 2
 3 * Creates the appropriate HSSFWorkbook / XSSFWorkbook from
 4
 5 * the given InputStream.
 6
 7 * Your input stream MUST either support mark/reset, or
 8
 9 * be wrapped as a {@link PushbackInputStream}!
10
11 */
12
13 public static Workbook create(InputStream inp) throws IOException, InvalidFormatException {
14
15 // If clearly doesn't do mark/reset, wrap up
16
17 if(! inp.markSupported()) {
18
19 inp = new PushbackInputStream(inp, 8);
20
21 }
22
23
24
25 if(POIFSFileSystem.hasPOIFSHeader(inp)) {
26
27 return new HSSFWorkbook(inp);
28
29 }
30
31 if(POIXMLDocument.hasOOXMLHeader(inp)) {
32
33 return new XSSFWorkbook(OPCPackage.open(inp));
34
35 }
36
37 throw new IllegalArgumentException("Your InputStream was neither an OLE2 stream, nor an OOXML stream");
38
39 }

View Code

可以看到,有根据文件类型来分别创建合适的Workbook对象。是根据文件的头部信息去比对进行判断的,此时,就算改了后缀名,还是一样通不过。

转载于:https://www.cnblogs.com/hm1990hpu/p/9414789.html

java 读取excel文件相关推荐

  1. java读取jsp文件内容_使用Java读取Excel文件内容

    问题:我能用Java读取一个Excel文件吗?如果能,怎么做? 回答:是的,可以用Java读取Microsoft Excel文件.微软提供了一个Excel的ODBC驱动程序,因此我们就可以使用JDBC ...

  2. 【Apache POI】Java 读取Excel文件

    Excel内容如下: 封装Excel行列字段的Bean: public class Employee {private String name;private String gender;privat ...

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

    使用 java 代码读取 excel 文件代码时报错如下: jxl.read.biff.BiffException: Unable to recognize OLE stream     at jxl ...

  4. java读取Excel文件,用JDBC导入数据到mysql

    本需求最重要的就是如何将Excel文件中的数据读取到java集合中.首先要知道Excel表格中的每行记录即为一个对象,我们可以使用操作Excel的org.apache.poi框架,对数据进行读取.首先 ...

  5. Java 读取excel文件内容插入到数据库

    Java读写Excel的包是Apache POI. JAVA EXCEL API:是一开放源码项目,通过它Java开发人员可以读取Excel文件的内容.创建新的Excel文件.更新已经存在的Excel ...

  6. Java读取Excel文件数据并将记录写入到新的文件中--POI技术实现

    1. apache poi包里有4个主要的类: Workbook----工作表,通过WorkbookFactory的create(FileInputStream fis)方法获取, Sheet---- ...

  7. java读取excel文件单元格英文出现乱码问题的解决方法

    小编今天测试读取excel文件,并且取其中的几个单元格作为文件名称的时候,发现文件名出现了乱码,毫无疑问,肯定就是读取excel的时候,取出来就出现了乱码,如图所示 excel原单元格数据,如图所示 ...

  8. Java 读取 Excel 文件内容, 根据 pdf 模板动态生成对应的 pdf 文件

    1. 下载 adobe acrobat https://www.cr173.com/soft/11135.html 2. 编辑 pdf 模板 1用 acrobat 打开 pdf 编辑模板 添加表单元素 ...

  9. Java 读取excel文件 兼容97-2013 V2.0

    注释里有struts的上传文件和Springmvc有些不一样.读写都是一样的 修复删除缓存文件占用的问题 package com.telling.cw.util.poi;import org.apac ...

  10. [JAVA] java读取Excel文件,Apache POI

    解析Excel的包很多,之前用的是jxl,但是jxl只能是解析Excel2003即office兼容版. 后来发现一个Apache的开源包,POI,这个可以处理xls和xlsx扩展名的Excel文件. ...

最新文章

  1. java动态代理【一】
  2. 【Sql server: T-Sql 技术内幕 系列】之索引篇
  3. hdu 5692 Snacks(dfs序+线段树区间更新)
  4. JS Event事件
  5. SAP CRM系统里的附件存储逻辑
  6. 后台审核管理 ergo_Kogito,ergo规则:从知识到服务,轻松自如
  7. dijkstra算法_最短路径问题——迪杰斯特拉算法(Dijkstra)
  8. java安装好了打不开机_门套安装是45度拼接还是直角好?当初不懂行,没有半年就重装!...
  9. [ 总结 ] 删除通过find查找到的文件
  10. .net 中文语音朗读
  11. 单元测试引入hsqldb探索
  12. 名称数据联网简介的翻译(计算机网络论文翻译)
  13. NTFS与FAT32区别大揭秘
  14. Gym - 101964E -Fishermen(二分+差分求前缀和)
  15. 自制Openerp图表
  16. 基础-07-八大疑问词
  17. 工业互联网+安全生产 | 面向安全生产的工业互联网解决方案
  18. 《斯坦福高效睡眠法》读书笔记思维导图版,成年人的睡眠解决法
  19. scrapy抓斗鱼主播的图片
  20. BZOJ 1778 Usaco2010 Hol Dotp 驱逐猪猡 期望DP+高斯消元

热门文章

  1. 打开桌面计算机窗口闪动,电脑进去桌面就一直闪
  2. thinkphp漏洞_【组件攻击链】ThinkCMF 高危漏洞分析与利用
  3. 关于easyui combobox下拉框实现多选框的实现
  4. mdb新版本打不开_救命!!! 我打不开她给我的Pr工程……
  5. ggplot2作图详解:映射(mapping)
  6. 一种HBase上Region级别的二级索引存储
  7. mysql数据库电话号码类型,mySQL数据库一:数据类型
  8. 人脸对齐(十三)--3DDFA
  9. linux php执行ci框架,PHP CI框架学习之路径访问
  10. 双机热备_配置BAS叠加NAT双机热备示例