IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

Copie de modèle Excel corrompue


Sujet :

C#

  1. #1
    Membre à l'essai
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juin 2008
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Juin 2008
    Messages : 19
    Points : 15
    Points
    15
    Par défaut Copie de modèle Excel corrompue
    Bonjour bonjour,

    Après deux demi-journées de recherche sur le net, je me résout à venir demander un petit coup de pouce sur le forum

    Voilà mon problème, je stock un modèle excel (format .xltm) sur mon serveur que je souhaites importer en local. J'utilise donc pour cela le code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    public static byte[] GetFichierExcel(string pathFichier)
    {
         // Ouverture d'un flux à partir du fichier sur le serveur
         FileStream fileStream = (new FileStream(pathFichier, FileMode.Open, FileAccess.Read, FileShare.Read));
         // Création d'un tableau d'octets de la taille du flux
         var buffer = new byte[fileStream.Length];
         // Alimentation du tableau à partir du flux
         fileStream.Read(buffer, 0, (int)fileStream.Length);
         // Fermeture du flux
         fileStream.Close();
     
         return buffer;
    }
    Jusque là pas de souci. Je file ensuite le tableau de byte à une fonction pour créer le fichier en local :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Fichier.CreerFichier(pathLocal, buffer);
    Je vois bien le fichier se créer dans mon arborescence et lorsque je tente de l'ouvrir dans mon code pour l'ajouter en tant que modèle :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    xlApp = new Microsoft.Office.Interop.Excel.Application();
    xlWorkBook = xlApp.Workbooks.Add(pathModelLocal);
    Il me renvoie l'erreur : Exception de HRESULT : 0x800A03EC

    Et quand j'ouvre le fichier créé en double-cliquant dessus, il m'annonce qu'Excel a rencontré du contenu illisible...

    Pour les tests, j'ai donc essayé d'utiliser mon modèle de base et de le copier/coller à la main en local, et à ce moment là pas de souci, mon code le prend bien et tout s'éxecute normalement

    J'en vient donc à penser que je dois faire quelque-chose de mal lors de la lecture du fichier sur le serveur pour aller le créer en local... Une idée ?

    Merci d'avance !

  2. #2
    Membre habitué Avatar de Zeckard
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2012
    Messages
    108
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2012
    Messages : 108
    Points : 183
    Points
    183
    Par défaut
    Bonjour !

    Essaie de rajouter ça :

    Citation Envoyé par El-Toro Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    public static byte[] GetFichierExcel(string pathFichier)
    {
         // Ouverture d'un flux à partir du fichier sur le serveur
         FileStream fileStream = (new FileStream(pathFichier, FileMode.Open, FileAccess.Read, FileShare.Read));
         // Création d'un tableau d'octets de la taille du flux
         var buffer = new byte[fileStream.Length];
    
         fileStream.Seek(0, SeekOrigin.Begin);
    
         // Alimentation du tableau à partir du flux
         fileStream.Read(buffer, 0, (int)fileStream.Length);
         // Fermeture du flux
         fileStream.Close();
    
         return buffer;
    }

  3. #3
    Membre à l'essai
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juin 2008
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Juin 2008
    Messages : 19
    Points : 15
    Points
    15
    Par défaut
    Hello Zeckard

    Pas mieux, même erreur et le fichier contient toujours du contenu illisible quand je tente de l'ouvrir

  4. #4
    Membre habitué Avatar de Zeckard
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2012
    Messages
    108
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2012
    Messages : 108
    Points : 183
    Points
    183
    Par défaut
    Une fois que tu as copié ton fichier. Au lieu de l'ouvrir avec ton code, essaie de l'ouvrir à la main. Regarde s'il est corrompu à ce moment là. S'il ne l'est pas quand tu l'ouvres à la main c'est que le problème ne vient pas de la copie.

    Cette erreur peut aussi provenir de versions différentes d'Excel. Avec quelle version a été fait ton modèle ? Est-ce la même version en local ?

  5. #5
    Membre à l'essai
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juin 2008
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Juin 2008
    Messages : 19
    Points : 15
    Points
    15
    Par défaut
    C'est ce que je fais oui, je l'ouvre à la main et le message exact est "Excel a rencontré du contenu illisible dans "nomDuFichier.xltm". Voulez-vous récupérer le contenu de ce classeur ? Si la source de ce classeur est fiable, cliquez sur Oui." Donc déjà ici on assiste à un blocage d'Excel, et si je clique sur "Oui", j'ai "Le classeur ne peut pas être ouvert ni réparé par Microsoft Excel car il est corrompu." Mais ces messages s'affichent seulement pour le fichier qui a été créé, alors que l'original ne pose aucun problème quand je l'ouvre manuellement.

    En ce qui concerne les versions, j'ai créé le modèle sous Excel 2010 à la base. Je l'ai ensuite stocké sur le serveur, et chez moi j'ouvre bien entendu le modèle sous Excel 2010 aussi. Je vais essayer de recréer le fichier quand même une nouvelle fois, malheureusement je ne peux pas tester avec une version d'Excel inférieure à la mienne... Je te tiens au jus

  6. #6
    Membre à l'essai
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juin 2008
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Juin 2008
    Messages : 19
    Points : 15
    Points
    15
    Par défaut
    Bon ce n'est pas ça non plus...

    J'ai essayé en recréant un fichier from scratch au format .xltm et .xltx au cas où mais même résultat

  7. #7
    Membre habitué Avatar de Zeckard
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2012
    Messages
    108
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2012
    Messages : 108
    Points : 183
    Points
    183
    Par défaut
    Bon, je ne sais pas si ça changera grand chose mais quand je fais quelque chose comme ça, je passe par un MemoryStream. (A mon avis ça ne change rien)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    public static byte[] GetFichierExcel(string pathFichier)
    {
            MemoryStream l_MemoryStream = new MemoryStream();
     
            using (FileStream l_FileStream = new FileStream(pathFichier, FileMode.Open, FileAccess.Read))
            {
              byte[] l_Abytes = new byte[l_FileStream.Length];
              l_FileStream.Read(l_Abytes, 0, (int)l_FileStream.Length);
              l_MemoryStream.Write(l_Abytes, 0, (int)l_FileStream.Length);
            }
     
            return l_MemoryStream.ToArray();
    }
    Peux on voir, s'il te plaît, le code de la méthode CreerFichier ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Fichier.CreerFichier(pathLocal, buffer);

  8. #8
    Membre à l'essai
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juin 2008
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Juin 2008
    Messages : 19
    Points : 15
    Points
    15
    Par défaut
    J'ai essayé avec ton code mais effectivement cela ne change rien.

    Je pense que tu as pointé le problème, le souci vient surement de mon code pour la méthode CreerFichier que voici :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
            public static void CreerFichier(string nomFichier, Byte[] buffer)
            {
                string path = Path.GetDirectoryName(nomFichier);
     
                if (!Directory.Exists(path))
                    Directory.CreateDirectory(path);
     
                FileStream fileStream = new FileStream(nomFichier, FileMode.Create);
                fileStream.Write(buffer, 0, buffer.Length - 1);
                fileStream.Close();
            }
    Peut-être que je devrais essayer de lancer le processus Excel et sauvegarder le fichier depuis le flux si c'est possible. Au moins, il sera formaté correctement.

  9. #9
    Membre habitué Avatar de Zeckard
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2012
    Messages
    108
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2012
    Messages : 108
    Points : 183
    Points
    183
    Par défaut
    Essaie ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
            public static void CreerFichier(string nomFichier, Byte[] buffer)
            {
                string path = Path.GetDirectoryName(nomFichier);
     
                if (!Directory.Exists(path))
                    Directory.CreateDirectory(path);
     
                FileStream fileStream = new FileStream(nomFichier, FileMode.Create, FileAccess.ReadWrite);
                fileStream.Write(buffer, 0, buffer.Length);
                fileStream.Close();
            }

  10. #10
    Membre à l'essai
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juin 2008
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Juin 2008
    Messages : 19
    Points : 15
    Points
    15
    Par défaut
    J'ai trouvé !!!

    Finalement j'ai utilisé :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    File.WriteAllBytes(pathModelLocal, tableauDeBytes);
    Pour créer mon fichier depuis mon tableau de bytes, et ça fonctionne parfaitement !

    Merci Zeckard de m'avoir mis sur la voix en tout cas et pour ceux qui auraient le même problème, je passe le poste en résolu.

    Edit : Et effectivement si j'enlevais le -1 sur la taille du buffer dans la méthode ça fonctionne aussi... Je me suis dit que, étant donné qu'il partait de 0, il fallait enlever 1 pour avoir la taille totale... Erreur !

  11. #11
    Membre habitué Avatar de Zeckard
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2012
    Messages
    108
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2012
    Messages : 108
    Points : 183
    Points
    183
    Par défaut
    Le problème venait de cette ligne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fileStream.Write(buffer, 0, buffer.Length - 1);
    Tu n'écrivais pas ton tableau entièrement, d'où les données corrompu.

    De rien et bonne continuation.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Fichier excel corrompu apres copie
    Par jaudurier dans le forum Maven
    Réponses: 6
    Dernier message: 03/07/2007, 10h57
  2. [VBA][Excel] Avec les modèles Excel.
    Par mulanzia2003 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 19/08/2006, 10h27
  3. VBA 'copie de fiers excel ou access
    Par VBBBA dans le forum Macros et VBA Excel
    Réponses: 22
    Dernier message: 02/07/2006, 18h17
  4. [VBA-E]Copie graphique de excel vers word
    Par conconbrr dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 21/02/2006, 10h49
  5. [VBA-E]copie de feuille excel
    Par ogenki dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 06/02/2006, 14h20

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo