2012-05-28 2 views
2

En utilisant le code suivant lors de la lecture dans un fichier .xls, où s est le répertoire du fichier:Apache POI HSSF erreur de lecture XLS

InputStream input = new FileInputStream(s); 
Workbook wbs = new HSSFWorkbook(input); 

je reçois le message d'erreur suivant:

Exception in thread "main" java.io.IOException: Invalid header signature; read 0x0010000000060809, expected 0xE11AB1A1E011CFD0 

I besoin d'un programme qui est capable de lire XLSX ou XLS, et en utilisant exactement le même code juste ajusté pour XSSF, il n'a aucun problème à tout lire dans le fichier XLSX.

+0

l'exception se produit en créant la variable 'input' ou' wbs'? –

Répondre

1

Si le fichier est au format xlsx au lieu de xls, vous risquez d'obtenir cette erreur. Je voudrais essayer d'utiliser l'objet Workbook générique (également appelé le SS Usermodel)

Découvrez le Workbook interface et le WorkbookFactory object. L'usine devrait être capable de créer un classeur générique pour vous, que ce soit en xlsx ou en xls.

Je pensais que j'avais un bon tutoriel sur ce sujet, mais je n'arrive pas à le trouver. Je vais continuer à regarder bien.

Modifier

Je trouve this little tiny snippet à partir du site d'Apache sur la lecture et la réécriture en utilisant la SS userModel.

J'espère que cela aide!

+1

Vous n'obtiendrez pas cette erreur si vous donnez un fichier .xlsx à HSSF, du moins pas dans les versions récentes, vous en obtiendrez un spécifique vous informant de votre erreur. C'est l'erreur générale où POI n'a aucune idée ... – Gagravarr

+0

@Gagravarr Ahh la seule raison pour laquelle je me suis douté que c'était à cause de la dernière partie de la question, indiquant que quand il a utilisé XSSF il n'y avait aucun problème. Ils ont également demandé un moyen d'accéder à la fois xlsx et xls, donc je pense que c'est encore une bonne info pour eux, je ne m'attends pas à des upvotes cependant. – Shaded

1

Signature d'en-tête invalide; lire 0x342E312D46445025, attendu 0xE11AB1A1E011CFD0

Eh bien, je suis cette erreur quand j'Uploaded corrompu xls/xlsx fichier (pour télécharger le fichier corrompu, je renomme exemple.pdf à Sample.xls). Ajouter la validation comme:

Workbook wbs = null; 
try { 
    InputStream input = new FileInputStream(s); 
    wbs = new HSSFWorkbook(input); 
} catch(IOException e) { 
    // log "file is corrupted", show error message to user 
} 
1

L'exception que vous obtenez est un vous dire que le fichier que vous prêteuse n'est pas un fichier binaire Excel valide, au moins pas un fichier Excel valide produit depuis environ 1990. La exception que vous obtenez vous dit ce que POI attend, et qu'il a trouvé quelque chose d'autre qui n'était pas un fichier .xls valide, et n'était pas n'importe quoi d'autre POI peut détecter. Une chose à savoir est que Excel ouvre une grande variété de formats de fichiers, y compris .csv et .html. Il n'est pas non plus très pointilleux sur l'extension de fichier, donc ouvrira heureusement un fichier CSV qui a été renommé en .xls. Cependant, puisque renommer un .csv en .xls ne change pas magiquement le format, POI ne peut toujours pas l'ouvrir!

. De l'exception, je peux dire ce qui se passe, et je peux également vous dire que vous utilisez une ancienne version d'Apache POI! Une signature d'en-tête de 0x0010000000060809 correspond au format de fichier Excel 4, il y a environ 25 ans! Si vous utilisez une version plus récente d'Apache POI, un message d'erreur vous indiquera que le fichier fourni est un fichier Excel ancien et largement non pris en charge. Les nouvelles versions de POI incluent le OldExcelExtractor tool qui peut extraire des informations de ces anciens formats.

Sinon, comme toutes les exceptions de ce type, essayez d'ouvrir le fichier dans Excel et de faire un enregistrement. Cela vous donnera une idée de ce que le fichier est actuellement (par exemple .html enregistré en .xls, .csv enregistré en .xls, etc.), et vous permettra également de le réenregistrer comme un fichier .xls approprié pour POI à charger et travailler avec.

Questions connexes