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