poi example java apache-poi

java - apache poi example



¿Obtención de excepciones(org.apache.poi.openxml4j.exception-no hay tipo de contenido[M1.13]) al leer el archivo xlsx usando Apache POI? (9)

Estoy usando Apache POI (XSSF API) para leer el archivo xlsx. Cuando intenté leer el archivo, recibí 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 < 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; }

Por favor, ayúdame a resolver este problema.

Gracias


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 más 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 {} }


El error le indica que POI no pudo encontrar una parte central del archivo OOXML, en este caso la parte de los tipos de contenido. 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? ¡Espero que no sea posible, ya que la excepción es más comúnmente provocada por darle a POI un archivo .zip regular! 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á más excepciones descriptivas en este caso, por ejemplo, ODFNotOfficeXmlFileException y OLE2NotOfficeXmlFileException . Esta forma bruta solo debería aparecer si POI realmente no tiene idea de lo que le has dado, pero sabe que está roto o no es válido.


Estaba usando XSSFWorkbook para leer .xls, lo que resultó en InvalidFormatException. Tengo que usar un libro y una hoja más genéricos para que funcione.

Este post me ayudó a resolver mi problema.


Intente guardar el archivo SOLAMENTE como libro de Excel. NO cualquier otro formato. Funciono para mi Estaba recibiendo el mismo error.


Limpié el código (comentado por el registrador en su mayoría) para que se ejecute 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<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; } }

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 encanto, así que supongo que tienes un archivo XLSX que está ''dañado'' de una forma u otra. Trate de probar con otros datos.

Saludos, Wim


Obtendrá este error exacto si pasa un archivo .xls de la vieja escuela a esta API. Guarda el .xls como un .xlsx y luego funcionará.


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, aparecerá 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 otra vez (del mismo InputStream) para procesarlo; esto produjo el error anterior.

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