我导入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;
}
}

解决方案 »

  1.   

    poi最新版本好像支持xlsx 1的格式,2就不行了
      

  2.   

    什么叫xlsx 1什么是xlsx 2?
    我看不懂耶?
    还有二楼的那个网址,根本就没有关于excel导入问题的描述.
      

  3.   

    微软xlsx和docx都有2个版本。这个我也是在poi官网上看到的。
      

  4.   

    下新版本的poi-3.6-20091214.jar,就能支持office2007啦
      

  5.   

    你没看见我已经说过,我用了最新版本了吗?!
    昨天测试发现了一个新的情况,就是单独把poi的jar包,拿出来测试就能读xlsx文件.
    但是放进我的工程里面就不行了,提示:
    Exception in thread "main" org.apache.poi.POIXMLException: java.lang.reflect.InvocationTargetException
    我的工程是用jboss的,是不是jboss的jar包与poi的jar包有冲突?
      

  6.   

    那一定是有问题了,肯定是冲突了。还是检查一下jboss吧。
      

  7.   

    有可能是包冲突的问题。 检查下LIB下的包
      

  8.   

    问题原因找到了,不是jar包冲突的原因.
    而是没有装xmlbeans-current.zip的包

    jsr173_1.0_api.jar
    rasolver.jar
    xbean.jar
    xbean_xpath.jar
    xmlbeans-qname.jar
    xmlpublic.jar
    复制到你的项目下即可!
      

  9.   

    import org.apache.poi.hssf.usermodel.HSSFWorkbook;
    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 他们公用一个借口 提前判断下就行了