Obtención de excepción (org.apache.poi.openxml4j.exception – sin tipo de contenido ) al leer el archivo xlsx utilizando Apache POI?

Estoy usando Apache POI (API XSSF) para leer el archivo xlsx. Cuando intenté leer el archivo, obtuve el siguiente error:

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

Código:

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

por favor ayúdame a resolver este problema.

Gracias

El error indica que el PDI no pudo encontrar una parte central del archivo OOXML, en este caso, los tipos de contenido son parte. Su archivo no es un archivo OOXML válido, y mucho menos un archivo .xlsx válido. Sin embargo, es un archivo zip válido; de lo contrario, tendrías un error anterior

¿Puede Excel realmente cargar este archivo? Esperaría que no fuera posible, ya que la excepción más comúnmente se desencadena al darle a los POI un archivo .zip normal. Sospecho que su archivo no es válido, de ahí la excepción

.

Actualización: en Apache POI 3.15 (desde la versión beta 1 en adelante), hay un conjunto más útil de mensajes de excepción para las causas más comunes de este problema. Ahora obtendrá excepciones más descriptivas en este caso, por ejemplo, ODFNotOfficeXmlFileException y OLE2NotOfficeXmlFileException . Esta forma cruda solo debería aparecer si POI realmente no tiene ni idea de lo que le has dado, pero sabe que está roto o no válido.

Bastante seguro de que esta excepción se produce cuando el archivo de Excel está protegido por contraseña o el archivo está dañado. Si solo quieres leer un archivo .xlsx, prueba mi código a continuación. Es mucho más corto y fácil de leer.

 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 {} } 

Obtiene este error exacto si pasa un archivo .xls de la vieja escuela a esta API. Guarde los .xls como .xlsx y luego funcionará.

Estaba usando XSSFWorkbook para leer .xls, lo que dio como resultado InvalidFormatException. Tengo que usar un libro de trabajo y una hoja más generics para que funcione.

Esta publicación me ayudó a resolver mi problema.

Limpié el código (comentado en su mayor parte el registrador) para que se ejecutara en mi entorno 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; } } 

Creado este pequeño código de prueba:

 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()); } } 

Todo esto funcionó como un amuleto, así que supongo que tienes un archivo XLSX que está “corrupto” de una forma u otra. Pruebe probar con otros datos.

Saludos, Wim

Obtengo la misma excepción para el archivo .xls , pero después de abrir el archivo y guardarlo como archivo xlsx , funciona el siguiente código:

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

Si el archivo de Excel está protegido por contraseña, aparece este error.

También puede ver este error si intenta analizar el mismo archivo dos veces desde la misma fuente.

Estaba analizando el archivo una vez para validar y nuevamente (desde el mismo InputStream) para procesar, esto produjo el error anterior.

Para evitar esto, analicé el archivo fuente en 2 InputStreams diferentes , uno para validar y otro para procesar.

Intente guardar el archivo SOLO como libro de Excel. NO cualquier otro formato. Funcionó para mí Estaba obteniendo el mismo error.