在Java中,使用POI来进行excel的读取和解析是常用的一种做法;在office的excel中存在2007,2003两种不同的格式,通常情况下是以xls/xlsx的不同后缀来区分的,但用户可能不知道这个区别,所以会出现格式无法兼容的异常

1.  POI

POI源自Apache基金会,是其顶级域名项目, POI提供API给Java程序对Microsoft Office格式档案读和写的功能。

2.  Excel 2003和2007之区别

微软针对Excel在2007版本之后的实现中使用了ooxml的格式来描述内容信息,和之前2003版本的excel在实现上有所区别,故在POI中提供了一个新的类来兼容2007版的excel的读取和创建过程。

HSSF - 提供读写Microsoft Excel格式档案的功能。

XSSF - 提供读写Microsoft Excel OOXML格式档案的功能。

HSSF,XSSF的功能列表对比

3.  问题描述

在上传excel文件中,解析excel文件,并解析中出现了如下错误信息:

Apr 13, 2015 1:29:08 PM org.apache.catalina.core.StandardWrapperValve invoke

SEVERE: Servlet.service() for servlet [appServlet] in context with path [/bsettle] threw exception [Request processing failed; nested exception is org.apache.poi.POIXMLException: org.apache.poi.openxml4j.exceptions.InvalidFormatException: Package should contain a content type part [M1.13]] with root cause

org.apache.poi.openxml4j.exceptions.InvalidFormatException: Package should contain a content type part [M1.13]

at org.apache.poi.openxml4j.opc.ZipPackage.getPartsImpl(ZipPackage.java:203)

at org.apache.poi.openxml4j.opc.OPCPackage.getParts(OPCPackage.java:673)

at org.apache.poi.openxml4j.opc.OPCPackage.open(OPCPackage.java:274)

at org.apache.poi.util.PackageHelper.open(PackageHelper.java:37)

at org.apache.poi.xssf.usermodel.XSSFWorkbook.(XSSFWorkbook.java:258)

at com.creditease.bsettle.basic.controller.BasicDataController.uploadBusinessDept(BasicDataController.java:350)

at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)

at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)

at java.lang.reflect.Method.invoke(Method.java:597)

at org.springframework.web.method.support.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:215)

at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:132)

at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:104)

at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandleMethod(RequestMappingHandlerAdapter.java:745)

at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:685)

at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:80)

at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:919)

at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:851)

at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:953)

at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:855)

at javax.servlet.http.HttpServlet.service(HttpServlet.java:647)

at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:829)

at javax.servlet.http.HttpServlet.service(HttpServlet.java:728)

at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)

at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)

at org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:77)

at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:106)

at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)

at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)

at org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter.doFilterInternal(OpenEntityManagerInViewFilter.java:180)

at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:106)

at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)

at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)

at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:88)

at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:106)

at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)

at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)

at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222)

at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)

at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502)

at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)

at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)

at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:953)

at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)

at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)

at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1041)

at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:603)

at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:312)

at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)

at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)

at java.lang.Thread.run(Thread.java:662)

在用户操作过程中,上传excel之后,后台出现了上述错误;针对正常的情况下的excel是没有问题的;经过分析上传文件发现,应该是2007和2003文件格式不同导致的问题。

在原有的代码中, 解析excel的内容如下:

XSSFWorkbook hssfWorkbook = new XSSFWorkbook(file.getInputStream());

由此可知,目前的代码中只能支持Excel 2007的格式解析,而不能支持2003格式。 故此产生了异常信息.

4.  解决方案

为了解决针对excel 2003 和 excel 2007 的多种格式,使用如下代码,提供了良好的兼容性:

Workbook workbook = WorkbookFactory.create(file.getInputStream());

Sheet hssfSheet = workbook.getSheetAt(0); //示意访问sheet

这里我们使用了一个抽象类Workbook来访问所有的格式下的excel,虽然某些特性,比如2007下的内容可能无法正常读取,但是主要的内容是可以正常读取的。

5. 总结

对Excel的读取,主要涉及工作薄、工作薄、行数据、单元格等的处理,POI对97-2003和2007+两个版本的处理采用不同的类,如下图所示:

其中:

a)Workbook、Sheet、Row、Cell等为接口;

b)HSSFWorkbook、HSSFSheet、HSSFRow、HSSFCell为97-2003版本对应的处理实现类;

c)XSSFWorkbook、XSSFSheet、XSSFRow、XSSFCell为2007+版本对应的处理实现类;

java excel 兼容问题_Java之POI读取Excel的解决兼容性问题相关推荐

  1. poiexcel 读取引用列_java用poi读取Excel表格中的数据

    Java读写Excel的包是Apache POI(项目地址:http://poi.apache.org/),因此需要先获取POI的jar包,本实验使用的是POI 3.9稳定版. Apache POI ...

  2. Java面试poi中excel版本大小_java 中 poi解析Excel文件版本问题解决办法

    java 中 poi解析Excel文件版本问题解决办法 发布时间:2020-10-02 03:46:15 来源:脚本之家 阅读:91 作者:程诺 poi解析Excel文件版本问题解决办法 poi解析E ...

  3. java不用poi怎么读取excel,java-无法使用Apache POI读取Excel

    您必须包括poi jar文件.它的版本将是4.1.0.如果使用的是Maven pom.xml,请包括以下依赖项. org.apache.poi poi-ooxml 4.1.0 org.apache.p ...

  4. java excel 逐行读取_java利用poi读取Excel文件

    java读取Excel文件,笔者认为:从结构上来看,Excel文件是由一个一个的单元格组成的,有点像细胞cell,逐行的排列.那么我们读的时候也应该逐行逐行的读,从左到右的寻找每一个cell. 直播电 ...

  5. java excel 电话号码_java使用poi读取excel时,电话号码变成了科学计数法,整数变成double,怎么改过来...

    为了防止数字变成科学计数法方式表示,在源文件以及java代码中都用文的方式去生成和解回析excel,具体答如下: 生成Excel时,设置单元格格式为STRING,即: //关键代码 HSSFCell  ...

  6. java excel 列数_JAVA使用POI获取Excel的列数与行数

    前言 报表输出是Java应用开发中经常涉及的内容,而一般的报表往往缺乏通用性,不方便用户进行个性化编辑.Java程序由于其跨平台特性,不能直接操纵Excel.因此,本文探讨一下POI视线Java程序进 ...

  7. java excel 导出图片_JAVA 使用 POI 导出 EXCEL 自定义背景颜色

    开发中常用表格导入和导出 Excel 是常见的功能. 在这里分享下使用 POI 导出表格的简单实现,也是为大家提供个思路吧,抛砖引玉,话不多说直接上代码. 1.项目引入 maven 依赖 <!- ...

  8. poi 获取excel列宽度_JAVA使用POI获取Excel的列数与行数

    JAVA使用POI获取Excel的列数与行数 发布于 2020-8-19| 复制链接 Apache POI 是用Java编写的免费开源的跨平台的 Java API,Apache POI提供API给Ja ...

  9. java excel添加公式_Java添加、读取Excel公式

    import com.spire.xls.*;public classAddFormula {public static voidmain(String[] args) {//创建Workbook对象 ...

最新文章

  1. Udacity机器人软件工程师课程笔记(七)-ROS介绍和Turtlesim包的使用
  2. session与cookie的区别
  3. Py之cv2:cv2库(OpenCV,opencv-python)的简介、安装、使用方法(常见函数、方法等)最强详细攻略
  4. CFD分析过程(CFD Analysis Process)
  5. 计算机编程语言的分类与python语言快速度认识
  6. Maven核心概念(转)
  7. C使用递归实现前N个元素的和
  8. linux分辨率 保存,linux分辨率设置方法与问题-linux分辨率的设置方法分享-linux修改分辨率的经验分享_169IT.COM...
  9. linux计划任务失败如何排查原因
  10. 如何系统学习Linux
  11. 钱包开发经验分享:BTC篇
  12. 组装台式机后进入PE,检测不到硬盘的解决方法
  13. CSS 选择器(超级详细,欢迎补充)
  14. ffmpeg命令行录制一个具有非IDR性质的I帧的视频
  15. 从海尔的组织结构再造看企业的组织结构
  16. 2022-ACS-Boosting Protein−Ligand Binding Pose Prediction and Virtual Screening Based on Residue−Atom
  17. java用什么测试工具_10款常用的JAVA测试工具
  18. cgb2110-day01
  19. 知乎里面别人发的视频怎么保存下来?
  20. 工作流引擎被各种开发语言调用的思考

热门文章

  1. Android简易图片管理器,一个简单仿微信朋友圈的图片查看器 PhotoViewer
  2. 浅谈系统从I386文件夹到longhorn封装
  3. 【论文笔记】—目标姿态估计—EPro-PnP—2022-CVPR
  4. 基于STM32采集PM2.5(ZH03B)传感器数据实验
  5. 手写字体识别用python实现_利用贝叶斯算法实现手写体识别(Python)
  6. 1-Click PC Tuneup软件-破解实录-[附加篇]编写注册机
  7. 金融机构电子签应用汇总:覆盖7类组织的30多种签署需求
  8. 数字时钟程序c语言,数字时钟C语言源程序
  9. 2021年化工自动化控制仪表考试试卷及化工自动化控制仪表复审考试
  10. windowsUbuntu双系统修改启动菜单引导顺序