DCOM-Konfigurationseinstellungen für Microsoft Interop-Word-Automatisierung
Ich bin mit Microsoft Office Interop Word
zum erstellen von Dokumenten mithilfe von C#. In Reihenfolge für die Generierung des Dokuments zu arbeiten, es sollte einen Eintrag für die "Microsoft Office Word 97 - 2003 Document"
unter der Dcom Config Settings
wie unten gezeigt:
Den Local Path
unter der General Tab
hat einen richtigen Weg, wenn Sie Microsoft Office zum ersten mal installiert. Wenn ich dann den Beitritt des Computers zu einer Domäne, und starten Sie das system mit einem Domain-Benutzer, die Local Path
leer wird und die Anwendung nicht erzeugen die Dokumente und gibt Fehler.
Selbst wenn ich den Beitritt des Computers zur Domäne zuerst und dann die Anmeldung mit Domänen-Benutzer und installieren Sie dann die Microsoft Office, die Local Path
richtig angezeigt wird und erst dann nach einem Neustart, es wird wieder blank. Während Sie zur gleichen Zeit, wenn ich die Anmeldung mit der Local User
, die Path
ist immer noch da.
Was die Ursache der Wert von Local Path
leer zu fahren?
Diese ganze setup ist auf virtuellen Maschinen und die word-automation arbeitet auf einem Domäne-Konto, wie ich gesehen habe, es funktioniert auf einem physischen Computer Mitglied der Domäne.
UPDATE: What my application is doing:
Gibt es 4-5 Komponenten in der Anwendung.
Das erste ist ein VSTO Word Add-in, integriert mit Microsoft Word, wo wir neue Dokumente erstellen, die enthalten einige Ausdrücke, die auch in der Datenbank gespeichert. Es gibt auch Bedingungen, auf die die Ausdrücke und Sie können verschachtelt werden, auch. Die Ausdrücke enthalten schema-Elemente aus den XSD-Dateien sind gespeichert in der Datenbank. Sobald diese Art von Dokument erstellt wird, wird seine WordML ist in der Datenbank gespeichert. Dies alles geschieht in VSTO AddIn.
Das zweite ist ein Web-Dienst, erhält eine xml-Eingabe von einer anderen Komponente, die bestätigt, dass die XSD-vor, aus denen der schema-Elemente waren eingebettet in die Ausdrücke im Dokument erstellt durch VSTO-addIn. Dieser web-service-checks für die Validierungen und eine Reihe anderer Aufgaben. Es bekommt dann die WordML das entsprechende word-Dokument aus der Datenbank und übergibt Sie an das Word-Interop-die Verwendung von APIs, durchläuft es rekursiv zu ersetzen, die der schema-Elemente mit den tatsächlichen Werten aus der Eingabe-xml an. Dieser speichert dann die von WordML zu einer Datei als word-Dokument.
Dies legt auch eine Vorlage, um das Dokument, bevor Sie es speichern. Es verwendet die SaveAs-Funktion von Word Interop, um auch speichern Sie die Datei als PDF.
UPDATE:
Ich habe auch wieder mitgemacht meine Bewerbung vollständig und kam zu wissen, dass tun wir alle Dinge, die durch das Parsen der Office Open XML (z.B. für die Fütterung der Eingang in das word-Dokument), aber nur die Dinge, die wir tun, mithilfe von Word Automation sind folgende:
- Über Word-Interop zum speichern der generierten WordML als eines der Word-Dateien im Format.
- Export der generierten WordML, um die PDF-Datei.
- Die Zusammenlegung mehrerer WordMLs in einem einzigen word-Dokument-Datei.
- Abrufen der XML für it.
Alle diese vier codes werden unten mit nur die relevanten Teile des Codes:
Microsoft.Office.Interop.Word.Document wordDocument = null;
object templateName = "templateFile.dotm";
wordDocument = this.WordApplication.Documents.Add(ref missing, ref missing, ref missing, ref missing);
wordDocument.Range(ref missing, ref missing).Text = "";
wordDocument.set_AttachedTemplate(ref templateName);
wordDocument = this.WordApplication.Documents.Open(
ref objSourceFilePath, ref oFalse, ref oTrue,
ref oMissing, ref oMissing, ref oMissing,
ref oMissing, ref oMissing, ref oMissing,
ref oMissing, ref oMissing, ref oMissing,
ref oMissing, ref oMissing, ref oMissing,
ref oMissing);
wordDocument.ExportAsFixedFormat(
strTargetPath,
targetFormat,
paramOpenAfterExport,
paramExportOptimizeFor,
paramExportRange,
paramStartPage,
paramEndPage,
paramExportItem,
paramIncludeDocProps,
paramKeepIRM,
paramCreateBookmarks,
paramDocStructureTags,
paramBitmapMissingFonts,
paramUseISO19005_1,
ref oMissing);
object SaveToFormat = SaveToFormat = Microsoft.Office.Interop.Word.WdSaveFormat.wdFormatDocument97;
wordDocument.SaveAs(ref objTargetFilePath, ref SaveToFormat, ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing);
Für das Zusammenführen mehrerer Dateien:
Microsoft.Office.Interop.Word.Document doc = null;
Microsoft.Office.Interop.Word.Section section = null;
object sectionBreakNextPage = (object)WdBreakType.wdSectionBreakNextPage;
WordApp.Visible = false;
doc = this.WordApplication.Documents.Add(ref paramMissing, ref paramMissing, ref paramMissing, ref paramMissing);
if (doc != null)
{
doc.Activate();
int fileCount = sourceFiles.Length;
String fileName = string.Empty;
for (int fileIndex = 0; fileIndex < fileCount; fileIndex++)
{
fileName = sourceFiles[fileIndex];
if (System.IO.File.Exists(fileName))
{
section = doc.Sections.Last;
//delink the current section's header & footer from previous section's header & footer
section.Headers[WdHeaderFooterIndex.wdHeaderFooterFirstPage].LinkToPrevious = false;
section.Footers[WdHeaderFooterIndex.wdHeaderFooterFirstPage].LinkToPrevious = false;
section.Headers[WdHeaderFooterIndex.wdHeaderFooterPrimary].LinkToPrevious = false;
section.Footers[WdHeaderFooterIndex.wdHeaderFooterPrimary].LinkToPrevious = false;
section.Headers[WdHeaderFooterIndex.wdHeaderFooterEvenPages].LinkToPrevious = false;
section.Footers[WdHeaderFooterIndex.wdHeaderFooterEvenPages].LinkToPrevious = false;
section.Range.InsertFile(fileName, ref paramMissing, ref paramMissing, ref paramMissing, ref paramMissing);
//if it is last iteration, do'nt insert break
if (fileIndex < fileCount - 1)
{
object rangeStart = (object)(section.Range.End - 1);
doc.Range(ref rangeStart, ref paramMissing).InsertBreak(ref sectionBreakNextPage);
}
}
}
doc.SaveAs(ref targetFile, ref wordFormat, ref paramMissing,
ref paramMissing, ref paramMissing, ref paramMissing,
ref paramMissing, ref paramMissing, ref paramMissing,
ref paramMissing, ref paramMissing, ref paramMissing,
ref paramMissing, ref paramMissing, ref paramMissing,
ref paramMissing);
return true;
}
Gerade jetzt, ich erhalte die folgende Fehlermeldung:
The message filter indicated that the application is busy. (Exception from HRESULT: 0x8001010A (RPC_E_SERVERCALL_RETRYLATER))
Kann dies alles ohne mithilfe der Word Automation?
- Sind Sie immer jede Art von Ausnahme? Vielleicht so etwas wie das "Abrufen des COM-Klassenfactory für die Komponente mit CLSID {xxxx-xxxx-...} konnte aufgrund des folgenden Fehlers: 80070005"
- Ich war immer von dieser Ausnahme vor, wenn ich beschädigte meine registry, aber nach einer frischen Installation von Microsoft Office auf einer Virtuellen Maschine, wenn diese LocalPath ist leer, ich erhalte die Meldung "word kann nicht öffnen Sie dieses Dokument-Vorlage".
- Welche Art von Anwendung u arbeiten?
- gibt es irgendetwas mehr kann ich Ihnen helfen? Ich denke, Sie haben bereits eine Antwort, die Zeichnung aus glaubwürdigen und/oder offiziellen Quellen.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Anstatt zu versuchen, zu beheben und befassen sich mit diesem Fehler, ich denke, Sie sollten Lesen diese und dann versuchen einen anderen Ansatz zu deinem problem:
(...) Microsoft derzeit nicht empfehlen, und nicht unterstützt, Automatisierung von Microsoft Office-Anwendungen von jedem unbeaufsichtigten, nicht-interaktiven client-Anwendung oder Komponente (einschließlich ASP, DCOM und NT-Dienste), da Office zeigen können instabiles Verhalten und/oder deadlock beim ausführen in diesem Umfeld. (...)
Einige der alternativen empfohlen, die KB sind:
(...) Microsoft empfiehlt dringend, eine Reihe von alternativen, die nicht Office installiert sein server-Seite, und das durchführen können die meisten Allgemeinen Aufgaben effizienter und schneller als die Automatisierung. Bevor Sie mit einbeziehen Office als server-Komponente in Ihrem Projekt, alternativen erwägen.
Meisten server-side-Automation Aufgaben umfassen die Erstellung von Dokumenten oder Bearbeiten. Office 2007 unterstützt das neue Open XML-Dateiformaten, die es Entwicklern ermöglichen, erstellen, Bearbeiten, Lesen und wandeln die Datei-Inhalte auf der server-Seite. Diese Datei-Formate verwenden das System.IO.Paket.IO-namespace in Microsoft .NET 3.x Rahmen, zum Bearbeiten von Office-Dateien ohne Verwendung der Office-client-Anwendungen selbst. Dies ist die empfohlene und unterstützte Methode für die Behandlung von änderungen an Office-Dateien von einem service. (...)
Und
(...) Microsoft stellt ein SDK zur Manipulation von Open XML-Dateiformate von der .NET 3.x-Framework. Weitere Informationen zum SDK und zur Verwendung des SDK zum erstellen oder Bearbeiten von Open XML-Dateien finden Sie auf der folgenden Microsoft Developer Network (MSDN) - Websites:
Beachten Sie, dass selbst wenn Sie Ihr problem, Ihre Lösung wird es kaum stabil sein... Im wesentlichen, was es passiert zu sein scheint ist, dass Sie sich Durcheinander Ihre Registrierung, und es scheint, dass Ihre Word-Neuinstallation ist nicht zur Festsetzung der Registrierung, und das ist problematisch.
Auf dieser Grundlage empfehle ich Ihnen, Lesen Sie die oben genannten Unterlagen und zu versuchen, zusammen eine stabilere Lösung mit den oben genannten alternativen, die Automatisierung von Microsoft Office-Anwendungen von jedem unbeaufsichtigten, nicht-interaktiven client-Anwendung oder-Komponente, welche der Fall ist, aufweisen können, instabil Verhalten.
UPDATE 1
Haben Sie ein Hallo Welt Beispiel hier.
Erstellen Sie ein Dokument mit Open XML werden können, so einfach, wie dies zu tun:
Hinweis
Konnte ich hier verbracht Stunden, zu lösen versuchen, Ihre registry, aber wie Sie sehen können, in dieser Artikel in meinem blog, diese problem sind riesige Kopfschmerzen, und in Ihrem Fall, selbst wenn Sie einen Weg finden, es zu lösen, es wird nicht ein wart-oder skalierbare Lösung, meiner Meinung nach natürlich.
UPDATE 2
Laut diese, diejenigen Einstellungen, wie lokale Pfad extrahiert werden, die aus der Registrierung und sind nicht änderbar:
(...) Die Registerkarte allgemein enthält Allgemeine Informationen über die Anwendung. Diese Registerkarte zeigt den Namen der Anwendung, Typ (lokalen server oder Remoteserver) und Ort (lokalen Pfad oder remote-computer). Diese Einstellungen sind nicht änderbar durch die DCOM-Config-Schnittstelle.
Die Registerkarte "allgemein" ruft alle seine Informationen aus Unterschlüssel des folgenden Registrierungsschlüssel:
HKEY_CLASSES_ROOT\CLSID{...CLSID...}
wo {...CLSID...} ist die eindeutige CLSID für das Objekt Server momentan zu sehen ist. (...)
So! Ausführen > regedit - > Gehe zu HKEY_CLASSES_ROOT\CLSID, dann gehen Sie zum Menü Bearbeiten und klicken Sie auf Suchen, filtern, Schlüssel und legte Ihre ApplicationID es. Sollten Sie finden es auf diese Weise.
Nun nach der Suche nach den registry-Eintrag für den DCOM, es zu erweitern, sollten Sie einen Schlüssel "LocalServer32", die Eigenschaft (Default) hält Ihre Lokalen Pfad-Wert, versuchen Sie ändern es auf dem selben Weg wie Sie in Ihrem neuen Oracle Virtual Box.
Wenn dies funktioniert, prüfen Sie, ob sich der Wert halten, nach dem Neustart und der Anmeldung mit Sie Domain-Benutzer-Konto, wenn es funktioniert, Super, wenn nicht, führen Sie eine batch ausführen .reg-Datei führen Sie diese änderung auf jedem login.
Warnung: Trotzdem ist das schlechte Zeug, dass ich stark, stark Sie ermutigen, zu gehen die andere Weise herum, das ist nicht der Weg, es zu tun.
UPDATE 3
Bezug auf die "MS-WORD-AUTOMATISIERUNG-FEHLER : "Die Botschaft filter angegeben, dass die Anwendung ausgelastet ist", haben Sie eine sehr gute Antwort auf das problem hier. Werde ich zitieren ein bisschen von den obigen link, zum weiteren Verständnis, warum dieser Fehler passiert:
( ... ), Dass Problem ist die Tatsache, dass die Word-Objekte, die Sie anrufen, zu unterstützen nicht mehrere threading. Seit Sie ausgesetzt sind, zu beliebigen clients über COM, besteht die Möglichkeit, dass mehrere threads versuchen gleichzeitig das ausführen von code innerhalb des Objekts. Um dies zu verhindern, wird serialisiert alle eingehenden Anrufe werden durch queuing Sie auf und erlauben, nur einen Anruf zu einem Zeitpunkt ausführen. Dies geschieht durch Verpackungen, die details zu jedem Anruf und eine Nachricht zu Wort. Wenn Word-Prozesse, die Nachricht, der Anruf wird ausgeführt, auf das Wort der eigenen Haupt-thread. Das problem bei diesem Ansatz ist, dass, wenn Word ist einfach etwas anderes zu tun, wenn der Anruf kommt, der Anrufer muss warten. (...)
Über die Verschmelzung, das tool Ansprüche in der Lage sein, die Zusammenführung von OpenXML-Dokumenten, die ich nie verwendet es, aber ich würde es versuchen (wenn ich Sie).
(...) PowerTools for Open XML enthält source-code und Anleitung für die Durchführung verschiedener gemeinsamer Aufgaben unter Verwendung des Open XML SDK, wie: - High-fidelity-Konvertierung von DOCX zu HTML/CSS mit HtmlConverter.cs; - das Zusammenführen und splitten von DOCX-Dokumente mittels DocumentBuilder.cs; - Verschmelzung und Spaltung PPTX-Präsentationen mit PresentationBuilder.cs; - die Annahme verfolgt änderungen in DOCX-Dokumente mit RevisionAccepter.cs; - Suchen und ersetzen von text im DOCX-Dokumente mit TextReplacer.cs (...)
Endlich zum generieren von PDFs aus Ihren word-Dokumenten können Sie dieses tool verwenden,hier.
So wie Sie sehen können, einmal mehr, können Sie den Umgang mit Word-Automatisierung (Dunkle Seite), oder Sie können sich der Hellen Seite der macht :).