zoukankan      html  css  js  c++  java
  • The supplied data appears to be in the Office 2007+ XML

    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

  • 相关阅读:
    用两个栈实现队列
    重建二叉树
    从尾到头打印链表
    替换空格
    字符串比较
    二维数组的查找
    ORACLE---Unit01: 数据库原理 、 SQL(DDL、DML)
    [Python]小甲鱼Python视频第035课(图形用户界面入门:EasyGui)课后题及参考解答
    [Python]小甲鱼Python视频第032课(异常处理:你不可能总是对的)课后题及参考解答
    [Python]小甲鱼Python视频第030课(文件系统:介绍一个高大上的东西)课后题及参考解答
  • 原文地址:https://www.cnblogs.com/hzcya1995/p/13313887.html
Copyright © 2011-2022 走看看