Wie kann ein Word-Dokument in C # erstellt werden? [geschlossen]

73

Ich habe ein Projekt, in dem ich einen Berichtsexport im MS Word-Format generieren möchte. Der Bericht enthält Bilder / Grafiken, Tabellen und Text. Was ist der beste Weg, dies zu tun? Tools von Drittanbietern? Was sind deine Erfahrungen?

Schmidty
quelle
4
Dies sollte wieder geöffnet werden. Es ist nicht nur klar und nützlich, sondern wird auch mit anderen Fragen verknüpft, die als Duplikat davon gekennzeichnet sind.
DarenW

Antworten:

49

Die Antwort hängt geringfügig davon ab, ob die Anwendung auf einem Server oder auf dem Clientcomputer ausgeführt wird. Wenn Sie auf einem Server ausgeführt werden, sollten Sie eines der XML-basierten Office-Generierungsformate verwenden, da bei der Verwendung von Office Automation auf einem Server bekannte Probleme auftreten .

Wenn Sie jedoch auf dem Clientcomputer arbeiten, können Sie entweder Office Automation oder das Office Open XML-Format (siehe Links unten) verwenden, das von Microsoft Office 2000 und höher entweder nativ oder über Service Packs unterstützt wird. Ein Nachteil dabei ist jedoch, dass Sie möglicherweise einige Arten von Grafiken oder Bildern, die Sie anzeigen möchten, nicht einbetten können.

Der beste Weg, um Dinge zu erledigen, hängt davon ab, wie viel Zeit Sie in die Entwicklung investieren müssen. Wenn Sie sich für Office Automation entscheiden, gibt es einige gute Tutorials, die Sie über Google finden und die recht einfach zu erlernen sind. Das Open Office XML-Format ist jedoch ziemlich neu, sodass die Lernkurve möglicherweise etwas höher ist.

Office Open XML-Informationen

rjzii
quelle
6
Update ab 9/2011 ... Ich mache sowohl Interop als auch OpenXml und angesichts dieser Aufgabe würde ich in beiden Fällen unbedingt OpenXml verwenden. Dies ist die einzige Lösung, die absolut garantiert, dass Sie die absolute Kontrolle über die Ausgabe haben.
Chris B. Behrens
17

DocX-freie Bibliothek zum Erstellen von DocX-Dokumenten, aktiv entwickelt und sehr einfach und intuitiv zu bedienen. Da CodePlex im Sterben liegt, wurde das Projekt auf Github verschoben .

MadBoy
quelle
14

Ich habe die letzte Woche damit verbracht, mich mit Office Open XML vertraut zu machen . Wir haben eine Datenbankanwendung, die Umfragedaten speichert, die wir in Microsoft Word melden möchten. Sie können Word 2007 (docx) -Dateien in C # von Grund auf neu erstellen. Das Open XML SDK Version 2 enthält eine coole Anwendung namens Document Reflector, die tatsächlich den C # -Code bereitstellt, um ein Word-Dokument vollständig neu zu erstellen. Sie können Teile oder den gesamten Code verwenden und die Bits, die Sie ändern möchten, im laufenden Betrieb ersetzen. Die im SDK enthaltene Hilfedatei enthält auch einige gute Codebeispiele.

Office Interop oder andere Office-Software auf dem Server sind nicht erforderlich. Die neuen Formate sind 100% XML.

Peter Mortensen
quelle
10

Haben Sie darüber nachgedacht, .RTF als Alternative zu verwenden?

Es unterstützt das Einbetten von Bildern und Tabellen sowie von Text, wird standardmäßig mit Microsoft Word geöffnet, und obwohl das Feature-Set für etwas, das aussieht und sich anfühlt und sich wie ein Word-Dokument öffnet, eingeschränkter ist (zählen Sie alle erweiterten Formatierungen), ist es nicht weit entfernt.

Ihre Endbenutzer werden es wahrscheinlich nicht bemerken.

David Whitney
quelle
1
Bitte verwenden Sie kein RTF - die Spezifikation ist ein Chaos, selbst Microsoft folgt ihr nicht vollständig und weist viele Unklarheiten auf.
David Thielen
10

Ich habe festgestellt, dass Aspose Words das Beste ist, da nicht jeder Dateien im Office Open XML / *. Docx-Format öffnen kann und die Word-Interop- und Word-Automatisierung fehlerhaft sein kann. Aspose Words unterstützt die meisten Dokumentdateitypen ab Word 97.

Es ist eine kostenpflichtige Komponente, hat aber eine großartige Unterstützung. Die andere Alternative, wie bereits vorgeschlagen, ist RTF.

John
quelle
Ich habe festgestellt, dass Aspose Words bei der Arbeit mit OpenXml-Dokumenten etwas fehlt. Insbesondere ist die Behandlung von Inhaltssteuerelementen nahezu nutzlos und es können überhaupt keine AltChunk-Knoten verarbeitet werden.
Collin K
7

So generieren Sie Word-Dokumente mit Office Automation in .NET, insbesondere in C # oder VB.NET:

  1. Fügen Sie Ihrem Projekt den Microsoft.Office.Interop.Word- Assemblyverweis hinzu. Der Pfad lautet \ Visual Studio Tools für Office \ PIA \ Office11 \ Microsoft.Office.Interop.Word.dll .

  2. Folgen Sie dem Microsoft-Codebeispiel, das Sie hier finden: http://support.microsoft.com/kb/316384/en-us .

Marcello Belguardi
quelle
4

Schmidty, wenn Sie Word-Dokumente auf einem Webserver generieren möchten, benötigen Sie eine Lizenz für jeden Client (nicht nur für den Webserver). Siehe diesen Abschnitt im ersten Link, den Rob gepostet hat:

"Neben den technischen Problemen müssen Sie auch Lizenzierungsprobleme berücksichtigen. Aktuelle Lizenzierungsrichtlinien verhindern, dass Office-Anwendungen auf einem Server zur Bearbeitung von Clientanforderungen verwendet werden, es sei denn, diese Clients verfügen selbst über lizenzierte Kopien von Office. Verwenden der serverseitigen Automatisierung, um Office-Funktionen bereitzustellen Nicht lizenzierte Workstations fallen nicht unter die Endbenutzer-Lizenzvereinbarung (EULA). "

Wenn Sie die Lizenzanforderungen erfüllen, müssen Sie meiner Meinung nach COM Interop verwenden - genauer gesagt die primären Office XP-Interop-Assemblys .

Luke Girvin
quelle
3

Testen Sie VSTO (Visual Studio Tools für Office). Es ist ziemlich einfach, eine Word-Vorlage zu erstellen, eine XML-Dateninsel einzufügen und sie dann an den Client zu senden. Wenn der Benutzer das Dokument in Word öffnet, liest Word die XML-Datei, wandelt sie in WordML um und rendert sie. Sie sollten sich die ServerDocument-Klasse der VSTO-Bibliothek ansehen. Nach meiner Erfahrung ist keine zusätzliche Lizenz erforderlich.

Tänze mit Bambus
quelle
3

Ich habe gute Erfolge mit dem Syncfusion Backoffice DocIO erzielt, das die Formate doc und docx unterstützt.

In früheren Versionen hat es nicht alles in Word unterstützt, aber gemäß Ihrer Liste haben wir es mit Tabellen und Text als Seriendruck-Ansatz getestet und es hat gut funktioniert.

Ich bin mir jedoch nicht sicher über den Import von Bildern. Auf ihrer Klappentext-Seite http://www.syncfusion.com/products/DocIO/Backoffice/features/default.aspx heißt es

Blockquote Essential DocIO unterstützt das Einfügen von Skalar- und Vektorbildern in das Dokument in fast allen Formaten. Bitmap, GIF, PNG und TIFF sind einige der gängigen Bildtypen, die unterstützt werden.

Es lohnt sich also zu überlegen.

Wie andere bereits erwähnt haben, können Sie ein RTF-Dokument erstellen. Für .net gibt es einige gute RTF-Bibliotheken wie http://www.codeproject.com/KB/string/nrtftree.aspx

Jafin
quelle
3

Ich habe mich diesem Problem gestellt und eine kleine Bibliothek dafür erstellt. Es wurde in mehreren Projekten verwendet und dann habe ich beschlossen, es zu veröffentlichen. Es ist kostenlos und sehr, sehr einfach, aber ich bin sicher, es wird Ihnen bei der Aufgabe helfen. Rufen Sie die Office Open XML Library unter http://invoke.co.nz/products/docx.aspx auf .

Peter Mortensen
quelle
3

Ich habe eine Blogpost-Reihe über die Generierung von Open XML WordprocessingML-Dokumenten geschrieben . Mein Ansatz ist, dass Sie ein Vorlagendokument erstellen, das Inhaltssteuerelemente enthält, und in jedes Inhaltssteuerelement einen XPath-Ausdruck schreiben, der definiert, wie der Inhalt aus einem XML-Dokument abgerufen wird, das die Daten enthält, die den Dokumentgenerierungsprozess steuern. Der Code ist kostenlos und unter der Microsoft Reciprocal License (Ms-RL) lizenziert . In derselben Blogpost-Serie untersuche ich auch einen Ansatz, bei dem Sie C # -Code in Inhaltssteuerelementen schreiben. Der Dokumentgenerierungsprozess verarbeitet dann das Vorlagendokument und generiert ein C # -Programm, das die gewünschten Dokumente generiert. Ein Vorteil dieses Ansatzes ist, dass Sie jeden verwenden könnenDatenquelle als Datenquelle für den Dokumentgenerierungsprozess. Dieser Code ist auch unter der Microsoft Reciprocal License lizenziert.

Eric White
quelle
2

Ich mache gerade genau das.

Wenn das Dokument nicht sehr groß ist, keine Bilder und dergleichen enthält, speichere ich es als RTF mit # MergeFields # und ersetze sie einfach durch Inhalt, wobei ich das Ergebnis als RTF an den Benutzer sende.

Bei größeren Dokumenten, einschließlich Bildern und dynamisch eingefügten Bildern, speichere ich das ursprüngliche Word-Dokument erneut als einzelne Webseite * .mht-Datei, die # MergeFields # enthält. Ich mache dann das gleiche wie oben. Auf diese Weise kann ich problemlos eine DataTable mit einigen grundlegenden HTML-Tabellen-Tags rendern und eines der # MergeFields # durch eine ganze Tabelle ersetzen.

Bilder können auf Ihrem Server gespeichert und die URL auch in das Dokument eingebettet werden.

Interessanterweise handelt es sich bei den neuen Office 2007-Dateiformaten tatsächlich um Zip-Dateien. Wenn Sie die Erweiterung in .zip umbenennen, können Sie sie öffnen und deren Inhalt anzeigen. Dies bedeutet, dass Sie Inhalte wie Bilder mithilfe einer einfachen C # -Zip-Bibliothek ein- und ausschalten können sollten.

littlecharva
quelle
1

@ Dale Ragan: Das funktioniert für das Office 2003-XML-Format, ist aber nicht portierbar (wie beispielsweise DOC- oder DOCX-Dateien).

Um diese zu lesen / schreiben, müssen Sie das ActiveX-Steuerelement der Word-Objektbibliothek verwenden:

http://www.codeproject.com/KB/aspnet/wordapplication.aspx

Der Schlumpf
quelle
1

@Danny Smurf: Eigentlich beschreibt dieser Artikel, was das Office Open XML-Format wird, mit dem Rob geantwortet hat. Ich werde den Links, die ich jetzt poste, mehr Aufmerksamkeit schenken, um sicherzustellen, dass sie nicht veraltet sind. Ich habe tatsächlich nach WordML gesucht, wie es damals genannt wurde.

Ich glaube, dass das Office Open XML-Format der beste Weg ist.

Dale Ragan
quelle
1

LibreOffice unterstützt auch die kopflose Interaktion über die API. Leider gibt es derzeit noch nicht viele Informationen zu dieser Funktion .. :(

plaes
quelle
1

Sie können auch den Word-Dokumentgenerator verwenden. Es kann für die clientseitige oder serverseitige Bereitstellung verwendet werden. Aus der Projektbeschreibung:

WordDocumentGenerator ist ein Dienstprogramm zum Generieren von Word-Dokumenten aus Vorlagen mit Visual Studio 2010 und Open XML 2.0 SDK. WordDocumentGenerator hilft beim Generieren von Word-Dokumenten, die sowohl nicht aktualisierbar als auch aktualisierbar sind, basierend auf vordefinierten Vorlagen mit minimalen Codeänderungen. Inhaltssteuerelemente werden als Platzhalter für die Dokumentgenerierung verwendet. Es unterstützt Word 2007 und Word 2010.

Schnapp es dir: http://worddocgenerator.codeplex.com/

Laden Sie das SDK herunter: http://www.microsoft.com/en-us/download/details.aspx?id=5124

Ricardo
quelle
0

Eine andere Alternative ist Windward Docgen (Haftungsausschluss - ich bin der Gründer). Mit Windward entwerfen Sie die Vorlage in Word, einschließlich Bildern, Tabellen, Grafiken, Messgeräten und allem, was Sie möchten. Sie können Tags festlegen, in die Daten aus einer XML- oder SQL-Datenquelle eingefügt werden (einschließlich Funktionen wie forEach-Schleifen, Import usw.). Und dann generieren Sie den Bericht in DOCX, PDF, HTML usw.

David Thielen
quelle
2
Zu Ihrer Information, wenn ich auf eine Website für ein kommerzielles Produkt gehe und es scheint, dass sie den Preis verbergen, während sie ankündigen, dass es eine kostenlose Spur gibt, gehe ich automatisch davon aus, dass das Produkt wirklich teuer ist und die kostenlose Testversion nur ein Köder ist. Wenn Docgen verrückt teuer ist, haben Sie wahrscheinlich Recht, den Preis zu verbergen, aber ansonsten denke ich, dass es ein Fehler ist.
Steve Hiner
@SteveHiner - Wir haben dort Preisspannen (Suche nach Preis), aber wir haben die Preisliste heruntergenommen, weil ein erheblicher Prozentsatz der Zeit, in der Menschen missverstanden haben, was sie brauchten, und sich dann irregeführt fühlten. Wir verstehen es also besser, die Bedürfnisse von jemandem zu verstehen und ihnen dann den richtigen Preis zu geben.
David Thielen
1
@SteveHiner - Du hattest recht. Nachdem sich viele Leute beschwert haben, haben wir die Preise auf der Website veröffentlicht und versuchen, sie gut genug zu erklären, damit sie verstehen, was es für sie sein wird.
David Thielen