Gestione dei file danneggiati

Vorrei sapere se qualcuno ha qualche consiglio sulla gestione di file danneggiati con Apache POI

Sto cercando di aprire un file e ricevo questo messaggio:

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) 

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

Questo accade solo con questo file e l'exception non viene generata se apro il file in excel e lo salvo, quindi provalo ad aprirlo con il POI . Qualunque suggerimento su come potessi gestire questo problema?

EDIT:

Come nota, il mio problema potrebbe essere correlato a questa domanda , ma l'aggiornamento del POI non ha risolto il mio problema e ci sono dissimilarità con il file descritto. Ho cercato intorno per risposte simili, ma forse se qualcuno sa cosa c'è di sbagliato con il file excel stesso, posso scrivere qualcosa per patch il file.

EDIT 2

La creazione di file non è al mio controllo. Excel risolve il file stesso solo all'apertura e al salvataggio. La mia domanda è però se qualcuno può pensare a un modo per regolare / aumentare il POI per gestire questo file danneggiato allo stesso modo in cui Excel è in grado di risolvere il problema.

EDIT 3

In risposta a diversi commenti / risposte:

Il mio objective finale sarebbe quello di non utilizzare excel a tutti.

  1. Il file viene inviato.
  2. Il programma esegue.
  3. Maneggia l'errore.
  4. Dati dei processi.

È ansible provare a utilizzare HSSFWorkbook per aprire file .xls.

È ansible utilizzare il seguente codice per verificare il modo in cui il POI risponde a determinare il formato xls.

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

Io userei :

 InputStream input = new FileInputStream(fileName); 

Invece di :

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

Hai verificato ciò che è sbagliato con la cella 0x1C nel tuo file?

L'opzione migliore sarebbe quella di creare un nuovo file e renderlo un punto da ricordare che chiudi il file prima di eseguire il programma. Questa sarebbe la soluzione più semplice.

L'exception in thread main non è un problema di codifica. Dovresti sostituire i riferimenti a cellule sbagliate in Excel-Workbook!

Eccezione nel thread "main" org.apache.poi.hssf.record.RecordInputStream $ LeftoverDataException: L'initialization del record 0x23 ha lasciato 12 byte rimanenti da leggere.

Questa exception viene generata quando cerco di aprire una cartella di lavoro Excel con POI HSSF, che contiene una DDE Cell Reference. Ho questo problema con un tipo di riferimento di cella di 'Excel.Type.12' ad esempio: = Excel.Sheet.12 | '\ servername \ pathname \ Workbook.xlsx'! '! Sheetname! Z23S22'

Soluzione alternativa: Sostituire il riferimento con un riferimento di tipo 'Foglio' ad esempio: = 'Drive: \ path [Workbook.xlsx] Sheetname'! $ V $ 23

Salvare la cartella di lavoro e riprovare.

Provare a creare un XSSFWorkbook invece da un fileInputStream.

Con i cambiamenti il ​​tuo campione sarebbe simile:

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

Potresti aver già controllato, ma se no, consulta https://bz.apache.org/bugzilla/show_bug.cgi?id=47251 se aiuta. Ha problemi simili e si può trovare una risposta su come gestirlo.