【问题标题】:Getting Exception(org.apache.poi.openxml4j.exception - no content type [M1.13]) when reading xlsx file using Apache POI?使用 Apache POI 读取 xlsx 文件时出现异常(org.apache.poi.openxml4j.exception - 无内容类型 [M1.13])?
【发布时间】:2011-07-20 07:20:54
【问题描述】:

我正在使用 Apache POI(XSSF API) 读取 xlsx 文件。当我尝试读取文件时。我收到以下错误:

org.apache.poi.POIXMLException: org.apache.poi.openxml4j.exceptions.InvalidFormatException: Package should contain a content type part [M1.13]

代码:

public class ReadXLSX
{
private String filepath;
private XSSFWorkbook workbook;
private static Logger logger=null;
private  InputStream resourceAsStream;

public ReadXLSX(String FilePath)
{
    logger=LoggerFactory.getLogger("ReadXLSX");
    this.filepath=FilePath;
    resourceAsStream = ClassLoader.getSystemResourceAsStream(filepath);
}

public ReadXLSX(InputStream fileStream)
{ 
    logger=LoggerFactory.getLogger("ReadXLSX");
    this.resourceAsStream=fileStream;
}
private void loadFile() throws FileNotFoundException, NullObjectFoundException
{
    if(resourceAsStream==null)
        throw new FileNotFoundException("Unable to locate give file..");
    else
    {
        try
        {
           workbook = new XSSFWorkbook(resourceAsStream);
        }
        catch(IOException ex)
        {
        }
    }
}// end loadxlsFile

public String[] getSheetsName()
{
   int totalsheet=0;int i=0;
   String[] sheetName=null;

    try {
        loadFile();
        totalsheet=workbook.getNumberOfSheets();
        sheetName=new String[totalsheet];
        while(i<totalsheet)
        {
           sheetName[i]=workbook.getSheetName(i);
           i++;
        }

    } catch (FileNotFoundException ex) {
       logger.error(ex);
    } catch (NullObjectFoundException ex) {
          logger.error(ex);
    }

   return sheetName;
}


public int[] getSheetsIndex()
{
   int totalsheet=0;int i=0;
   int[] sheetIndex=null;
    String[] sheetname=getSheetsName();
    try {
        loadFile();
        totalsheet=workbook.getNumberOfSheets();
        sheetIndex=new int[totalsheet];
        while(i<totalsheet)
        {
           sheetIndex[i]=workbook.getSheetIndex(sheetname[i]);
           i++;
        }

    } catch (FileNotFoundException ex) {
       logger.error(ex);
    } catch (NullObjectFoundException ex) {
          logger.error(ex);
    }

   return  sheetIndex;
}


private boolean validateIndex(int index)
{    
    if(index < getSheetsIndex().length && index >=0)
         return true;
    else
         return false;
}


public int getNumberOfSheet()
{
    int totalsheet=0;
    try {
        loadFile();
        totalsheet=workbook.getNumberOfSheets();

    } catch (FileNotFoundException ex) {
         logger.error(ex.getMessage());
    } catch (NullObjectFoundException ex) {
         logger.error(ex.getMessage());
    }

    return totalsheet;
    }

public int getNumberOfColumns(int SheetIndex)
{
    int NO_OF_Column=0;XSSFCell cell = null;
    XSSFSheet sheet=null;
            try {
                loadFile();  //load give Excel
                if(validateIndex(SheetIndex))
                {
                    sheet  = workbook.getSheetAt(SheetIndex);
                    Iterator rowIter = sheet.rowIterator();
                    XSSFRow firstRow = (XSSFRow) rowIter.next();
                    Iterator cellIter = firstRow.cellIterator();
                    while(cellIter.hasNext())
                    {
                          cell = (XSSFCell) cellIter.next();
                          NO_OF_Column++;
                    }
                }
                else
                    throw new InvalidSheetIndexException("Invalid sheet index.");
            } catch (Exception ex) {
                logger.error(ex.getMessage());

            }

    return NO_OF_Column;
}


public int getNumberOfRows(int SheetIndex)
{
        int NO_OF_ROW=0; XSSFSheet sheet=null;

        try {
                loadFile();  //load give Excel
               if(validateIndex(SheetIndex))
               {
                 sheet  = workbook.getSheetAt(SheetIndex);
                 NO_OF_ROW = sheet.getLastRowNum();
               }
               else
                    throw new InvalidSheetIndexException("Invalid sheet index.");
            } catch (Exception ex) {
                logger.error(ex);}

    return NO_OF_ROW;
}



 public String[] getSheetHeader(int SheetIndex)
{
            int noOfColumns = 0;XSSFCell cell = null; int i =0;
            String columns[] = null; XSSFSheet sheet=null;

            try {
                    loadFile();  //load give Excel
                    if(validateIndex(SheetIndex))
                    {
                     sheet  = workbook.getSheetAt(SheetIndex);
                     noOfColumns = getNumberOfColumns(SheetIndex);
                     columns = new String[noOfColumns];
                     Iterator rowIter = sheet.rowIterator();
                     XSSFRow Row = (XSSFRow) rowIter.next();
                     Iterator cellIter = Row.cellIterator();

                     while(cellIter.hasNext())
                     {
                        cell  = (XSSFCell) cellIter.next();
                        columns[i] = cell.getStringCellValue();
                        i++;
                     }
                  }
                    else
                         throw new InvalidSheetIndexException("Invalid sheet index.");
                }

                 catch (Exception ex) {
                    logger.error(ex);}

            return columns;
}//end of method


 public String[][] getSheetData(int SheetIndex)
 {
    int noOfColumns = 0;XSSFRow row = null;
    XSSFCell cell = null;
    int i=0;int noOfRows=0;
    int j=0;
    String[][] data=null; XSSFSheet sheet=null;

    try {
                    loadFile();  //load give Excel
                    if(validateIndex(SheetIndex))
                    {
                            sheet  = workbook.getSheetAt(SheetIndex);
                            noOfColumns = getNumberOfColumns(SheetIndex);
                            noOfRows =getNumberOfRows(SheetIndex)+1;
                            data = new String[noOfRows][noOfColumns];
                            Iterator rowIter = sheet.rowIterator();
                            while(rowIter.hasNext())
                            {
                                row = (XSSFRow) rowIter.next();
                                Iterator cellIter = row.cellIterator();
                                j=0;
                                while(cellIter.hasNext())
                                {
                                    cell  = (XSSFCell) cellIter.next();
                                    if(cell.getCellType() == cell.CELL_TYPE_STRING)
                                    {
                                        data[i][j] = cell.getStringCellValue();
                                    }
                                    else if(cell.getCellType() == cell.CELL_TYPE_NUMERIC)
                                    {
                                        if (HSSFDateUtil.isCellDateFormatted(cell)) 
                                        {
                                         String formatCellValue = new DataFormatter().formatCellValue(cell);
                                         data[i][j] =formatCellValue;
                                        }
                                        else 
                                        {  
                                          data[i][j] = Double.toString(cell.getNumericCellValue());
                                        }

                                    }
                                    else if(cell.getCellType() == cell.CELL_TYPE_BOOLEAN)
                                    {
                                         data[i][j] = Boolean.toString(cell.getBooleanCellValue());
                                    }

                                    else if(cell.getCellType() == cell.CELL_TYPE_FORMULA)
                                    {
                                         data[i][j] = cell.getCellFormula().toString();
                                    }

                                    j++;
                                }

                                i++;
                            }   // outer while


                    }
                    else throw new InvalidSheetIndexException("Invalid sheet index.");


                } catch (Exception ex) {
                    logger.error(ex);}
        return data;
 }

 public String[][] getSheetData(int SheetIndex,int noOfRows)
 {
    int noOfColumns = 0;
    XSSFRow row = null;
    XSSFCell cell = null;
    int i=0;
    int j=0;
    String[][] data=null;
    XSSFSheet sheet=null;

    try {
                    loadFile();  //load give Excel

                  if(validateIndex(SheetIndex))
                  {
                            sheet  = workbook.getSheetAt(SheetIndex);
                             noOfColumns = getNumberOfColumns(SheetIndex);
                             data = new String[noOfRows][noOfColumns];
                            Iterator rowIter = sheet.rowIterator();
                            while(i<noOfRows)
                            {

                                row = (XSSFRow) rowIter.next();
                                Iterator cellIter = row.cellIterator();
                                j=0;
                                while(cellIter.hasNext())
                                {
                                    cell  = (XSSFCell) cellIter.next();
                                    if(cell.getCellType() == cell.CELL_TYPE_STRING)
                                    {
                                        data[i][j] = cell.getStringCellValue();
                                    }
                                    else if(cell.getCellType() == cell.CELL_TYPE_NUMERIC)
                                    {
                                         if (HSSFDateUtil.isCellDateFormatted(cell)) 
                                        {
                                         String formatCellValue = new DataFormatter().formatCellValue(cell);
                                         data[i][j] =formatCellValue;
                                        }
                                        else 
                                        {  
                                          data[i][j] = Double.toString(cell.getNumericCellValue());
                                        }
                                    }

                                    j++;
                                }

                                i++;
                            }   // outer while
              }else  throw new InvalidSheetIndexException("Invalid sheet index.");
    } catch (Exception ex) {
       logger.error(ex);
    }

    return data;
 }

请帮我解决这个问题。

谢谢

【问题讨论】:

    标签: java apache-poi


    【解决方案1】:

    错误告诉您 POI 找不到 OOXML 文件的核心部分,在本例中是内容类型部分。您的文件不是有效的 OOXML 文件,更不用说有效的 .xlsx 文件了。但它是一个有效的 zip 文件,否则你会得到一个较早的错误

    Excel 真的可以加载这个文件吗?我希望它不能,因为异常通常是通过给 POI 一个常规的 .zip 文件来触发的!我怀疑您的文件无效,因此异常

    .

    更新:在 Apache POI 3.15(从 beta 1 开始)中,对于导致此问题的更常见原因,有一组更有用的异常消息。在这种情况下,您现在将获得更多描述性异常,例如ODFNotOfficeXmlFileExceptionOLE2NotOfficeXmlFileException。只有当 POI 确实不知道您提供了什么但知道它已损坏或无效时,才会显示此原始表单。

    【讨论】:

    • 我也有同样的问题,不幸的是 Excel 可以毫无问题地打开它。我想知道API中是否有任何部分可以对文件进行测试。
    • 当我尝试在 Windows 上读取 Excel 文件时,当它从我的 Mac 导出为 Excel 格式时出现此错误..
    • @user448787 如果您确定它是有效的 Excel .xlsx 文件,请在 Apache POI Bugzilla 中创建一个新错误并将有问题的文件上传到那里
    • 就我而言,该文件确实无效。尽管如此,有没有办法以编程方式修复它?由于 excel 文件是由第三方生成的,所以我无法控制它。
    【解决方案2】:

    当 Excel 文件受密码保护或文件本身损坏时,可以肯定会引发此异常。如果您只想阅读 .xlsx 文件,请尝试下面的代码。它更短,更容易阅读。

    import org.apache.poi.ss.usermodel.WorkbookFactory;
    import org.apache.poi.ss.usermodel.Workbook;
    import org.apache.poi.ss.usermodel.Sheet;
    //.....
    
    static final String excelLoc = "C:/Documents and Settings/Users/Desktop/testing.xlsx";
    
    public static void ReadExcel() {
    InputStream inputStream = null;
       try {
            inputStream = new FileInputStream(new File(excelLoc));
            Workbook wb = WorkbookFactory.create(inputStream);
            int numberOfSheet = wb.getNumberOfSheets();
    
            for (int i = 0; i < numberOfSheet; i++) {
                 Sheet sheet = wb.getSheetAt(i);
                 //.... Customize your code here
                 // To get sheet name, try -> sheet.getSheetName()
            }
       } catch {}
    }
    

    【讨论】:

    • @Wilts C 说得很好,我在这个 excel 文件上只浪费了 1 个小时,你的回答中的“损坏”这个词让我自己打开了 excel 窗口。然后windows也这么说。咳咳……
    • 非常好的 POI 使用示例。通常 HSSF/XSSF 抽象可以解决上述所有问题。
    • 我很确定不是! @Wilts - 我在 Windows 中打开了同一个文件,一切都很好。当我到达excel中的数据末尾时发现的问题
    • 我可以对密码做些什么吗?我正在将 xlxs 转换为 txt,如果 excel 没有密码保护,它可以正常工作。
    【解决方案3】:

    如果您将旧式 .xls 文件传递​​到此 API,您会得到这个确切的错误。将 .xls 保存为 .xlsx 然后它将起作用。

    【讨论】:

      【解决方案4】:

      我使用 XSSFWorkbook 读取 .xls,导致 InvalidFormatException。我必须使用更通用的工作簿和工作表才能使其工作。

      这个post 帮我解决了我的问题。

      【讨论】:

      • 但他问的是 XLSX 文件,而不是 XLS。
      【解决方案5】:

      如果您尝试从同一来源解析同一文件两次,您也可能会看到此错误。

      我正在解析文件一次以验证并再次(来自同一个 InputStream)进行处理 - 这产生了上述错误。

      为了解决这个问题,我将源文件解析为 2 个不同的 InputStreams,一个用于验证,一个用于处理。

      【讨论】:

        【解决方案6】:

        清理代码(主要是注释掉记录器)以使其在我的 Eclipse 环境中运行。

        import java.io.FileNotFoundException;
        import java.io.IOException;
        import java.io.InputStream;
        import java.util.Iterator;
        
        import org.apache.poi.hssf.usermodel.HSSFDateUtil;
        import org.apache.poi.ss.usermodel.Cell;
        import org.apache.poi.ss.usermodel.DataFormatter;
        import org.apache.poi.ss.usermodel.Row;
        import org.apache.poi.xssf.usermodel.*;
        
        public class ReadXLSX {
        private String filepath;
        private XSSFWorkbook workbook;
        // private static Logger logger=null;
        private InputStream resourceAsStream;
        
        public ReadXLSX(String filePath) {
            // logger=LoggerFactory.getLogger("ReadXLSX");
            this.filepath = filePath;
            resourceAsStream = ClassLoader.getSystemResourceAsStream(filepath);
        }
        
        public ReadXLSX(InputStream fileStream) {
            // logger=LoggerFactory.getLogger("ReadXLSX");
            this.resourceAsStream = fileStream;
        }
        
        private void loadFile() throws FileNotFoundException,
                NullObjectFoundException {
        
            if (resourceAsStream == null)
                throw new FileNotFoundException("Unable to locate give file..");
            else {
                try {
                    workbook = new XSSFWorkbook(resourceAsStream);
        
                } catch (IOException ex) {
        
                }
        
            }
        }// end loadxlsFile
        
        public String[] getSheetsName() {
            int totalsheet = 0;
            int i = 0;
            String[] sheetName = null;
        
            try {
                loadFile();
                totalsheet = workbook.getNumberOfSheets();
                sheetName = new String[totalsheet];
                while (i < totalsheet) {
                    sheetName[i] = workbook.getSheetName(i);
                    i++;
                }
        
            } catch (FileNotFoundException ex) {
                // logger.error(ex);
            } catch (NullObjectFoundException ex) {
                // logger.error(ex);
            }
        
            return sheetName;
        }
        
        public int[] getSheetsIndex() {
            int totalsheet = 0;
            int i = 0;
            int[] sheetIndex = null;
            String[] sheetname = getSheetsName();
            try {
                loadFile();
                totalsheet = workbook.getNumberOfSheets();
                sheetIndex = new int[totalsheet];
                while (i < totalsheet) {
                    sheetIndex[i] = workbook.getSheetIndex(sheetname[i]);
                    i++;
                }
        
            } catch (FileNotFoundException ex) {
                // logger.error(ex);
            } catch (NullObjectFoundException ex) {
                // logger.error(ex);
            }
        
            return sheetIndex;
        }
        
        private boolean validateIndex(int index) {
            if (index < getSheetsIndex().length && index >= 0)
                return true;
            else
                return false;
        }
        
        public int getNumberOfSheet() {
            int totalsheet = 0;
            try {
                loadFile();
                totalsheet = workbook.getNumberOfSheets();
        
            } catch (FileNotFoundException ex) {
                // logger.error(ex.getMessage());
            } catch (NullObjectFoundException ex) {
                // logger.error(ex.getMessage());
            }
        
            return totalsheet;
        }
        
        public int getNumberOfColumns(int SheetIndex) {
            int NO_OF_Column = 0;
            @SuppressWarnings("unused")
            XSSFCell cell = null;
            XSSFSheet sheet = null;
            try {
                loadFile(); // load give Excel
                if (validateIndex(SheetIndex)) {
                    sheet = workbook.getSheetAt(SheetIndex);
                    Iterator<Row> rowIter = sheet.rowIterator();
                    XSSFRow firstRow = (XSSFRow) rowIter.next();
                    Iterator<Cell> cellIter = firstRow.cellIterator();
                    while (cellIter.hasNext()) {
                        cell = (XSSFCell) cellIter.next();
                        NO_OF_Column++;
                    }
                } else
                    throw new InvalidSheetIndexException("Invalid sheet index.");
            } catch (Exception ex) {
                // logger.error(ex.getMessage());
        
            }
        
            return NO_OF_Column;
        }
        
        public int getNumberOfRows(int SheetIndex) {
            int NO_OF_ROW = 0;
            XSSFSheet sheet = null;
        
            try {
                loadFile(); // load give Excel
                if (validateIndex(SheetIndex)) {
                    sheet = workbook.getSheetAt(SheetIndex);
                    NO_OF_ROW = sheet.getLastRowNum();
                } else
                    throw new InvalidSheetIndexException("Invalid sheet index.");
            } catch (Exception ex) {
                // logger.error(ex);
            }
        
            return NO_OF_ROW;
        }
        
        public String[] getSheetHeader(int SheetIndex) {
            int noOfColumns = 0;
            XSSFCell cell = null;
            int i = 0;
            String columns[] = null;
            XSSFSheet sheet = null;
        
            try {
                loadFile(); // load give Excel
                if (validateIndex(SheetIndex)) {
                    sheet = workbook.getSheetAt(SheetIndex);
                    noOfColumns = getNumberOfColumns(SheetIndex);
                    columns = new String[noOfColumns];
                    Iterator<Row> rowIter = sheet.rowIterator();
                    XSSFRow Row = (XSSFRow) rowIter.next();
                    Iterator<Cell> cellIter = Row.cellIterator();
        
                    while (cellIter.hasNext()) {
                        cell = (XSSFCell) cellIter.next();
                        columns[i] = cell.getStringCellValue();
                        i++;
                    }
                } else
                    throw new InvalidSheetIndexException("Invalid sheet index.");
            }
        
            catch (Exception ex) {
                // logger.error(ex);
            }
        
            return columns;
        }// end of method
        
        public String[][] getSheetData(int SheetIndex) {
            int noOfColumns = 0;
            XSSFRow row = null;
            XSSFCell cell = null;
            int i = 0;
            int noOfRows = 0;
            int j = 0;
            String[][] data = null;
            XSSFSheet sheet = null;
        
            try {
                loadFile(); // load give Excel
                if (validateIndex(SheetIndex)) {
                    sheet = workbook.getSheetAt(SheetIndex);
                    noOfColumns = getNumberOfColumns(SheetIndex);
                    noOfRows = getNumberOfRows(SheetIndex) + 1;
                    data = new String[noOfRows][noOfColumns];
                    Iterator<Row> rowIter = sheet.rowIterator();
                    while (rowIter.hasNext()) {
                        row = (XSSFRow) rowIter.next();
                        Iterator<Cell> cellIter = row.cellIterator();
                        j = 0;
                        while (cellIter.hasNext()) {
                            cell = (XSSFCell) cellIter.next();
                            if (cell.getCellType() == Cell.CELL_TYPE_STRING) {
                                data[i][j] = cell.getStringCellValue();
                            } else if (cell.getCellType() == Cell.CELL_TYPE_NUMERIC) {
                                if (HSSFDateUtil.isCellDateFormatted(cell)) {
                                    String formatCellValue = new DataFormatter()
                                            .formatCellValue(cell);
                                    data[i][j] = formatCellValue;
                                } else {
                                    data[i][j] = Double.toString(cell
                                            .getNumericCellValue());
                                }
        
                            } else if (cell.getCellType() == Cell.CELL_TYPE_BOOLEAN) {
                                data[i][j] = Boolean.toString(cell
                                        .getBooleanCellValue());
                            }
        
                            else if (cell.getCellType() == Cell.CELL_TYPE_FORMULA) {
                                data[i][j] = cell.getCellFormula().toString();
                            }
        
                            j++;
                        }
        
                        i++;
                    } // outer while
        
                } else
                    throw new InvalidSheetIndexException("Invalid sheet index.");
        
            } catch (Exception ex) {
                // logger.error(ex);
            }
            return data;
        }
        
        public String[][] getSheetData(int SheetIndex, int noOfRows) {
            int noOfColumns = 0;
            XSSFRow row = null;
            XSSFCell cell = null;
            int i = 0;
            int j = 0;
            String[][] data = null;
            XSSFSheet sheet = null;
        
            try {
                loadFile(); // load give Excel
        
                if (validateIndex(SheetIndex)) {
                    sheet = workbook.getSheetAt(SheetIndex);
                    noOfColumns = getNumberOfColumns(SheetIndex);
                    data = new String[noOfRows][noOfColumns];
                    Iterator<Row> rowIter = sheet.rowIterator();
                    while (i < noOfRows) {
        
                        row = (XSSFRow) rowIter.next();
                        Iterator<Cell> cellIter = row.cellIterator();
                        j = 0;
                        while (cellIter.hasNext()) {
                            cell = (XSSFCell) cellIter.next();
                            if (cell.getCellType() == Cell.CELL_TYPE_STRING) {
                                data[i][j] = cell.getStringCellValue();
                            } else if (cell.getCellType() == Cell.CELL_TYPE_NUMERIC) {
                                if (HSSFDateUtil.isCellDateFormatted(cell)) {
                                    String formatCellValue = new DataFormatter()
                                            .formatCellValue(cell);
                                    data[i][j] = formatCellValue;
                                } else {
                                    data[i][j] = Double.toString(cell
                                            .getNumericCellValue());
                                }
                            }
        
                            j++;
                        }
        
                        i++;
                    } // outer while
                } else
                    throw new InvalidSheetIndexException("Invalid sheet index.");
            } catch (Exception ex) {
                // logger.error(ex);
            }
        
            return data;
        }
        }
        

        创建了这个小测试代码:

        import java.io.File;
        import java.io.FileInputStream;
        import java.io.FileNotFoundException;
        
        
        public class ReadXLSXTest {
        
        /**
         * @param args
         * @throws FileNotFoundException 
         */
        public static void main(String[] args) throws FileNotFoundException {
            // TODO Auto-generated method stub
        
        
            ReadXLSX test = new ReadXLSX(new FileInputStream(new File("./sample.xlsx")));
        
            System.out.println(test.getSheetsName());
            System.out.println(test.getNumberOfSheet());
        
        
        }
        
        }
        

        所有这一切都像魅力一样运行,所以我猜你有一个 XLSX 文件以某种方式“损坏”。尝试使用其他数据进行测试。

        干杯, 维姆

        【讨论】:

          【解决方案7】:

          .xls 文件出现同样的异常,但在我打开文件并将其另存为 xlsx 文件后,以下代码有效:

           try(InputStream is =file.getInputStream()){
                XSSFWorkbook workbook = new XSSFWorkbook(is);
                ...
           }
          

          【讨论】:

            【解决方案8】:

            如果 excel 文件受密码保护,则会出现此错误。

            【讨论】:

              【解决方案9】:

              尝试仅将文件另存为 Excel 工作簿。不是任何其他格式。它对我有用。我遇到了同样的错误。

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2013-03-11
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多