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 :
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() :
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();
J'ai donné tous les droits à tout le monde sur le dossier contenant les fichiers excel à modifier, mais l'erreur persiste.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.
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.
Partager