上传Excel文件出错 提示这样说:java 文件上传传出错!错误原因:The supplied data

66596人阅读
J2EE(33)
   首先大家先了解一下以下内容:引用 
    java解析Excel(兼容)
刚开始从网上找了个例子使用new HSSFWorkbook(new FileInputStream(excelFile))来读取Workbook,
对Excel2003以前(包括2003)的版本没有问题,但读取Excel2007时发生如下异常:
org.apache.poi.poifs.filesystem.OfficeXmlFileException: 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
&&&&&&& 该错误意思是说,文件中的数据是用Office2007+XML保存的,而现在却调用OLE2 Office文档处理,应该使用POI不同的部分来处理这些数据,比如使用XSSF来代替HSSF。
&&&&&&& 于是按提示使用XSSF代替HSSF,用new XSSFWorkbook(excelFile)来读取Workbook,对Excel2007没有问题了,可是在读取Excel2003以前(包括2003)的版本时却发生了如下新异常:
org.apache.poi.openxml4j.exceptions.InvalidOperationException: Can't open the specified file: '*.xls'
&&&&&&& 该错误是说,操作无效,不能打开指定的xls文件。
&&&&&&& 到网上查了下,原来是XSSF不能读取Excel2003以前(包括2003)的版本,这样的话,就需要在读取前判断文件是2003前的版本还是2007的版本,然后对应调用HSSF或XSSF来读取。
&&&&&&& 这种做法比较麻烦,看了下API,发现XSSF和HSSF虽然在不同的包里,但却引用了同一接口Workbook,于是想到了这样的读取方法:
&&&&&&& Workbook book =
&&&&&&& try {
&&&&&&&&&&& book = new XSSFWorkbook(excelFile);
&&&&&&& } catch (Exception ex) {
&&&&&&&&&&& book = new HSSFWorkbook(new FileInputStream(excelFile));
本认为程序应该没错了吧,但一运行还是报错(当时用得是poi3.6的zip包):
java.lang.ClassNotFoundException: org.openxmlformats.schemas.spreadsheetml.x2006.main.CTSheet
网上搜了下,是少poi-ooxml-schemas-xxx.jar包,根据提示在Apache网站上(/apache-mirror//poi/release/bin/)下载了3.7的zip文件(poi-bin-3.7-.zip),解压后将poi相关的包和xml相关的包都放上去。
在各版本的Excel中测试,没有发生异常,问题解决。
下面是POI的API网址,不过是英文的:
POI API Documentation
   转入正题:以下是代码,代码也是从别人的代码拿过来的,其中修改了部分
package com.
import java.io.F
import java.io.FileInputS
import java.io.IOE
import java.io.InputS
import java.util.ArrayL
import java.util.L
import org.apache.poi.hssf.usermodel.HSSFC
import org.apache.poi.hssf.usermodel.HSSFW
import org.apache.poi.ss.usermodel.C
import org.apache.poi.ss.usermodel.R
import org.apache.poi.ss.usermodel.S
import org.apache.poi.ss.usermodel.W
import org.apache.poi.xssf.usermodel.XSSFW
* @描述:测试excel读取
导入的jar包
poi-3.8-beta3-.jar
poi-ooxml-3.8-beta3-.jar
poi-examples-3.8-beta3-.jar
poi-excelant-3.8-beta3-.jar
poi-ooxml-schemas-3.8-beta3-.jar
poi-scratchpad-3.8-beta3-.jar
xmlbeans-2.3.0.jar
dom4j-1.6.1.jar
jar包官网下载地址:http://poi.apache.org/download.html
下载poi-bin-3.8-beta3-.zipp
* @作者:建宁
* @时间: 下午16:27:15
public class ImportExecl
/** 总行数 */
private int totalRows = 0;
/** 总列数 */
private int totalCells = 0;
/** 错误信息 */
private String errorI
/** 构造方法 */
public ImportExecl()
* @描述:得到总行数
* @作者:建宁
* @时间: 下午16:27:15
* @参数:@return
* @返回值:int
public int getTotalRows()
return totalR
* @描述:得到总列数
* @作者:建宁
* @时间: 下午16:27:15
* @参数:@return
* @返回值:int
public int getTotalCells()
return totalC
* @描述:得到错误信息
* @作者:建宁
* @时间: 下午16:27:15
* @参数:@return
* @返回值:String
public String getErrorInfo()
return errorI
* @描述:验证excel文件
* @作者:建宁
* @时间: 下午16:27:15
* @参数:@param filePath 文件完整路径
* @参数:@return
* @返回值:boolean
public boolean validateExcel(String filePath)
/** 检查文件名是否为空或者是否是Excel格式的文件 */
if (filePath == null || !(WDWUtil.isExcel2003(filePath) || WDWUtil.isExcel2007(filePath)))
errorInfo = &文件名不是excel格式&;
/** 检查文件是否存在 */
File file = new File(filePath);
if (file == null || !file.exists())
errorInfo = &文件不存在&;
* @描述:根据文件名读取excel文件
* @作者:建宁
* @时间: 下午16:27:15
* @参数:@param filePath 文件完整路径
* @参数:@return
* @返回值:List
public List&List&String&& read(String filePath)
List&List&String&& dataLst = new ArrayList&List&String&&();
InputStream is =
/** 验证文件是否合法 */
if (!validateExcel(filePath))
System.out.println(errorInfo);
/** 判断文件的类型,是2003还是2007 */
boolean isExcel2003 =
if (WDWUtil.isExcel2007(filePath))
isExcel2003 =
/** 调用本类提供的根据流读取的方法 */
File file = new File(filePath);
is = new FileInputStream(file);
dataLst = read(is, isExcel2003);
is.close();
catch (Exception ex)
ex.printStackTrace();
if (is != null)
is.close();
catch (IOException e)
e.printStackTrace();
/** 返回最后读取的结果 */
return dataL
* @描述:根据流读取Excel文件
* @作者:建宁
* @时间: 下午16:40:15
* @参数:@param inputStream
* @参数:@param isExcel2003
* @参数:@return
* @返回值:List
public List&List&String&& read(InputStream inputStream, boolean isExcel2003)
List&List&String&& dataLst =
/** 根据版本选择创建Workbook的方式 */
Workbook wb =
if (isExcel2003)
wb = new HSSFWorkbook(inputStream);
wb = new XSSFWorkbook(inputStream);
dataLst = read(wb);
catch (IOException e)
e.printStackTrace();
return dataL
* @描述:读取数据
* @作者:建宁
* @时间: 下午16:50:15
* @参数:@param Workbook
* @参数:@return
* @返回值:List&List&String&&
private List&List&String&& read(Workbook wb)
List&List&String&& dataLst = new ArrayList&List&String&&();
/** 得到第一个shell */
Sheet sheet = wb.getSheetAt(0);
/** 得到Excel的行数 */
this.totalRows = sheet.getPhysicalNumberOfRows();
/** 得到Excel的列数 */
if (this.totalRows &= 1 && sheet.getRow(0) != null)
this.totalCells = sheet.getRow(0).getPhysicalNumberOfCells();
/** 循环Excel的行 */
for (int r = 0; r & this.totalR r++)
Row row = sheet.getRow(r);
if (row == null)
List&String& rowLst = new ArrayList&String&();
/** 循环Excel的列 */
for (int c = 0; c & this.getTotalCells(); c++)
Cell cell = row.getCell(c);
String cellValue = &&;
if (null != cell)
// 以下是判断数据的类型
switch (cell.getCellType())
case HSSFCell.CELL_TYPE_NUMERIC: // 数字
cellValue = cell.getNumericCellValue() + &&;
case HSSFCell.CELL_TYPE_STRING: // 字符串
cellValue = cell.getStringCellValue();
case HSSFCell.CELL_TYPE_BOOLEAN: // Boolean
cellValue = cell.getBooleanCellValue() + &&;
case HSSFCell.CELL_TYPE_FORMULA: // 公式
cellValue = cell.getCellFormula() + &&;
case HSSFCell.CELL_TYPE_BLANK: // 空值
cellValue = &&;
case HSSFCell.CELL_TYPE_ERROR: // 故障
cellValue = &非法字符&;
cellValue = &未知类型&;
rowLst.add(cellValue);
/** 保存第r行的第c列 */
dataLst.add(rowLst);
return dataL
* @描述:main测试方法
* @作者:建宁
* @时间: 下午17:12:15
* @参数:@param args
* @参数:@throws Exception
* @返回值:void
public static void main(String[] args) throws Exception
ImportExecl poi = new ImportExecl();
// List&List&String&& list = poi.read(&d:/aaa.xls&);
List&List&String&& list = poi.read(&c:/book.xlsx&);
if (list != null)
for (int i = 0; i & list.size(); i++)
System.out.print(&第& + (i) + &行&);
List&String& cellList = list.get(i);
for (int j = 0; j & cellList.size(); j++)
// System.out.print(&
第& + (j + 1) + &列值:&);
System.out.print(&
& + cellList.get(j));
System.out.println();
* @描述:工具类
* @作者:建宁
* @时间: 下午16:30:40
class WDWUtil
* @描述:是否是2003的excel,返回true是2003
* @作者:建宁
* @时间: 下午16:29:11
* @参数:@param filePath 文件完整路径
* @参数:@return
* @返回值:boolean
public static boolean isExcel2003(String filePath)
return filePath.matches(&^.+\\.(?i)(xls)$&);
* @描述:是否是2007的excel,返回true是2007
* @作者:建宁
* @时间: 下午16:28:20
* @参数:@param filePath 文件完整路径
* @参数:@return
* @返回值:boolean
public static boolean isExcel2007(String filePath)
return filePath.matches(&^.+\\.(?i)(xlsx)$&);
 算吧!  我把我的源码也放上—— 哈哈
&&&&&&&&&&&
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:761334次
积分:6308
积分:6308
排名:第3978名
原创:46篇
转载:45篇
评论:719条
(1)(2)(1)(1)(2)(4)(2)(3)(2)(1)(2)(3)(2)(6)(3)(1)(1)(9)(7)(3)(6)(7)(9)(10)(1)(1)(1)java解析excel2003和excel2007:The supplied data appears to be in the office 2007+XML Polonly supports OLE2 office documents
来源:博客园
上传excel解析存到数据库时报:org.apache.poi.poifs.filesystem.OfficeXmlFileException: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)该错误意思是说,文件中的数据是用Office2007+XML保存的,而现在却调用OLE2 Office文档处理,应该使用POI不同的部分来处理这些数据,比如使用XSSF来代替HSSF。断点跟踪到:new HSSFWorkbook(file.getInputStream)出错,在网上找了很多方法,都不行,最后在一个犄角旮旯里找到如下方法Workbook wb=WorkbookFactory.create(file.getInputStream);
用的maven依赖(版本号最好一致,否则容易出错)&dependency&
&groupId&org.apache.poi&/groupId&
&artifactId&poi&/artifactId&
&version&3.14-beta1&/version&&/dependency&&dependency&
&groupId&org.apache.poi&/groupId&
&artifactId&poi-ooxml&/artifactId&
&version&3.14-beta1&/version&
&/dependency&
&dependency&
&groupId&org.apache.poi&/groupId&
&artifactId&poi-ooxml-schemas&/artifactId&
&version&3.14-beta1&/version&
&/dependency&
原文网址:: springmvc上传excel解析存到数据库原文博客:將原博客以下方法稍作了修改。public List&Customer& getExcelInfo(String fileName, MultipartFile Mfile) {
List&Customer& customerList = new ArrayList&Customer&();
// 验证文件名是否合格
if (!validateExcel(fileName)) {
return null;
} catch (Exception e) {
e.printStackTrace();
// 根据文件名判断文件是2003版本还是2007版本
boolean isExcel2003 = true;
if (WDWUtil.isExcel2007(fileName)) {
isExcel2003 = false;
customerList = getExcelInfo(Mfile.getInputStream(), isExcel2003);
} catch (IOException e) {
e.printStackTrace();
return customerL}
免责声明:本站部分内容、图片、文字、视频等来自于互联网,仅供大家学习与交流。相关内容如涉嫌侵犯您的知识产权或其他合法权益,请向本站发送有效通知,我们会及时处理。反馈邮箱&&&&。
学生服务号
在线咨询,奖学金返现,名师点评,等你来互动POI导入2007EXCEL中遇到的文件描述符错误的问题 -
- ITeye博客
博客分类:
在导入07excel的时候出现的一个异常,错误的文件描述符或者报bad file descriptor
java.io.IOException: Bad file descriptor
at java.io.FileInputStream.readBytes(Native Method) at java.io.FileInputStream.read(FileInputStream.java:177) at org.apache.poi.util.IOUtils.copy(IOUtils.java:85) at org.apache.poi.util.PackageHelper.open(PackageHelper.java:50) at org.apache.poi.xssf.usermodel.XSSFWorkbook.(XSSFWorkbook.java:176) at com.kedacom.shop.web.action.DbWatchAction.main(DbWatchAction.java:464)
测试代码如下:
public static void main(String[] args) throws IOException {
File f = new File("/root/Desktop/111.xlsx");
InputStream is = new FileInputStream(f);
if (is != null) {
Workbook book =
book = (Workbook) new HSSFWorkbook(is);
} catch (Exception ex) {
//book = new XSSFWorkbook(is);//这里提供的这个输入流的构造方法一直报错,改为path之后就ok了
book = new XSSFWorkbook("/root/Desktop/111.xlsx");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
is.close();
Jabbar2011
浏览: 110876 次
来自: 上海
谢谢了 ,参看你的文章解决,我知道了easyui-tree怎么 ...
谢谢分享,我的问题解决了,把,idField:& & ...
这个挺好JavaScript实现input输入框控件只允许输入 ...
怼烎吢丕 写道不写idField 确实能获取到行数是对的 va ...
不写idField 确实能获取到行数是对的 var rows查看: 23653|回复: 6
打开文件时出错提示:初始化VBA库(2)出错
阅读权限20
在线时间 小时
& & & & & & & &
打开文件时,出现下面的错误,怎么办阿。
document.body.clientWidth*0.5) {this.resized=this.width=document.body.clientWidth*0.5;this.style.cursor='pointer';} else {this.onclick=null}" alt="" />
(122.71 KB, 下载次数: 64)
11:28 上传
打开文件时出错提示:初始化VBA库(2)出错
阅读权限20
在线时间 小时
& & & & & & & &
我到别的机子上同样打不开,各位大虾救命啊。
阅读权限95
在线时间 小时
我也遇到过这种问题,最后还是重新安装Office
阅读权限10
在线时间 小时
将:C:\Documents and Settings\Administrator(也就是用户名)\Application Data\Microsoft\Excel
里面的Excel11,删除即可解决。
阅读权限10
在线时间 小时
mailgaoyan 发表于
将:C:\Documents and Settings\Administrator(也就是用户名)\Application Data\Microsoft\Excel
里面的 ...
我的里面没有这个EXCE11。打开时就是这种情况
阅读权限10
在线时间 小时
同样的事情,我也遇到过,我用的方法是打开excel表格,另存为就行了。删除excel11,重装office,我当时试了都没起作用。可能vba(2)出问题情况不同吧~
阅读权限20
在线时间 小时
我用以上两个方法均不好用啊
这是为什么啊
我的是有个宏
提示未找到宏
初始化VBA库出错(4040)
最新热点 /2
京东ExcelHome部分图书,每满100减30,可叠加使用满150减50优惠券,叠券后相当于满300减140。活动日期,即日起至9月18日。
ExcelHome每周都有线上直播公开课,
国内一流讲师真身分享,高手贴身答疑,
赶不上直播还能看录像,
关键居然是免费的!
厚木哥们都已经这么努力了,
你还好意思说学不好Office。
玩命加载中,请稍候
玩命加载中,请稍候
Powered by
本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任! & & 本站特聘法律顾问:徐怀玉律师 李志群律师

我要回帖

更多关于 文件上传 的文章

 

随机推荐