En-tête non valide lire fichier xls
Je suis à la lecture d'un fichier excel sur mon système local. Je suis à l'aide de POI jar Version 3.7, mais d'avoir d'erreur Invalide la signature de l'en-tête;
lire -2300849302551019537 ou en Hexadécimal 0xE011BDBFEFBDBFEF ,
attendu -2226271756974174256 ou en Hexadécimal 0xE11AB1A1E011CFD0.
De l'ouverture du fichier xls avec Excel fonctionne très bien.
La codeblock là que ça se passe:
Quelqu'un à une idée ?
/**
* create a new HeaderBlockReader from an InputStream
*
* @param stream the source InputStream
*
* @exception IOException on errors or bad data
*/
public HeaderBlockReader(InputStream stream) throws IOException {
//At this point, we don't know how big our
// block sizes are
//So, read the first 32 bytes to check, then
// read the rest of the block
byte[] blockStart = new byte[32];
int bsCount = IOUtils.readFully(stream, blockStart);
if(bsCount != 32) {
throw alertShortRead(bsCount, 32);
}
//verify signature
long signature = LittleEndian.getLong(blockStart, _signature_offset);
if (signature != _signature) {
//Is it one of the usual suspects?
byte[] OOXML_FILE_HEADER = POIFSConstants.OOXML_FILE_HEADER;
if(blockStart[0] == OOXML_FILE_HEADER[0] &&
blockStart[1] == OOXML_FILE_HEADER[1] &&
blockStart[2] == OOXML_FILE_HEADER[2] &&
blockStart[3] == OOXML_FILE_HEADER[3]) {
throw new OfficeXmlFileException("The supplied data appears to be in the Office 2007+ XML. You are calling the part of POI that deals with OLE2 Office Documents. You need to call a different part of POI to process this data (eg XSSF instead of HSSF)");
}
if ((signature & 0xFF8FFFFFFFFFFFFFL) == 0x0010000200040009L) {
//BIFF2 raw stream starts with BOF (sid=0x0009, size=0x0004, data=0x00t0)
throw new IllegalArgumentException("The supplied data appears to be in BIFF2 format. "
+ "POI only supports BIFF8 format");
}
//Give a generic error
throw new IOException("Invalid header signature; read "
+ longToHex(signature) + ", expected "
+ longToHex(_signature));
}
Vous jetez cette exception à partir de votre code? throw new IOException? confondu par votre question, vous lui jeter de l'exception et de vous demander pourquoi?
L'Exception est levée par l'Apache Poi Bibliothèque et au-dessus, c'est le code qui s'y jette.
apache poi est de ne pas jeter de l'erreur, votre code ne jeter "nouvelle IOException("en-tête non Valide signature; lire"
Le HeaderBlockReader(InputStream stream) constructeur est partie de l'Apache POI bibliothèque. Mon code devient l'existant fichier xls comme un flux et puis je veux créer un nouveau POIFileSystem avec cette InputStream.
L'Exception est levée par l'Apache Poi Bibliothèque et au-dessus, c'est le code qui s'y jette.
apache poi est de ne pas jeter de l'erreur, votre code ne jeter "nouvelle IOException("en-tête non Valide signature; lire"
Le HeaderBlockReader(InputStream stream) constructeur est partie de l'Apache POI bibliothèque. Mon code devient l'existant fichier xls comme un flux et puis je veux créer un nouveau POIFileSystem avec cette InputStream.
OriginalL'auteur dutchman79 | 2012-12-19
Vous devez vous connecter pour publier un commentaire.
Juste une idee, si vous utilisez maven assurez-vous de la ressource balise de filtre est défini sur false.
Sinon maven tend à corrompre les fichiers xls dans la copie de la phase
Super ! Qui a fait le tour .
OriginalL'auteur Felix
Que l'exception est pour vous dire que votre fichier n'est pas valide OLE2 .fichier xls.
Être en mesure d'ouvrir le fichier dans Excel est pas de véritable guide - Excel seront heureux de vous ouvrir n'importe quel fichier il connaît peu importe ce que l'extension est sur elle. Si vous prenez une .csv fichier et le renommer .xls, Excel va toujours de l'ouvrir, mais le changement de nom n'a pas magiquement fait dans la .xls format POI ne s'ouvre pas pour vous.
Si vous ouvrez le fichier dans Excel et de faire Enregistrer sous, il va vous permettre de l'écrire comme un véritable fichier Excel. Si vous voulez savoir ce fichier, il est vraiment, essayez d'utiliser Apache Tika - la Tika CLI avec
--detect
devrait être en mesure de vous dire.
Comment puis-je être sûr que ce n'est pas un fichier valide? Si vous regardez la OLE2 spécification de format de fichier doc de Microsoft, et la tête de la section 2.2 vous verrez suivantes:
Retourner les octets ronde (OLE2 est little endian) et vous obtenez 0xE11AB1A1E011CFD0, le nombre magique de l'exception. Votre fichier ne commence pas avec ce chiffre magique, comme ce n'est pas vraiment valide OLE2 document, et donc de POI que vous donne exception.
Est votre système de fichiers cassé, peut-être? Disque en train de mourir? Consultez la mise à jour de réponse, le fichier d'en-tête, vous avez réellement n'est pas valide!
Pour le rendre encore plus étrange: quand j'ai lu le même fichier de modèle directement par l'adressage à son emplacement dans le répertoire src/main/resources dossier, il fonctionne. Cependant lorsque j'essaie de le lire avec getResourceAsStream (), j'obtiens cette invalide valeur d'en-tête ...
Est quelque chose à faire de drôles de utf8/ascii ou natif de conversion unicode/sur votre stream peut-être? Je ne peux que vous suggérer de créer un petit (~50 octets) du fichier d'essai, essayez de chargement et de comparer les octets, puis poser une nouvelle question en se basant sur!
Rti très bonne explication, @Gagravarr, savez-vous comment se fait-Excel comprend pas valide OLE2 fichiers et peut toujours l'ouvrir, alors que nous ne pouvons pas analyser le fichier à l'aide d'Apache POI programmatique?
OriginalL'auteur Gagravarr
Si votre projet est projet maven, le code suivant peut aider:
OriginalL'auteur Yaohui Wu