Ouvrir un document Word en c#

Signaler
Messages postés
66
Date d'inscription
mardi 8 mars 2005
Statut
Membre
Dernière intervention
30 septembre 2008
-
Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
-
A l'aide,

Je bloque sur un problème depuis quelques jours et j'ai besoin de vos precieux conseils.

J'ai une appli asp.net qui affiche un datagrid sur ma page web.
Ce datagrid affiche une liste de documents que l'on devrait pouvoir selectionner pour les ouvrir mais cela me pose problème.

Voici mon code dans ma page aspx :

<asp:datagrid
id= "dataGridHelpGuides"
runat="server"
DataKeyField="ID"
AllowSorting="True" AutoGenerateColumns="False"
AllowPaging="True"
GridLines="None"
CellPadding="1"
PageSize="5"
ShowFooter="True">
   <HeaderStyle
Font-Italic="True"
HorizontalAlign="Center"
VerticalAlign="Top"></HeaderStyle>
      <Columns>
         <asp:TemplateColumn
SortExpression="FileName">
            <HeaderStyle
Width="380px"></HeaderStyle>
            <ItemTemplate>
               <asp:LinkButton
id="LinkGridFileName"
runat="server"
CommandName="OpenFile">
                    <asp:Label
ID=GridFileName
runat=server></asp:Label>
               </asp:LinkButton>
            </ItemTemplate>
         </asp:TemplateColumn>
         [...]
    </Columns>
<PagerStyle
CssClass="pageSelected"
VerticalAlign="Bottom"
PageButtonCount="4"
Mode="NumericPages"></PagerStyle>
</asp:datagrid>

Et le code de la page aspx.cs :

   private
void dataGridHelpGuides_ItemCommand(
object source, System.Web.UI.WebControls.
DataGridCommandEventArgs e)
   {
         if (e.Item.ItemType ListItemType.Item || e.Item.ItemType
ListItemType.AlternatingItem)
         {
               
if (e.CommandName ==
"OpenFile")
               {
                        OpenFileWithID(dataGridHelpGuides.DataKeys[(
int)e.Item.ItemIndex].ToString());
               }
          }
     }

   private
void OpenFileWithID(
string id)
   {
         
DBManager dbManager;
         dbManager =
new
DBManager(
AppConfigEntries.CentralDatabase.Value);
         OpenFileWithID(id, dbManager);
   }

   private
void OpenFileWithID(
string id,
DBManager dbManager)
   {
      Word.
_Application aWord;
      Word.
_Document aDoc;
      aWord =
new Word.
Application();
      aWord.Visible =
true;
// faire apparaître Word
      object fileName =
@"c:\test.doc";

      object o =
Type.Missing;
      aDoc = aWord.Documents.Open(
ref fileName,
ref o,
ref o,
ref o,
ref o,
ref o,
ref o,
ref o,
ref o,
ref o,
ref o,
ref o,
ref o,
ref o,
ref o,
ref o);
   }

J'ai bien ajouté ma réference mais cela me retourne le message :

Retrieving the COM class factory for component with CLSID {000209FF-0000-0000-C000-000000000046} failed due to the following error: 80070005.
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.

Exception Details: System.UnauthorizedAccessException: Retrieving the COM class factory for component with CLSID {000209FF-0000-0000-C000-000000000046} failed due to the following error: 80070005.

ASP.NET is not authorized to access the requested resource. Consider granting access rights to the resource to the ASP.NET request identity. ASP.NET has a base process identity (typically {MACHINE}\ASPNET on IIS 5 or Network Service on IIS 6) that is used if the application is not impersonating. If the application is impersonating via , the identity will be the anonymous user (typically IUSR_MACHINENAME) or the authenticated request user.

To grant ASP.NET access to a file, right-click the file in Explorer, choose "Properties" and select the Security tab. Click "Add" to add the appropriate user or group. Highlight the ASP.NET account, and check the boxes for the desired access.

Source Error:

Line 527:                    Word._Application aWord;
Line 528:                    Word._Document aDoc;
Line 529:                    aWord   = new Word.Application();

Line 530:                    aWord.Visible = true; // faire apparaître Word
Line 531:



J'ai ajouté "" dans mon web.config mais sans succès...
Merci par avance si vous avez une solution.

3 réponses

Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
93
Salut,

Le compte utilisé par le processus hébergeant l'application web n'a pas les droits nécessaires.
Mais de manière générale utiliser l'automation Office côté serveur dans un contexte Web est relativement suicidaire, et non supporté.

/*
coq
MVP Visual C#
CoqBlog
*/
Messages postés
66
Date d'inscription
mardi 8 mars 2005
Statut
Membre
Dernière intervention
30 septembre 2008

Ok, j'ai donc changé de façon de faire, j'enregistre le document dans ma base de données et lorsque je clic sur le nom de mon document je souhaite que celui-ci s'ouvre de cette façon:

private

void OpenFileWithID(
string id,
DBManager dbManager)
{

      DataRow row = dbManager.GetData(
"select fileName,Data from HelpGuides where ID = " + id).Rows[0];
      Response.ClearHeaders();
      Response.CacheControl =
"private";
      Response.ContentType =
"text/xml";
      Response.WriteFile(row["Data"]);

      
Response.End();
}

mais ça ne fonctionne pas, comment dois-je proceder?
Me manque-t-il quelque-chose?
Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
93
Yep, la lecture de la doc de HttpResponse.WriteFile ;-)
Si tu as les données du fichier, regarde plutôt du côté de la propriété OutputStream.

Sinon ne fais pas de construction de requêtes par concaténation, utilises des requêtes paramétrées :
http://www.csharpfr.com/tutoriaux/UTILISATION-REQUETES-PARAMETREES-AVEC-ADO-NET_709.aspx
http://www.csharpfr.com/tutoriaux/COMMENT-FAIRE-REQUETE-PARAMETREE-DANS-BASE-DONNEE_710.aspx

/*
coq
MVP Visual C#
CoqBlog
*/