2011-01-03 4 views
2

Ich versuche, die COM-Interop-Assembly zu verwenden, um einige Daten in eine Excel-Arbeitsmappe für eine ASP.NET-Webanwendung zu exportieren. Dies funktioniert in der Entwicklung gut, da der Server und der Client die gleiche Maschine sind. Dies ist jedoch nicht der Fall. Die bereitgestellte Version löst keine Ausnahme aus, öffnet aber auch nicht Excel auf dem lokalen Computer (da ASP.NET serverseitig ausgeführt wird, ist dies ziemlich offensichtlich).Öffnen einer Excel-Anwendung clientseitig

Wie gehe ich beim Erstellen einer Excel-Anwendung auf dem Client-Rechner vor?

Antwort

3

Sie müssen die Excel-Datei Server-Seite generieren, dann senden Sie die Bytes mit dem entsprechenden MIME an den Client Geben Sie ein, damit der Client herausfinden kann, wie er geöffnet wird.

So etwas ...

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); 

wo fileName Sie den Namen für die Datei wollen, ist, und bytes ist die Ausgabe von Ihrem Excel-Generator in byte[] Form.

Beachten Sie, dass dies nicht wirklich erzwingt Excel öffnen oder ähnliches, es präsentiert nur den Inhalt des Clients in dem bestmöglichen Format für den Client, um es in Excel zu öffnen. Der Benutzer muss auf "Öffnen" klicken und wenn sie Excel installiert haben, wird es die Standardanwendung sein, um die Datei zu öffnen.

Wenn der Client kein Excel hat oder seine MIME-Typen nicht zugeordnet sind, wird es nicht funktionieren. Ohne irgendeinen verrückten activex voodoo (den ich nicht empfehle) wirst du nicht in der Lage sein, "für sie zu öffnen".

+0

+1 haben möchten - Dies ist das Beste, was Sie tun können –

+2

Seitliche Anmerkung, COM Interop mit den Office-DLLs ist eine wirklich schlechte Möglichkeit, Excel-Dateien auf einem Server zu generieren. Darüber hinaus ist Office nicht wirklich für diese Verwendung lizenziert. Ich empfehle eine Bibliothek wie NPOI oder ExcelLibrary, um Ihre Dateien zu generieren. – Brook

+0

Dies wurde in [Überlegungen für die serverseitige Automatisierung von Office - KB 257757] (http://support.microsoft.com/kb/257757) dokumentiert. –

0

Klingt wie eine große potenzielle Sicherheitslücke, wenn Sie mich fragen!

Ein Ansatz könnte sein, ein ActiveX Excel-Steuerelement zu starten? (ActiveX ist nur ein Marketingbegriff für ein COM-Objekt). Ich bin nicht vertraut mit ASP.NET, also weiß ich nicht, wie dies über die Server/Client-Grenze funktionieren würde.

Ein einfacherer und sicherer Ansatz wäre es, eine CSV-Datei zu erstellen und über den Standard http zu senden. Der Benutzer könnte das in Excel öffnen. Es wäre in Ordnung für ein einzelnes Datenblatt, aber nicht für komplexe Dinge mit Makros, Formatierung usw.

+0

Das Problem lade ich bin vor hier ist, dass ich mehrere Arbeitsblätter, Formatierungen etc. –

2

KEIN COM INTEROP VERWENDEN !!!

Es gibt eine viel bessere Möglichkeit: EPPlus

Wenn Excel auf dem Server öffnet es wird eine Kopie der Excel-Laufen zu halten. Schrecklich. Mit EPPlus können Sie native Excel 2007/2010 Arbeitsblätter mit Diagrammen und allem erstellen. Und ohne Office auf dem Server selbst installiert zu haben. Wir benutzen es, ziemlich glatt.

Wenn die Kunden haben Excel 2007 oder besser nicht, können sie die compatibility pack from microsoft.

+0

Ich habe überlegt, eine Open-Source-Bibliothek zu verwenden. Das Schöne an COM-Interop ist, dass es einfach zu verwenden ist, wenn Sie mit dem Schreiben von Excel-Makros vertraut sind.Kann man davon ausgehen, dass EPPlus genauso einfach zu bedienen ist? –

+2

@Tyler Die Lizenzprobleme allein sollten Sie davon abhalten, COM Interop mit Office auf einem Server zu verwenden, und das geht nicht einmal auf die Leistungsprobleme ein, die Chris oben erwähnt. Ja, Sie müssen möglicherweise eine andere Bibliothek lernen, um Ihre Dateien zu erstellen, aber das ist es, was Sie tun müssen, um es klar zu halten. – Brook

+0

@Brook: Ich bin mir bewusst, dass Interop nicht die beste Lösung ist. An dieser Stelle frage ich mich nur, was die beste API von Drittanbietern ist. –