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

ASP.NET Discussion :

Ecrire dans Excel


Sujet :

ASP.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    118
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 118
    Par défaut Ecrire dans Excel
    Bonjour,

    Ma problématique est la suivante : récupérer des données dans une base SQL Server et modifier des fichiers Excels existants pour y écrire les données lues en base.

    J'ai essayé "l'automation", avec 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
            object oMiss = System.Reflection.Missing.Value;
            Excel.Application my_XLS_App = new Excel.ApplicationClass();
            Excel.Workbook my_XLS_Classeur = my_XLS_App.Workbooks.Open(fichier, oMiss, false, oMiss, oMiss, oMiss, oMiss, oMiss, oMiss, oMiss, oMiss, oMiss, oMiss, oMiss, oMiss);
            Excel.Worksheet my_XLS_Worksheet = (Excel.Worksheet)my_XLS_Classeur.ActiveSheet;
     
            // Ecrire
            //((Excel.Range)my_XLS_Worksheet.Cells[1, 1]).Value2 = "test";
            my_XLS_Worksheet.Cells[5, 3] = "Injection";
     
            // Fermer le fichier
            //my_XLS_App.DisplayAlerts = false;
            my_XLS_App.ActiveWorkbook.Save();
            my_XLS_App.ActiveWorkbook.Close(oMiss, oMiss, oMiss);
            my_XLS_App.Quit();
    Problème : bien que cela fonctionne dans Visual Studio en debug, une fois la solution publiée sur IIS, une exception est levée par la fonction open() :
    Détails de l'exception: System.Runtime.InteropServices.COMException: Microsoft Excel ne peut accéder au fichier « C:\inetpub\wwwroot\xdr.xls ». Plusieurs raisons sont possibles :

    • Le nom du fichier ou le chemin d'accès n’existe pas.
    • Ce fichier est actuellement utilisé par un autre programme.
    • Le classeur que vous essayez d’enregistrer porte le même nom qu’un classeur actuellement ouvert.
    J'ai donné tous les droits à tout le monde sur le dossier contenant les fichiers excel à modifier, mais l'erreur persiste.
    Les classeurs en questions ne sont bien sûr pas ouverts, ni d'autres portant le même nom.

    Dans le doute, j'ai ajouté une boucle pour tuer tous les process Excel, mais ca ne corrige pas le problème.

    J'ai vu que quelqu'un avait le même problème, mais je ne trouve pas "MS Excel Application" dans la liste DCOM.

    La configuration du serveur :
    Windows Server 2008
    Visuel Studio 2010
    .Net 4.0
    L'application pool du site IIS utilise ".Net 4.0 integrated" avec l'identité "LocalSystem".

    D'ailleurs, si je change l'identité du pool d'application par "Local Service", "Network Service" ou "ApplicationPoolIdentity", j'obtiens l'erreur :
    Retrieving the COM class factory for component with CLSID{00024500-0000-0000-C000-00000000046} failed due to the following error : 80070005 Access is denied.

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    118
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 118
    Par défaut
    Beaucoup de gens ont l'air d'avoir ce problème mais les (rares) solutions proposées ne résolvent pas mon souci. Manipuler Excel semble être assez bancal en fin de compte.

    J'ai tenté ADO.Net histoire de voir si ca marche mieux : même problème. Ca passe sous Visual mais pas dans IIS.

    Le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    	string cnxStr = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source='" + fichier + "';Extended Properties='Excel 12.0 Xml;HDR=NO;IMEX=1';";
            using (OleDbConnection cnx = new OleDbConnection(cnxStr))
            {
                cnx.Open();
                string cmdTxt = "update [Fonc1$C24:C24] set F1='Test'";
                using (OleDbCommand cmd = new OleDbCommand(cmdTxt, cnx))
                {
                    cmd.ExecuteNonQuery();
                }
            }
    lève l'exception : "L'operation doit utiliser une requête qui peut être mise à jour".
    Le fichier est toujours ouvert aux 4 vents pourtant (everyone, full control)

  3. #3
    Membre éclairé

    Profil pro
    Chef de Projet / Développeur
    Inscrit en
    Juin 2002
    Messages
    618
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de Projet / Développeur
    Secteur : Santé

    Informations forums :
    Inscription : Juin 2002
    Messages : 618
    Par défaut
    Bonjour,

    Si ton serveur est un tout petit peu sécurisé, tu ne peux pas ouvrir en lecture/écriture un fichier dans wwwroot. Ton problème vient probablement de la.
    (si j'en juge au message d'erreur qui indique un chemin C:\inetpub\wwwroot\xdr.xls )

    Il faut que ton fichier soit ailleurs sur le serveur.

    Personnellement, je place mes fichiers tout en dehors des dossiers IIS.
    Pour permettre à mes utilisateurs de les télécharger, j'utilise du code behind du type Response.WriteFile( "c:\MesData\test.xls")

    L'autre solution est de lever les droits sur un des sous-dossier de ton application (certainement pas la racine) pour que l'utilisateur asp puis y écrire. Il faut bien veillez à ce qu'un pirate ne puisse en aucun cas uploader un fichier asp dans ce dossier permettant l'écriture.
    Sinon ce pirate pourra appeler la page :
    http://tonsite.com/les_fichiers_xls/ma_page_pirate.aspx
    Et là, en s'exécutant, le code de cette page uploadée peut avoir accès à tout ton serveur ou presque.

    C'est pour cela que j'ai un dossier en dehors du contexte d'exécution d'asp. Et bien sur les droits de ce dossier sont réglés avec soin.


    Pour manipuler des fichiers Excel sur un serveur, regarde du coté d'EPPlus.
    Cela évite d'avoir a installer Excel sur le serveur et on peut faire à peu prêt tout ce que l'on veux.

    Je détaille un peu cette librairie dans ce post :

    http://www.developpez.net/forums/d13...el-avec-macro/

    J'aurais du mal à l’argumenter, mais Excel sur un serveur, ça ne me plait pas trop (sécurité, consommations des ressources si trop d'instance etc.)

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    118
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 118
    Par défaut
    Merci pour ta réponse, Vanquish.

    En fait, l'appli est dans un dossier à moi, sur un autre lecteur (D:\) Le message d'erreur vient d'une requete google, j'avais la flemme de le réécrire.
    Je vais regarder le lien que tu donnes, pour ma culture, mais le principe d’écrire dans Excel est bien galère, j'ai fini par utiliser un outil (Infragistics) et ses composants pour faire le boulot.

    Ca se passe bien, donc ...

    Sinon, je suis assez d'accord pour Excel sur le serveur, ce n'est pas sa place.

Discussions similaires

  1. ecrire dans excel
    Par philguio dans le forum Windows Forms
    Réponses: 8
    Dernier message: 26/07/2009, 22h46
  2. Ecrire dans Excel via DDE quand plusieurs fichiers Excel ouverts
    Par Lolly dans le forum ODS et reporting
    Réponses: 1
    Dernier message: 09/07/2009, 17h26
  3. ecrire dans excel
    Par jeanlucsl dans le forum VB 6 et antérieur
    Réponses: 24
    Dernier message: 03/12/2007, 14h07
  4. [VB.NET] Ecrire dans EXCEL 2002 depuis VB.net
    Par vijeo dans le forum Windows Forms
    Réponses: 4
    Dernier message: 13/06/2006, 13h09

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