usar ejemplo codigo java excel apache-poi

java - ejemplo - private jlabel



DaƱado el manejo de archivos (5)

Es posible que ya haya marcado, pero si no, consulte https://bz.apache.org/bugzilla/show_bug.cgi?id=47251 si ayuda. Tiene un problema similar y puede encontrar una respuesta sobre cómo manejarlo.

Me gustaría saber si alguien tiene algún consejo sobre el manejo de archivos dañados con Apache POI

Estoy tratando de abrir un archivo y estoy recibiendo este mensaje:

Exception in thread "main" org.apache.poi.hssf.record.RecordInputStream$LeftoverDataException: Initialisation of record 0x1C left 2 bytes remaining still to be read. at org.apache.poi.hssf.record.RecordInputStream.hasNextRecord(RecordInputStream.java:156) at org.apache.poi.hssf.record.RecordFactoryInputStream.nextRecord(RecordFactoryInputStream.java:231) at org.apache.poi.hssf.record.RecordFactory.createRecords(RecordFactory.java:480) at org.apache.poi.hssf.usermodel.HSSFWorkbook.<init>(HSSFWorkbook.java:301) at org.apache.poi.ss.usermodel.WorkbookFactory.create(WorkbookFactory.java:95) at ExcelImporter.EditFileImportDialog.main(EditFileImportDialog.java:409)

Aquí hay un SSCCE

import org.apache.poi.openxml4j.exceptions.InvalidFormatException; import org.apache.poi.ss.usermodel.Workbook; import org.apache.poi.ss.usermodel.WorkbookFactory; public class EditFileImportDialog { /* Omitted irrelevent code */ public static void main(String[] args) { File file = new File("Z://Path//To//File_causing_the_trouble.xls"); try { Workbook wb = WorkbookFactory.create(file); // Line 409 for ref to the exception stack trace System.out.println(wb); } catch (InvalidFormatException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } }

Esto ocurre solo con este archivo, y la excepción no se produce si abro el archivo en Excel y lo guardo, entonces intento abrirlo con POI . ¿Alguna sugerencia sobre cómo podría manejar esto?

EDITAR:

Como nota, mi problema puede estar relacionado con esta pregunta , pero actualizar el POI no solucionó mi problema y hay diferencias con el archivo descrito. He buscado respuestas similares, pero quizás si alguien sabe lo que está mal con el archivo Excel en sí, puedo escribir algo para parchar el archivo.

EDIT 2

La creación del archivo no está bajo mi control. Excel corrige el archivo en sí mismo al abrirlo y volver a guardarlo. Mi pregunta es si alguien puede pensar en una forma de ajustar / aumentar POI para manejar este archivo dañado de la misma manera que Excel puede solucionar el problema.

EDIT 3

En respuesta a varios comentarios / respuestas:

Mi objetivo final sería no utilizar Excel en absoluto.

  1. El archivo se envía
  2. El programa se ejecuta
  3. Maneja el error
  4. Procesa datos.

Intente crear un XSSFWorkbook en su lugar desde un FileInputStream.

Con los cambios, su muestra se vería así:

import org.apache.poi.openxml4j.exceptions.InvalidFormatException; import org.apache.poi.ss.usermodel.Workbook; import org.apache.poi.ss.usermodel.WorkbookFactory; public class EditFileImportDialog { /* Omitted irrelevent code */ public static void main(String[] args) { String file = "Z://Path//To//File_causing_the_trouble.xls"; try { InputStream databaseFile = new FileInputStream(file); XSSFWorkbook wb = new XSSFWorkbook(databaseFile); System.out.println(wb); } catch (InvalidFormatException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } }


La excepción en el hilo principal no es un problema de codificación. ¡Debería reemplazar las referencias de celda incorrectas en Excel-Workbook!

Excepción en el hilo "main" org.apache.poi.hssf.record.RecordInputStream $ LeftoverDataException: Inicialización del registro 0x23 dejó 12 bytes restantes por leer.

Esta excepción se produce cuando intento abrir un Excel-Workbook con POI HSSF, que contiene una referencia de celda DDE. Tengo este problema con un tipo de referencia de celda de ''Excel.Type.12'' por ejemplo: = Excel.Sheet.12 | ''/ servername / pathname / Workbook.xlsx''! ''! Sheetname! Z23S22''

Solución alternativa: reemplace la referencia con una referencia de tipo ''Hoja'', por ejemplo: = ''Unidad: / nombre de ruta [Libro de trabajo.xlsx] Nombre de hoja''! $ V $ 23

Guarde su libro de trabajo y pruébelo nuevamente.


La mejor opción sería crear un nuevo archivo y recordarle que cierre el archivo antes de ejecutar el programa. Esa sería la solución más simple.


Podría intentar usar HSSFWorkbook para abrir archivos .xls.

Puede usar el siguiente código para verificar cómo responden los POI al determinar el formato xls.

private boolean isExcel(InputStream i) throws IOException { return (POIFSFileSystem.hasPOIFSHeader(i) || POIXMLDocument.hasOOXMLHeader(i)); }

Yo usaría :

InputStream input = new FileInputStream(fileName);

En lugar de :

File file = new File("Z://Path//To//File_causing_the_trouble.xls");

¿Comprobaste qué está mal con la celda 0x1C en tu archivo?