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 :

OpenXmlSDK Libération des resources lié à la création d'un fichier word (docx)


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Étudiant
    Inscrit en
    Octobre 2006
    Messages
    59
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2006
    Messages : 59
    Par défaut OpenXmlSDK Libération des resources lié à la création d'un fichier word (docx)
    Bonjour,

    Je génère un Document Word (Docx avec l'OpenXmlSDK) sur un site en ASP.NET - C# avec la fonction ci-dessous.

    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
    18
    public void GenerateWordDoc(String filename, String societe)
        {
          using (WordprocessingDocument wordDoc =
            WordprocessingDocument.Create(filename, DocumentFormat.OpenXml.WordprocessingDocumentType.Document))
          {
            wordDoc.PackageProperties.Title = String.Format("Fiche synthèse - {0}", societe);
            wordDoc.PackageProperties.Creator = @"http://MySite";
     
     
            MainDocumentPart mainDocumentPart = wordDoc.AddMainDocumentPart();
            mainDocumentPart.Document = GenerateMainDoc();
     
            SetSectionProperty(mainDocumentPart);
     
            //wordDoc.Close();
            //wordDoc.Dispose();
          }
        }
    Lors du clique sur un bouton, j'exécute ma fonction. Elle créé mon fichier sur le disque et l'envoi par mail. Ensuite si juste ensuite je reclique sur le même bouton, j'obtiens d'erreur suivante.

    Le processus ne peut pas accéder au fichier 'C:\Temp\Fiche_synthese_xxxx.docx', car il est en cours d'utilisation par un autre processus.
    Dans ma fonction j'ai décommenter les méthodes Close et Dispose pour tester si cela résout le problème et la réponse est non.

    Mon fichier est toujours en cour d'utilisation par le Thread utilisé par le site je suppose. Même si les ressources sont censées être libérées à la fin du unsing...

    J'ai pensé et tenté de création un Thread séparé pour la création du fichier mais cela n'a pas fonctionner.

    Comment pensez-vous que je puisse résoudre ce bug?

    Merci d'avance.

  2. #2
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 489
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 489
    Par défaut
    Il faut libérer tous les objets, y compris "mainDocumentPart".

  3. #3
    Membre averti
    Étudiant
    Inscrit en
    Octobre 2006
    Messages
    59
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2006
    Messages : 59
    Par défaut
    Merci de t'intéresser à mon petit bug.

    J'ai mis:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    mainDocumentPart = null;
    Avant la fin du using mais cela n'y fait rien.
    De plus cet objet ne dispose ni de la fonction Close ni de la fonction Dispose.

  4. #4
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 489
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 489
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    mainDocumentPart = null;
    Ca sert à rien.

    Avez-vous vérifié que c'est bien votre programme qui utilise le fichier.
    Utilisez ProcessExplorer http://technet.microsoft.com/fr-fr/s.../bb896653.aspx

  5. #5
    Membre averti
    Étudiant
    Inscrit en
    Octobre 2006
    Messages
    59
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2006
    Messages : 59
    Par défaut
    Citation Envoyé par bacelar Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    mainDocumentPart = null;
    Ca sert à rien.
    => Je m'en doutais un peu mais il fallait que je test.


    Citation Envoyé par bacelar Voir le message
    Avez-vous vérifié que c'est bien votre programme qui utilise le fichier.
    Utilisez ProcessExplorer http://technet.microsoft.com/fr-fr/s.../bb896653.aspx
    => Je viens de le faire, oui c'est bien mon programme qui utilise le fichier. Le Webserver de Visual Studio 2008.

    Donc je ne libère pas la ressource associer à la création de mon fichier... Mais je pensais qu'avec le using ca suffirait à libérer avec l'appel à la méthode Dispose du wordDoc.

    Pour information: je développe avec Visual Studio 2008, je test mon site avec le WevServ intégré, le tout sous Windows XP. Je démarre mon site toujours depuis VS pour pouvoir avoir accès au debuggeur si ca plante.

  6. #6
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 489
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 489
    Par défaut
    Je n'ai plus accès à un office2007. Pouvez-vous vérifier que juste

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    public void GenerateWordDoc(String filename, String societe)
        {
          using (WordprocessingDocument wordDoc =
            WordprocessingDocument.Create(filename, DocumentFormat.OpenXml.WordprocessingDocumentType.Document))
          {
          }
        }
    Pose problème ?

    Sinon, ajoutez ligne par ligne jusqu'à trouvez la ligne qui ne libère pas le document.

    A la fin du using, la méthode Dispose est automatiquement appelée (via un finally). Normalement, la méthode Dispose appel Close.

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 27/10/2010, 14h34
  2. [Apache POI] création d'un fichier Word vide
    Par reeda dans le forum API standards et tierces
    Réponses: 0
    Dernier message: 10/03/2010, 18h08
  3. création d'un fichier word avec image comme entete
    Par eterneljob dans le forum Entrée/Sortie
    Réponses: 3
    Dernier message: 03/12/2009, 15h44
  4. Réponses: 1
    Dernier message: 04/05/2009, 20h01
  5. [DDE]Création d'un fichier Word
    Par cfidko dans le forum VBA Access
    Réponses: 2
    Dernier message: 30/03/2007, 08h49

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