您的位置:首页 > 移动开发

The supplied data appears to be in the Office 2007+ XML

2017-04-16 18:19 1401 查看
1、错误描述
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)
at org.apache.poi.poifs.storage.HeaderBlock.<init>(HeaderBlock.java:152)
at org.apache.poi.poifs.storage.HeaderBlock.<init>(HeaderBlock.java:140)
at org.apache.poi.poifs.filesystem.NPOIFSFileSystem.<init>(NPOIFSFileSystem.java:302)
at org.apache.poi.poifs.filesystem.POIFSFileSystem.<init>(POIFSFileSystem.java:87)
at com.you.print.ExcelUtils.replaceModel(ExcelUtils.java:20)
at com.you.print.TestReplaceExcel.main(TestReplaceExcel.java:28)
2、错误原因
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)
at org.apache.poi.poifs.storage.HeaderBlock.<init>(HeaderBlock.java:152)
at org.apache.poi.poifs.storage.HeaderBlock.<init>(HeaderBlock.java:140)
at org.apache.poi.poifs.filesystem.NPOIFSFileSystem.<init>(NPOIFSFileSystem.java:302)
at org.apache.poi.poifs.filesystem.POIFSFileSystem.<init>(POIFSFileSystem.java:87)
at com.you.print.ExcelUtils.replaceModel(ExcelUtils.java:20)
at com.you.print.TestReplaceExcel.main(TestReplaceExcel.java:28)

/**
*
*/
package com.you.print;

import java.util.ArrayList;
import java.util.List;

/**
* @author Administrator
*
*/
public class TestReplaceExcel
{
/**
* @param args
*/
public static void main(String[] args)
{
List<ReplaceExcelData> list = new ArrayList<ReplaceExcelData>();
ReplaceExcelData red = new ReplaceExcelData();
red.setColumn(2);
red.setRow(6);
red.setKey("1");
red.setValue("111111");
list.add(red);

ExcelUtils.replaceModel(list, "D:\\myeclipseworkspces\\Print\\model\\WeightBill.xlsx", "D:\\myeclipseworkspces\\Print\\model\\Bill.xlsx");
}

}

package com.you.print;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.util.List;

import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.poifs.filesystem.POIFSFileSystem;

public class ExcelUtils
{
public static boolean replaceModel(List<ReplaceExcelData> datas, String sourceFilePath, String targetFilePath)
{
boolean bool = true;
try
{
POIFSFileSystem fs =new POIFSFileSystem(new FileInputStream(sourceFilePath));
HSSFWorkbook wb = new HSSFWorkbook(fs);
HSSFSheet sheet = wb.getSheetAt(0);

for (ReplaceExcelData data : datas) {
//获取单元格内容
HSSFRow row = sheet.getRow(data.getRow());
HSSFCell cell = row.getCell((short)data.getColumn());
String str = cell.getStringCellValue();

//替换单元格内容
str = str.replace(data.getKey(), data.getValue());

//写入单元格内容
cell.setCellType(HSSFCell.CELL_TYPE_STRING);
cell.setCellValue(str);
}

// 输出文件
FileOutputStream fileOut = new FileOutputStream(targetFilePath);
wb.write(fileOut);
fileOut.close();

}
catch (Exception e)
{
bool = false;
e.printStackTrace();
}
return bool;
}
}
关键问题的原因还是excel2003和excel2007版本的问题

3、解决办法
(1)判断文件后缀名是xls,还是xlsx
(2)如果是xls,使用HSSFWorkbook;如果是xlsx,使用XSSFWorkbook
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐