使用Apache POI读取xlsx文件时获取exception(org.apache.poi.openxml4j.exception – 无内容类型)?

我正在使用Apache POI(XSSF API)来读取xlsx文件。当我试图读取file.i时出现以下错误:

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 =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; } 

请帮我解决这个问题。

谢谢

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

Excel真的可以加载这个文件吗? 我希望它不会,因为exception最常见的是给POI一个普通的.zip文件! 我怀疑你的文件无效,因此是例外

更新:在Apache POI 3.15(从beta 1开始),对于此问题的更常见原因,有一组更有用的exception消息。 在这种情况下,您现在将获得更多描述性exception,例如ODFNotOfficeXmlFileException和OLE2NotOfficeXmlFileException 。 如果POI真的不知道你给了它什么,但知道它已经破坏或无效,那么这种原始forms应该只会出现。

当Excel文件受密码保护或文件本身已损坏时,请确保抛出此exception。 如果您只想阅读.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 {} } 

如果您将旧的.xls文件传递给此API,则会出现此错误。 将.xls保存为.xlsx然后它将起作用。

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

这篇文章帮助我解决了我的问题。

清理代码(主要是注释掉记录器)以使其在我的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 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; } } 

创建了这个小测试代码:

 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文件以某种方式“腐败”。 尝试使用其他数据进行测试

干杯,Wim

我得到.xls文件的相同exception,但在我打开文件并将其保存为xlsx文件后,以下代码可以正常工作:

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

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

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

我正在解析文件一次以validation并再次(来自相同的InputStream)进行处理 – 这产生了上述错误。

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

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