Forum général.général Format de fichier

Posté par  . Licence CC By‑SA.
Étiquettes : aucune
0
5
mar.
2015

Bonjour,

J'ai une application toute moisie qui a une fonctionnalité d'export au format Excel. Elle me produit un fichier avec une extension .xls mais Excel (2010) affiche un message d'erreur comme quoi le fichier n'est pas au format Excel.

La commande file m'indique :

  • sous Cygwin : HTML document, UTF-8 Unicode text
  • sous CentOS : UTF-8 Unicode text

Le fichier a cette gueule là dans un éditeur (j'ai volontairement supprimé certains passages car ce sont des informations ultra-sensibles… nan je déconne… m'enfin je peux pas les laisser, vis à vis de mon employeur) :

<?xml version="1.0" encoding="UTF-8"?>
<?mso-application progid="Excel.Sheet"?>

<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:x="urn:schemas-microsoft-com:office:excel" xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet" xmlns:html="http://www.w3.org/TR/REC-html40">
    <DocumentProperties xmlns="urn:schemas-microsoft-com:office:office">
        <Author/>
        <Title/>
        <Description/>
        <Subject/>
    </DocumentProperties>
    <Styles>
        <Style ss:ID="HyperlinkId" ss:Name="Hyperlink">
            <Font ss:Color="#0000ff"/>
        </Style>
        <Style ss:ID="1">
            <NumberFormat ss:Format="yyyy-M-d HH:mm:ss AM/PM"/>
        </Style>
        <Style ss:ID="29">
            <Alignment ss:Horizontal="Left" ss:Vertical="Top" ss:WrapText="1"/>
            <Borders>
                <Border ss:Position="Bottom"/>
                <Border ss:Position="Top" ss:LineStyle="Continuous" ss:Weight="2" ss:Color="#cccccc"/>
                <Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="2" ss:Color="#cccccc"/>
                <Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="2" ss:Color="#cccccc"/>
                <Border ss:Position="DiagonalLeft"/>
            </Borders>
            <Font ss:FontName="sans-serif" ss:Size="10.0" ss:Color="#000000"/>
        </Style>
        <Style ss:ID="28">
            <Alignment ss:Horizontal="Right" ss:Vertical="Top" ss:WrapText="1"/>
            <Borders>
                <Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="2" ss:Color="#cccccc"/>
                <Border ss:Position="Top" ss:LineStyle="Continuous" ss:Weight="2" ss:Color="#cccccc"/>
                <Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="2" ss:Color="#cccccc"/>
                <Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="2" ss:Color="#cccccc"/>
                <Border ss:Position="DiagonalLeft"/>
            </Borders>
            <Font ss:FontName="sans-serif" ss:Size="10.0" ss:Color="#000000"/>
            <NumberFormat ss:Format="#,##0"/>
        </Style>
        <Style ss:ID="27">
            <Alignment ss:Horizontal="Right" ss:Vertical="Top" ss:WrapText="1"/>
            <Borders>
                <Border ss:Position="Bottom"/>
                <Border ss:Position="Top" ss:LineStyle="Continuous" ss:Weight="2" ss:Color="#cccccc"/>
                <Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="2" ss:Color="#cccccc"/>
                <Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="2" ss:Color="#cccccc"/>
                <Border ss:Position="DiagonalLeft"/>
            </Borders>
            <Font ss:FontName="sans-serif" ss:Size="10.0" ss:Color="#000000"/>
            <NumberFormat ss:Format="#,##0"/>
        </Style>
        <Style ss:ID="26">
            <Alignment ss:Horizontal="Left" ss:Vertical="Top" ss:WrapText="1"/>
            <Borders>
                <Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="2" ss:Color="#cccccc"/>
                <Border ss:Position="Top" ss:LineStyle="Continuous" ss:Weight="2" ss:Color="#cccccc"/>
                <Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="2" ss:Color="#cccccc"/>
                <Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="2" ss:Color="#cccccc"/>
                <Border ss:Position="DiagonalLeft"/>
            </Borders>
            <Font ss:FontName="sans-serif" ss:Size="10.0" ss:Color="#000000"/>
        </Style>
        <Style ss:ID="25">
            <Alignment ss:Horizontal="Left" ss:Vertical="Top" ss:WrapText="1"/>
            <Borders>
                <Border ss:Position="Bottom"/>
                <Border ss:Position="Top" ss:LineStyle="Continuous" ss:Weight="2" ss:Color="#cccccc"/>
                <Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="2" ss:Color="#cccccc"/>
                <Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="2" ss:Color="#cccccc"/>
                <Border ss:Position="DiagonalLeft"/>
            </Borders>
            <Font ss:FontName="sans-serif" ss:Size="10.0" ss:Color="#000000"/>
        </Style>
        <Style ss:ID="24">
            <Alignment ss:Horizontal="Left" ss:Vertical="Top" ss:WrapText="1"/>
            <Borders>
                <Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="2" ss:Color="#cccccc"/>
                <Border ss:Position="Top" ss:LineStyle="Continuous" ss:Weight="2" ss:Color="#cccccc"/>
                <Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="2" ss:Color="#cccccc"/>
                <Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="2" ss:Color="#cccccc"/>
                <Border ss:Position="DiagonalLeft"/>
            </Borders>
            <Font ss:FontName="sans-serif" ss:Size="10.0" ss:Color="#000000"/>
            <NumberFormat ss:Format="[$-409]MMM d, yyyy"/>
        </Style>
        <Style ss:ID="23">
            <Alignment ss:Horizontal="Left" ss:Vertical="Top" ss:WrapText="1"/>
            <Borders>
                <Border ss:Position="Bottom"/>
                <Border ss:Position="Top" ss:LineStyle="Continuous" ss:Weight="2" ss:Color="#cccccc"/>
                <Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="2" ss:Color="#cccccc"/>
                <Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="2" ss:Color="#cccccc"/>
                <Border ss:Position="DiagonalLeft"/>
            </Borders>
            <Font ss:FontName="sans-serif" ss:Size="10.0" ss:Color="#000000"/>
            <NumberFormat ss:Format="[$-409]MMM d, yyyy"/>
        </Style>
        <Style ss:ID="22">
            <Alignment ss:Horizontal="Left" ss:Vertical="Top" ss:WrapText="1"/>
            <Borders>
                <Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="2" ss:Color="#cccccc"/>
                <Border ss:Position="Top" ss:LineStyle="Continuous" ss:Weight="2" ss:Color="#cccccc"/>
                <Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="2" ss:Color="#cccccc"/>
                <Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="2" ss:Color="#cccccc"/>
                <Border ss:Position="DiagonalLeft"/>
            </Borders>
            <Font ss:FontName="sans-serif" ss:Size="10.0" ss:Color="#ffffff"/>
            <Interior ss:Color="#808080" ss:Pattern="Solid"/>
        </Style>
        <Style ss:ID="21">
            <Alignment ss:Horizontal="Left" ss:Vertical="Top" ss:WrapText="1"/>
            <Borders>
                <Border ss:Position="Bottom"/>
                <Border ss:Position="Top" ss:LineStyle="Continuous" ss:Weight="2" ss:Color="#cccccc"/>
                <Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="2" ss:Color="#cccccc"/>
                <Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="2" ss:Color="#cccccc"/>
                <Border ss:Position="DiagonalLeft"/>
            </Borders>
            <Font ss:FontName="sans-serif" ss:Size="10.0" ss:Color="#ffffff"/>
            <Interior ss:Color="#808080" ss:Pattern="Solid"/>
        </Style>
        <Style ss:ID="20">
            <Alignment ss:Horizontal="Left" ss:Vertical="Top" ss:WrapText="1"/>
            <Borders>
                <Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="2" ss:Color="#cccccc"/>
                <Border ss:Position="Top" ss:LineStyle="Continuous" ss:Weight="2" ss:Color="#cccccc"/>
                <Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="2" ss:Color="#cccccc"/>
                <Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="2" ss:Color="#cccccc"/>
                <Border ss:Position="DiagonalLeft"/>
            </Borders>
            <Font ss:FontName="sans-serif" ss:Size="10.0" ss:Color="#000000"/>
        </Style>
    </Styles>
    <Names>
        <NamedRange ss:Name="__bookmark_1" ss:RefersTo="Report!R1C1:R11C8"/>
    </Names>

<Worksheet ss:Name="Report">
    <ss:Table>
        <ss:Column ss:Width="76.416" ss:AutoFitWidth="0"/>
        <ss:Column ss:Width="49.536" ss:AutoFitWidth="0"/>
        <ss:Column ss:Width="66.688" ss:AutoFitWidth="0"/>
        <ss:Column ss:Width="66.816" ss:AutoFitWidth="0"/>
        <ss:Column ss:Width="66.688" ss:AutoFitWidth="0"/>
        <ss:Column ss:Width="66.816" ss:AutoFitWidth="0"/>
        <ss:Column ss:Width="76.416" ss:AutoFitWidth="0"/>
        <ss:Column ss:Width="81.024" ss:AutoFitWidth="0"/>
        <ss:Column ss:Width="25.6" ss:AutoFitWidth="0"/>
        <Row ss:AutoFitHeight="1">
            <Cell ss:Index="1" ss:StyleID="20"/>
            <Cell ss:Index="2" ss:StyleID="20"/>
            <Cell ss:Index="3" ss:StyleID="20"/>
            <Cell ss:Index="4" ss:StyleID="20"/>
            <Cell ss:Index="5" ss:StyleID="20"/>
            <Cell ss:Index="6" ss:StyleID="20"/>
            <Cell ss:Index="7" ss:StyleID="20" ss:MergeAcross="1"/>
        </Row>
        <Row ss:AutoFitHeight="0" ss:Height="32.25">
            <Cell ss:Index="1" ss:StyleID="22">
[…]
            <Cell ss:Index="7" ss:StyleID="28">
                <Data ss:Type="Number">1943478.0</Data>
            </Cell>
            <Cell ss:Index="8" ss:StyleID="28">
                <Data ss:Type="Number">0.0</Data>
            </Cell>
        </Row>
    </ss:Table>
    <WorksheetOptions xmlns="urn:schemas-microsoft-com:office:excel">
        <PageSetup>
            <PageMargins x:Bottom="0.25" x:Left="0.25" x:Right="0.25" x:Top="0.25"/>
            <Header/>
            <Footer/>
        </PageSetup>
        <Print>
            <PaperSizeIndex>9</PaperSizeIndex>
        </Print>
    </WorksheetOptions>
</Worksheet>
</Workbook>

Qu'est-ce que c'est que ce format (à part que c'est du XML…)

Je sens qu'il y a un problème parce qu'à d'autres endroits de l'application, en lieu et place d'un format Excel il me génère carrément du HTML même pas valide : juste un <table> … </table>, qui mélange caractères accentués ISO8859-1 et entités HTML, le tout sur une seule ligne pour faire bonne mesure /o\

Dans les deux cas ça fait le job mais ça me paraît très crado et je voudrais comprendre ce qui ne va pas.

  • # changer l'extension

    Posté par  . Évalué à 1.

    Bonsoir,
    En renommant le fichier avec l'extension .xlsx est-ce que ça fonctionne ?
    C'est théoriquement l'extension pour les fichiers au format OOXML.

    • [^] # Re: changer l'extension

      Posté par  . Évalué à 2.

      J'y ai pensé tout de suite, j'ai essayé et ça fait pareil. J'essaierai à nouveau demain pour être sûr (ça ce trouve j'ai mis .xlxs ou autre…)

      • [^] # Re: changer l'extension

        Posté par  . Évalué à 3.

        En fait les fichiers OOXML sont des archives ZIP compressées (méthode deflate).
        Il faudrait partir d'un fichier .xlsx valide (même vide, peu importe), puis dans l'archive, dans le sous-répertoire xl, il faut remplacer le contenu du fichier workbook.xml par les données produites par ton application.

        Il faut recompresser le tout, et l'ouvrir avec Excel… Toujours très simple chez Microsoft !

        Je n'ai pas fait le test, après tout dépend si les données sont valides au départ ou non.

        Pour éviter les problèmes d'archive, il faudrait prendre le temps de chercher s'il existe une version flat du format OOXML, à l'instar des formats .fodt ou .fods chez LibreOffice.

        • [^] # Commentaire supprimé

          Posté par  . Évalué à 4.

          Ce commentaire a été supprimé par l’équipe de modération.

          • [^] # Re: changer l'extension

            Posté par  . Évalué à 3. Dernière modification le 06 mars 2015 à 11:01.

            Je reconnais que l'attaque est déplacée ici, effectivement l'origine des problèmes vient de l'application qui ne fait pas entièrement son boulot, ou qui a choisi le mauvais format de fichier. Mea culpa.

            Mais mon « attaque » n'est pas gratuite.
            Comme je l'ai dit dans mon commentaire précédent, la norme opendocument a prévu une version « flat » de ses fichiers : un unique fichier XML, qui regroupe tout : styles, options, contenu… et qui est éditable dans n'importe quel éditeur de texte.

            À mon sens cette possibilité rend ce format plus facile à manipuler. Perso, je m'en sers souvent : je suis prof, alors je crée un contrôle qui me sert de modèle, puis après je peux créer des contrôles personnalisés pour chaque élève, en remplaçant quelques parties du contenu.

            Et dans le format OOXML (qui est entièrement le bébé de Microsoft), je n'ai peut-être pas assez cherché, mais je n'ai pas trouvé cette fonctionnalité. Pour un programmeur aguerri, le fait de travailler avec des archives ne complique peut-être pas trop les choses.
            Pour moi, c'est un obstacle supplémentaire, dont je suis très content de me passer.

  • # XLSX (word 2007 et superieur)

    Posté par  . Évalué à 3.

    bienvenu dans les formats microsoft,
    ca ressemble à de l'excel (.xls) mais en fait c'est du OOXML qui devrait avoir l'extension .xlsx

    du coup, soit c'est l'appli qui est pourrie et qui fait mal son export (en nommant le fichier .xls au lieu de .xlsx)
    soit c'est un probleme entre la chaise et le clavier, l'utilisateur saisissant le nom.xls au lieu de nom.xlsx

  • # Merci à tous

    Posté par  . Évalué à 2. Dernière modification le 10 mars 2015 à 13:32.

    Merci pour vos explications j'y vois plus clair !

    • export_moisi.xls -> le fichier s'ouvre dans Excel 2010 malgré un message d'avertissement.

    • renommage en export_moisi.xlsx -> message d'erreur et le fichier ne s'ouvre pas (lol)

    • création d'un classeur vierge et ouverture dans 7zip, on s'approche, je vois que dans un répertoire il y a un fichier workbook.xml et un fichier style.xml, si je remplace le workbook.xml par mon fichier moisi ça ne s'ouvre pas, Excel me dit que le fichier est corrompu…

    J'ai cherché dans Excel si un autre format d'enregistrement correspondait plus à mon fichier_moisi.xls (un format « flat » mélangeant données et styles dans un seul fichier XML) ça n'a pas l'air d'exister…

    Je vais pas chercher plus loin je risquerais de me faire de bulles au cerveau…

    Je suis sidéré que l'entreprise ADVIM arrive à vendre un produit aussi mal réalisé et surtout attristé que mon entreprise l'achète :( (il n'y a pas que ce problème d'export je précise…)

    NdM: commentaire réédité avec l'accord de l'auteur

    • [^] # Re: Merci à tous

      Posté par  . Évalué à 4.

      Je suis sidéré qu'une entreprise arrive à vendre un produit aussi mal réalisé et surtout attristé que mon entreprise l'achète :( (il n'y a pas que ce problème d'export je précise…)

      Les liens de second niveau de la rubrique nos solutions sont pourtant explicites !

      Titre de l'image

      :D

      • [^] # Re: Merci à tous

        Posté par  . Évalué à 3. Dernière modification le 10 mars 2015 à 13:33.

        J'ai regardé le code source de l'application (enfin si on peut appeler ça une application), ça fait vraiment peur (et pourtant je ne suis pas développeur professionnel).

        NdM: commentaire réédité avec l'accord de l'auteur

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.