我导入office 2007 excel的*.xlsx文件时报错:org.apache.poi.poifs.filesystem.OfficeXmlFileException: The supplied data appears to be in the Office 2007+ XML. POI only supports OLE2 Office documents刚开始以为是jar包的问题,于是我换了poi的最新的jar包:poi-3.6-20091214.jar
可是问题依旧,我想问一下,还有什么原因会导致这个问题?怎么解决?各位高手,请指教!
/**
* 通过会员编码,导入资源
*/
@SuppressWarnings("deprecation")
public int importLinkman(String memberCode,String operatorCode,BasicAddress basicAddress) {
if (basicAddress.getFile() != null) {
String path = basicAddress.getFile().getPath();// 文件路径
HSSFWorkbook workbook = null;
HSSFSheet sheet = null;
DataInputStream dis = null;
try {
dis = new DataInputStream(new FileInputStream(path));
if (dis.available() > Constants.MAX_SIZE) {// 验证文件的大小
throw new BaseException("08030204013",
"您的excel文件太大,不能正常导入", "文件不存在");
}
workbook = new HSSFWorkbook(new FileInputStream(path)); // 得到第一个工作表
sheet = workbook.getSheetAt(0);
if (sheet == null) {
throw new BaseException(
"08030204021",
"您的excel文件不是标准模板格式," +
"不是第一个工作表,或者不是Microsoft Office的标准excel格式的文件",
"文件不存在");
}
} catch (FileNotFoundException e) {
throw new BaseException("08030204022", "文件不存在", "文件不存在");
} catch (IOException e) {
throw new BaseException("08030204023", "文件被占用,无法导入资源",
"文件被占用,无法导入资源");
} catch (Exception e) {
e.printStackTrace();
}
// 定义标准的模板的标题
String[] title = new String[] { "名称", "邮件地址", "手机", "备注" };
// 得到总行数
int rows = sheet.getPhysicalNumberOfRows();
if (rows <= 1) {// 空行,只有标题行
throw new BaseException("08030204013", "文件无数据,请核对", "文件无数据,请核对");
} else {// 有数据的行
boolean flag = false;
for (int i = 1; i < rows; i++) {
HSSFRow row = sheet.getRow(i);// 得到一行
if (row != null) {
// int cells =title.length;
int cells = row.getPhysicalNumberOfCells();// 一行的列数
if (cells > 0) {//
flag = true;
}
}
}
if (!flag) {// 表示空行
throw new BaseException("08030204013", "文件无数据,请核对", "文件不存在");
}
}
for (int r = 0; r < rows; r++) {
HSSFRow row = sheet.getRow(r);
if (row != null) {// 得到列数数据的数量
// 一行的列数
int cells = row.getPhysicalNumberOfCells();
// 获取单元格数据内容为字符串类型的数据 单元格数据内容
if (cells > 0) {// 如果CELL小于0时,表示此行为空行
// 定义一个长度为cells的数组
Object[] obj = new Object[cells];
for (short c = 0; c < cells; c++) {// 验证数据的类型
HSSFCell cell = row.getCell(c);
if (cell != null) {
switch (cell.getCellType()) {
case HSSFCell.CELL_TYPE_NUMERIC:
// 取数字单元格的值
obj[c] = (String) cell.toString();
break;
case HSSFCell.CELL_TYPE_STRING:
// 取字符单元格的值
obj[c] = (String) cell.getStringCellValue();
break;
default:
obj[c] = "";
}
}
}
if ((r == 0)) {// 第一行的标题,检测标题的是否为标准模板标题
String[] str = new String[cells];
for (int i = 0; i < obj.length; i++) {
if (null != obj[i]) {
str[i] = obj[i].toString();
} else {// 空值
str[i] = "";
}
}
if (str.length != title.length) {// 验证标题数量是否符合标准
throw new BaseException("08030204013",
"您的excel文件不是标准模板格式,标题不是标准格式,请核对",
"文件格式不对!");
}
for (int i = 0; i < title.length - 1; i++) {// 验证标题是否和标准一致
if (!str[i].trim().equals(title[i].trim())) {
throw new BaseException("08030204013",
"您的excel文件不是标准模板格式,标题不是标准格式,请核对",
"文件格式不对!");
}
}
} else {
String[] str = new String[cells];
for (int i = 0; i < obj.length; i++) {
if (null != obj[i]) {
str[i] = obj[i].toString().trim();
} else {// 空值
str[i] = "";
}
}
try {
basicAddress.setAddressName(str[0]); //姓名
basicAddress.setAddressEmail(str[1]); // 邮件地址
basicAddress.setAddressMobile(str[2]); // 手机号码
basicAddress.setAddressRe(str[3]); // 备注
this.insertAddress(memberCode, operatorCode, basicAddress);// 保存
} catch (Exception ex) {
ex.printStackTrace();
throw new BaseException("08030204018", "操作失败:",
"导入失败:Excel表第" + (r + 1) + "行第" + cells + "列出错!\n\r"
+ ex.toString());
}
}
}
}
}
return 1;
} else {
return 0;
}
}
可是问题依旧,我想问一下,还有什么原因会导致这个问题?怎么解决?各位高手,请指教!
/**
* 通过会员编码,导入资源
*/
@SuppressWarnings("deprecation")
public int importLinkman(String memberCode,String operatorCode,BasicAddress basicAddress) {
if (basicAddress.getFile() != null) {
String path = basicAddress.getFile().getPath();// 文件路径
HSSFWorkbook workbook = null;
HSSFSheet sheet = null;
DataInputStream dis = null;
try {
dis = new DataInputStream(new FileInputStream(path));
if (dis.available() > Constants.MAX_SIZE) {// 验证文件的大小
throw new BaseException("08030204013",
"您的excel文件太大,不能正常导入", "文件不存在");
}
workbook = new HSSFWorkbook(new FileInputStream(path)); // 得到第一个工作表
sheet = workbook.getSheetAt(0);
if (sheet == null) {
throw new BaseException(
"08030204021",
"您的excel文件不是标准模板格式," +
"不是第一个工作表,或者不是Microsoft Office的标准excel格式的文件",
"文件不存在");
}
} catch (FileNotFoundException e) {
throw new BaseException("08030204022", "文件不存在", "文件不存在");
} catch (IOException e) {
throw new BaseException("08030204023", "文件被占用,无法导入资源",
"文件被占用,无法导入资源");
} catch (Exception e) {
e.printStackTrace();
}
// 定义标准的模板的标题
String[] title = new String[] { "名称", "邮件地址", "手机", "备注" };
// 得到总行数
int rows = sheet.getPhysicalNumberOfRows();
if (rows <= 1) {// 空行,只有标题行
throw new BaseException("08030204013", "文件无数据,请核对", "文件无数据,请核对");
} else {// 有数据的行
boolean flag = false;
for (int i = 1; i < rows; i++) {
HSSFRow row = sheet.getRow(i);// 得到一行
if (row != null) {
// int cells =title.length;
int cells = row.getPhysicalNumberOfCells();// 一行的列数
if (cells > 0) {//
flag = true;
}
}
}
if (!flag) {// 表示空行
throw new BaseException("08030204013", "文件无数据,请核对", "文件不存在");
}
}
for (int r = 0; r < rows; r++) {
HSSFRow row = sheet.getRow(r);
if (row != null) {// 得到列数数据的数量
// 一行的列数
int cells = row.getPhysicalNumberOfCells();
// 获取单元格数据内容为字符串类型的数据 单元格数据内容
if (cells > 0) {// 如果CELL小于0时,表示此行为空行
// 定义一个长度为cells的数组
Object[] obj = new Object[cells];
for (short c = 0; c < cells; c++) {// 验证数据的类型
HSSFCell cell = row.getCell(c);
if (cell != null) {
switch (cell.getCellType()) {
case HSSFCell.CELL_TYPE_NUMERIC:
// 取数字单元格的值
obj[c] = (String) cell.toString();
break;
case HSSFCell.CELL_TYPE_STRING:
// 取字符单元格的值
obj[c] = (String) cell.getStringCellValue();
break;
default:
obj[c] = "";
}
}
}
if ((r == 0)) {// 第一行的标题,检测标题的是否为标准模板标题
String[] str = new String[cells];
for (int i = 0; i < obj.length; i++) {
if (null != obj[i]) {
str[i] = obj[i].toString();
} else {// 空值
str[i] = "";
}
}
if (str.length != title.length) {// 验证标题数量是否符合标准
throw new BaseException("08030204013",
"您的excel文件不是标准模板格式,标题不是标准格式,请核对",
"文件格式不对!");
}
for (int i = 0; i < title.length - 1; i++) {// 验证标题是否和标准一致
if (!str[i].trim().equals(title[i].trim())) {
throw new BaseException("08030204013",
"您的excel文件不是标准模板格式,标题不是标准格式,请核对",
"文件格式不对!");
}
}
} else {
String[] str = new String[cells];
for (int i = 0; i < obj.length; i++) {
if (null != obj[i]) {
str[i] = obj[i].toString().trim();
} else {// 空值
str[i] = "";
}
}
try {
basicAddress.setAddressName(str[0]); //姓名
basicAddress.setAddressEmail(str[1]); // 邮件地址
basicAddress.setAddressMobile(str[2]); // 手机号码
basicAddress.setAddressRe(str[3]); // 备注
this.insertAddress(memberCode, operatorCode, basicAddress);// 保存
} catch (Exception ex) {
ex.printStackTrace();
throw new BaseException("08030204018", "操作失败:",
"导入失败:Excel表第" + (r + 1) + "行第" + cells + "列出错!\n\r"
+ ex.toString());
}
}
}
}
}
return 1;
} else {
return 0;
}
}
解决方案 »
- Hibernate问题
- 从数据库取出image文件保存到InputStream,保存回数据库的时候报错
- iframe中排版在最后的按钮提交后,要弹出一个新窗口,可是iframe中的数据会自动回到显示第一行,究竟是怎么回事,请帮忙!!!
- 关于记录集的问题,页面关闭时如何关闭数据库连接
- 如何使用telnet和ftp?100分
- 各位大虾们,帮个忙,一个读文件的问题,来者有分
- jbuilder生成的文件脱离jbuilder环境如何使用?
- Java中调用C++的组件,怎么实现啊?
- 有什么比较简单办法使double型的数据变成如2,000,000.00的格式?在线等候!!!
- jsp出错:a null object.
- S2SH与jspsmart冲突?急!!!
- 紧急救命啊!!!在线急等!!!求JSP高手救命!!!
我看不懂耶?
还有二楼的那个网址,根本就没有关于excel导入问题的描述.
昨天测试发现了一个新的情况,就是单独把poi的jar包,拿出来测试就能读xlsx文件.
但是放进我的工程里面就不行了,提示:
Exception in thread "main" org.apache.poi.POIXMLException: java.lang.reflect.InvocationTargetException
我的工程是用jboss的,是不是jboss的jar包与poi的jar包有冲突?
而是没有装xmlbeans-current.zip的包
把
jsr173_1.0_api.jar
rasolver.jar
xbean.jar
xbean_xpath.jar
xmlbeans-qname.jar
xmlpublic.jar
复制到你的项目下即可!
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;读2003是用的HSSFWorkbook 2007是XSSFWorkbook 他们公用一个借口 提前判断下就行了