2011-01-03 6 views
2

J'essaie d'utiliser l'assembly COM Interop pour exporter des données vers un classeur Excel pour une application Web ASP.NET. Cela fonctionne bien dans le développement, puisque le serveur et le client sont la même machine. Cependant, lorsqu'il est déployé, ce n'est pas le cas. La version déployée ne lance pas d'exception, mais elle n'ouvre pas non plus Excel sur la machine locale (puisque ASP.NET est exécuté côté serveur, c'est assez évident).Ouverture d'une application côté client

Comment créer une application Excel sur la machine du client?

Répondre

3

Vous devrez générer le côté serveur de fichiers Excel, puis envoyer les octets au client en utilisant le MIME approprié tapez de sorte que le client puisse comprendre comment l'ouvrir.

Quelque chose comme ça ...

HttpContext.Current.Response.Clear(); 
HttpContext.Current.Response.AddHeader("content-disposition", string.Format("attachment; filename={0}", fileName)); 
HttpContext.Current.Response.ContentType = "application/ms-excel"; 
HttpContext.Current.Response.BinaryWrite(bytes); 

fileName est le nom que vous voulez pour le fichier et bytes est la sortie de votre générateur Excel sous forme byte[]. Notez que cela ne force pas vraiment Excel ouvert ou quelque chose comme ça, il présente juste le contenu au client dans le meilleur format possible pour le client de l'ouvrir en Excel. L'utilisateur devra cliquer sur "ouvrir" et s'ils ont excel installé, ce sera l'application par défaut pour ouvrir le fichier.

Si le client n'a pas excel, ou que leurs types MIME ne sont pas mappés, etc., cela ne fonctionnera pas. Sans un vaudou activx fou (que je ne recommande pas), vous n'allez pas pouvoir "ouvrir exceller pour eux".

+0

1 - C'est le meilleur que vous pouvez faire –

+2

Note de côté, COM Interop avec les DLL de bureau est un très mauvais moyen de générer des fichiers Excel sur un serveur. En outre, Office n'est pas vraiment autorisé pour cette utilisation de toute façon. Je recommande fortement une bibliothèque comme NPOI ou ExcelLibrary pour générer vos fichiers. – Brook

+0

Cela a été documenté dans [Considérations pour l'automatisation côté serveur d'Office - KB 257757] (http://support.microsoft.com/kb/257757). –

0

Cela ressemble à un gros trou de sécurité potentiel, si vous me demandez!

Une approche pourrait être de démarrer un contrôle ActiveX Excel? (ActiveX étant juste un terme marketing pour un objet COM). Je ne suis pas familier avec ASP.NET, donc je ne sais pas comment cela fonctionnerait sur les limites serveur/client.

Une approche plus simple et plus sûre consisterait à créer un fichier CSV et à l'envoyer via le protocole http standard. L'utilisateur pourrait l'ouvrir dans Excel. Ce serait bien pour une seule feuille de données, mais pas pour les choses complexes avec macros, formatage, etc

+0

Le problème que je suis face est ici, je voudrais avoir plusieurs feuilles de calcul, le formatage, etc. –

2

NE PAS UTILISER COM INTEROP !!!

Il y a une bien meilleure façon: EPPlus

Lors de l'ouverture Excel sur le serveur, il gardera une copie d'Excel en cours d'exécution. Horrible. EPPlus vous permettra de créer des feuilles de calcul Excel 2007/2010 avec des graphiques et tout. Et sans avoir installé le bureau sur le serveur lui-même. Nous l'utilisons, assez lisse.

Si les clients ne sont pas Excel 2007 ou mieux, ils peuvent télécharger le compatibility pack from microsoft.

+0

J'ai envisagé d'utiliser une bibliothèque open source. Ce qui est intéressant avec COM interop c'est qu'il est facile à utiliser si vous êtes familier avec l'écriture de macros Excel.Est-il sûr de supposer que EPPlus est aussi facile à utiliser? –

+2

@Tyler Les problèmes de licence à eux seuls devraient vous empêcher d'utiliser COM Interop avec Office sur un serveur, et cela ne va même pas dans les problèmes de performance mentionnés ci-dessus Chris. Oui, vous devrez peut-être apprendre une bibliothèque différente pour faire vos fichiers, mais c'est ce que vous devez faire pour le garder en clair. – Brook

+0

@Brook: Je suis conscient que Interop n'est pas la meilleure solution. À ce stade, je me demande quelle est la meilleure API tierce. –