Question

Nous essayons de modifier l'un des fichiers XML en 2007 MS Excel. Pour cela, le fichier XLSX est décompressé en utilisant ZipInputStream de Java, puis copié dans un nouveau fichier Zip à l'aide ZipOutputStream. Les extraits de code sont comme ci-dessous:

        FileInputStream fis = new FileInputStream("C:\\_132139TRD-GDR_Conversion.xlsx");
        ZipInputStream zis = new ZipInputStream(new BufferedInputStream(fis));

        FileOutputStream fos =  new FileOutputStream("C:\\_132139TRD-GDR_Conversion123.xlsx");
        ZipOutputStream zos = new ZipOutputStream(new BufferedOutputStream(fos));

        while ((entry = zis.getNextEntry()) != null) {

            System.out.println("Processing Entry : " + entry.getName());
            System.out.println("Processing Entry Size : " + entry.getSize());
            System.out.println("Entry Available : " + zis.available());

        if(entry.getName().equals(ZIP_ENTRY_WOOKBOOK_XML)){
          //Process XML
        }

        ZipEntry ze = new ZipEntry(entry.getName());
            zos.putNextEntry(ze);
            if(entry.getName().equals(ZIP_ENTRY_WOOKBOOK_XML)){
                    zos.write(XML.getBytes());
            }else{
                ByteArrayOutputStream stream = new ByteArrayOutputStream();
                while ((count = zis.read(data, 0, BUFFER)) != -1) {
                    stream.write(data, 0, count);
                }
                tempBuffer = stream.toByteArray();
                zos.write(tempBuffer);
            }
            zos.closeEntry();               
        }
        zos.close();
        fos.close();
        zis.close();
        fis.close();

Dans cet extrait, après que nous rencontrons un fichier JPEG, la "entrée = zis.getNextEntry ()" retourne NULL. Nous ne sommes pas en mesure de lire la prochaine ZipEntry - ce qui conduit à une incomplète Excel. La sortie d'un exemple de fichier Excel est comme ci-dessous:

Start Date Mon Dec 06 15:33:33 IST 2010
Processing Entry : xl/media/Logo2005_JPM_A_Black_170x50.jpeg
Processing Entry Size : -1
Entry Available : 1
End Date Mon Dec 06 15:34:58 IST 2010

Le ZipInputStream se ferme dès que le fichier JPEG est copié. (Les variables entryEOF et reachEOF les deux tournent vrai et l'entrée est nulle après la copie de l'image).

Quelqu'un at-il fait face à un problème similaire? Est-ce un bug qui reachEOF tourne également vrai après avoir copié le fichier?

Midhun.

Était-ce utile?

La solution

Ceci est parce que vous lisez les données de l'image de zis au lieu de partir zis.getInputStream(entry).

Après la boucle de copie, toutes les données de zis auront été lus, vous obtenez un EOF.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top