java excel 兼容问题_Java之POI读取Excel的解决兼容性问题
在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的解决兼容性问题相关推荐
- poiexcel 读取引用列_java用poi读取Excel表格中的数据
Java读写Excel的包是Apache POI(项目地址:http://poi.apache.org/),因此需要先获取POI的jar包,本实验使用的是POI 3.9稳定版. Apache POI ...
- Java面试poi中excel版本大小_java 中 poi解析Excel文件版本问题解决办法
java 中 poi解析Excel文件版本问题解决办法 发布时间:2020-10-02 03:46:15 来源:脚本之家 阅读:91 作者:程诺 poi解析Excel文件版本问题解决办法 poi解析E ...
- 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 ...
- java excel 逐行读取_java利用poi读取Excel文件
java读取Excel文件,笔者认为:从结构上来看,Excel文件是由一个一个的单元格组成的,有点像细胞cell,逐行的排列.那么我们读的时候也应该逐行逐行的读,从左到右的寻找每一个cell. 直播电 ...
- java excel 电话号码_java使用poi读取excel时,电话号码变成了科学计数法,整数变成double,怎么改过来...
为了防止数字变成科学计数法方式表示,在源文件以及java代码中都用文的方式去生成和解回析excel,具体答如下: 生成Excel时,设置单元格格式为STRING,即: //关键代码 HSSFCell ...
- java excel 列数_JAVA使用POI获取Excel的列数与行数
前言 报表输出是Java应用开发中经常涉及的内容,而一般的报表往往缺乏通用性,不方便用户进行个性化编辑.Java程序由于其跨平台特性,不能直接操纵Excel.因此,本文探讨一下POI视线Java程序进 ...
- java excel 导出图片_JAVA 使用 POI 导出 EXCEL 自定义背景颜色
开发中常用表格导入和导出 Excel 是常见的功能. 在这里分享下使用 POI 导出表格的简单实现,也是为大家提供个思路吧,抛砖引玉,话不多说直接上代码. 1.项目引入 maven 依赖 <!- ...
- poi 获取excel列宽度_JAVA使用POI获取Excel的列数与行数
JAVA使用POI获取Excel的列数与行数 发布于 2020-8-19| 复制链接 Apache POI 是用Java编写的免费开源的跨平台的 Java API,Apache POI提供API给Ja ...
- java excel添加公式_Java添加、读取Excel公式
import com.spire.xls.*;public classAddFormula {public static voidmain(String[] args) {//创建Workbook对象 ...
最新文章
- Udacity机器人软件工程师课程笔记(七)-ROS介绍和Turtlesim包的使用
- session与cookie的区别
- Py之cv2:cv2库(OpenCV,opencv-python)的简介、安装、使用方法(常见函数、方法等)最强详细攻略
- CFD分析过程(CFD Analysis Process)
- 计算机编程语言的分类与python语言快速度认识
- Maven核心概念(转)
- C使用递归实现前N个元素的和
- linux分辨率 保存,linux分辨率设置方法与问题-linux分辨率的设置方法分享-linux修改分辨率的经验分享_169IT.COM...
- linux计划任务失败如何排查原因
- 如何系统学习Linux
- 钱包开发经验分享:BTC篇
- 组装台式机后进入PE,检测不到硬盘的解决方法
- CSS 选择器(超级详细,欢迎补充)
- ffmpeg命令行录制一个具有非IDR性质的I帧的视频
- 从海尔的组织结构再造看企业的组织结构
- 2022-ACS-Boosting Protein−Ligand Binding Pose Prediction and Virtual Screening Based on Residue−Atom
- java用什么测试工具_10款常用的JAVA测试工具
- cgb2110-day01
- 知乎里面别人发的视频怎么保存下来?
- 工作流引擎被各种开发语言调用的思考
热门文章
- Android简易图片管理器,一个简单仿微信朋友圈的图片查看器 PhotoViewer
- 浅谈系统从I386文件夹到longhorn封装
- 【论文笔记】—目标姿态估计—EPro-PnP—2022-CVPR
- 基于STM32采集PM2.5(ZH03B)传感器数据实验
- 手写字体识别用python实现_利用贝叶斯算法实现手写体识别(Python)
- 1-Click PC Tuneup软件-破解实录-[附加篇]编写注册机
- 金融机构电子签应用汇总:覆盖7类组织的30多种签署需求
- 数字时钟程序c语言,数字时钟C语言源程序
- 2021年化工自动化控制仪表考试试卷及化工自动化控制仪表复审考试
- windowsUbuntu双系统修改启动菜单引导顺序