2009-06-10 6 views
4

Ich verwende ColdFusion 7 auf einem Windows 2003-Server, um mit einer Standardinstallation von Microsoft Word 2000 mit COM-Objekten zu sprechen. Ziel ist es, ein Dokument mit einigen Tabellen zu erzeugen.ColdFusion COM-Objektmanipulation von MS Word 2000 stirbt nach 100 Sekunden

So viel kann ich tun. Die CPU erreicht für die Dauer 100%, aber mein Code ist funktional und wenn er kurz ist, funktioniert er. Das Problem, auf das ich stoße, ist, wenn der Code, der verwendet wird, um das Word-Dokument zu erzeugen, ungefähr 25kb + wird (ein Skript erzeugt viel Wiederholungscode).

Nachdem der Server verbringt 1 Minute 40 Sekunden versucht, das Dokument zu erzeugen:

  • CPU-Auslastung sinkt auf 0 (CPU zwischen jrun.exe für Coldfusion und winword.exe für Word 2000 aufgeteilt wurde).
  • winword.exe bleibt im Speicher.
  • Das ColdFusion-Zeitlimit ist lang, daher denkt der Clientbrowser, dass die Seite noch bearbeitet wird.
  • Wenn ich den winword.exe-Prozess abbringe, gibt ColdFusion sofort einen Fehler an den Client zurück.

Also diese längeren Seiten nie zu Ende. Ich habe viele Variationen ausprobiert.

  • ColdFusion 8 funktioniert nicht.
  • Die Verwendung einer aktualisierten JVM für ColdFusion 7/8 funktioniert nicht.
  • Der Inhalt des Codes, den ich ausführe, macht keinen Unterschied. Ich mache eine Menge fantastischer Tischmalereien, aber eine Million Zeilen von "Hallo Welt" sterben auch.
  • Eine Testversion von Word 2007 funktioniert erstaunlicherweise. Die Formatierung ist ein wenig wackelig, da Calibri und die anderen neuen Schriftarten standardmäßig verwendet werden. Der Server wartet jedoch bis zu 7 Minuten, bis er abgeschlossen ist. Und dann starten Sie den Server neu, versuchen Sie und führen Sie den gleichen Code aus, und Word 2007 besteht darauf, dass es keinen Befehl versteht, den ich es sende. Ich habe die Testaktivierung durchgeführt, ich habe sogar Word 2007 gestartet, nachdem ich den Remote-Desktop nach dem Neustart verwendet habe. Word wird nach diesem ersten Neustart vollständig katatonisch.

Was ich nicht versucht habe:

  • Word 2003

Meine Netto-Suche waren fruchtlos beyond "ist hier, wie in Word-API verbinden" in Coldfusion Land und „hier, wie Sie legen Sie die Seitenanzahl in der Fußzeile "in ASP.NET Land fest. Es sieht so aus, als würde niemand, der Adobe benutzt, versuchen, das zu tun, und niemand, der Microsofts Sachen benutzt, hat mein Problem. Und so werfe ich mich blutend und unterernährt an deine Ufer, suche nach einem Einblick in dieses irrsinnige Timeout-Problem.

Hier ist, was ein Ausschnitt des Coldfusion-Code wie folgt aussieht:

<cfset clientMatterCellStart = myDoc.Tables.Item(1).Cell(2,1)> 
<cfset clientMatterCellEnd = myDoc.Tables.Item(1).Cell(2,7)> 
<cfset clientMatterCellStart.Merge(clientMatterCellEnd)> 
<cfset clientMatterCellStart.Range.Font.Bold = true> 
<cfset clientMatterCellStart.Range.Font.Name = "Times New Roman"> 
<cfset clientMatterCellStart.Range.Font.Size = 14> 
<cfset clientMatterCellStart.Range.ParagraphFormat.Alignment = 1><!--- Centered ---> 
<cfset clientMatterCellStart.Range.Text = "#MySubjects.subject_name[q]#"> 
<cfset clientMatterCellStart.Shading.BackgroundPatternColor = 13421772><!--- Grey 20% ---> 

Antwort

3

Ok, Antwortnummer 2. Da der .Net weiner sagt, es funktioniert Sie haben könnten mehr Glück, wenn Sie das Dokument über ein externes vb.net-Skript erstellen und spezielle Anforderungen über eine Konfigurationsdatei und/oder Befehlszeilenargumente übergeben. Alternativ, wenn Sie eine echte Sprache bevorzugen, können Sie es in Python mit dem win32com-Modul tun.

Kurz gesagt, Ihr Problem kann sein, dass Coldfusion eine beschissene COM-Implementierung hat.

+1

"kann sein, dass Coldfusion eine beschissene COM-Implementierung hat" Mit meinem Kopf in meinen Händen, bin ich sehr bereit, das zu glauben. –

+1

Ich würde gerne sehen, ob eine ColdFusion-Maven weiß, ob ich wirklich mit diesem Ansatz verdammt bin (wenn CF COM-Implementierung ein echtes Problem mit langen Anforderungen hat). –

+1

Ich sympathisiere mit Ihnen, weil Sie wirklich mit diesem Ansatz verdammt sind. Ich habe mich sehr bemüht, die COM-Objekt-Route zum Laufen zu bringen, denn es wäre schneller gewesen, den Code zu schreiben, aber ich habe es nach zu vielen Problemen aufgegeben. – Jayson

0

einen anderen Browser probieren? Ich hatte meine Probleme damit, dass der IE lange Verbindungen vorzeitig abbrach (unabhängig von der Einstellung der CF-Anfrage). Es scheint zu denken, dass lange Anfragen bedeuten, dass der Server defekt ist, so dass er abbricht (selbst wenn der Grund für die Verzögerung darin liegt, dass er immer noch eine Datei hochlädt).

+1

Versucht, dass. IE 7, 8, Firefox 3, Chrome. Ziemlich sicher, der Browser ist nicht das Problem. –

2

Ich hatte die Notwendigkeit, MS Word-Dokumente zu erstellen und habe viel erforscht, welche die beste Methode ist, es zu tun. Am Ende fand ich heraus, dass die Verwendung von MS Word als COM-Objekt eine sehr, sehr schlechte Idee ist, vor allem aufgrund der erwähnten Leistungsprobleme, aber auch aufgrund von Sicherheitsproblemen. Es ist nur eine schlechte Idee und wird definitiv nicht auf mehrere Benutzer skalieren.

Allerdings habe ich zwei andere akzeptable Lösungen gefunden. Das war vor einiger Zeit und ich habe den Code nicht mehr bei mir, aber ich werde dir sagen, an was ich mich erinnern kann, so gut ich kann.

  1. gespeichert ich ein Word-Dokument als Word-XML-Dokument, öffnete sie in einem einfachen Texteditor, nahm es auseinander, und verwenden Coldfusion automatisch zu generieren, was ich brauchte. Dies funktionierte gut und es gab keine Performance-Probleme, aber das Xml zu zerlegen und herauszufinden, wie ich das machen konnte, was ich brauchte, war mühsam und brauchte einige Zeit.

  2. Ich habe einfach reguläre HTML erstellt, den Bericht so gestaltet, dass er wie eine Webseite aussieht und dann die Tags cfheader und cfcontent hinzugefügt, um dem Browser mitzuteilen, dass der Inhalt ein Word-Dokument ist. Diese Option funktionierte, aber ich glaube, ich habe Warnungen erhalten, dass der Anhang nicht korrekt als Word-Dokument formatiert ist. Möchten Sie ihn trotzdem öffnen? Es öffnete sich in MS Word gut und Benutzer konnten es als eine doc-Datei auf dem Desktop speichern.

Hoffe, das hilft.

EDIT: Sorry, erschien mein Code-Snippet richtig nicht, hier ist es ...

<cfheader name="content-disposition" value="attachment; filename=report.doc" /> 
<cfcontent type="application/msword" /> 
+0

Netter Trick. Ich würde mich jedoch nicht darauf verlassen, weil die HTML-Implementierung von Word eine der schlimmsten ist, die es gibt (außer vielleicht Lotus Notes). Es könnte funktionieren, wenn es Ihnen nichts ausmacht, wenn Ihr Layout gnadenlos auf völlig unergründliche Weise zerstückelt wird. – SpliFF

+0

Einverstanden, leider. Meine Kunden ärgern sich über die winzigen Unterschiede zwischen HTML-as-Word- und echten Word-Dokumenten. Es muss ein echtes Word-Dokument sein. Mir geht es auch nicht um Sicherheit oder Skalierung. Der Server ist aus dem Weg, und wir bekommen vielleicht 2-3 Anfragen für diese Dokumente pro Tag. –

+1

Nun, da ich darüber nachdenke, habe ich auch früher RTF-Dokumente erstellt. Haben Sie ähnlich wie bei meinem XML-Ansatz versucht, RTF-Dateien mit ColdFusion zu erstellen? RTF kann auch mit Word geöffnet werden und ist portabler. – Jayson

0

Ich glaube nicht, Konvertierung des HTML in PDF anstelle von Word ist eine Option?

+0

Ich habe bereits etwas erstellt, das PDF-Dokumente erzeugt. Unsere Kunden mögen es, aber ihre erste Frage ist: "Kann ich es bearbeiten?" Umm ... nein ... –

0

Sie haben wahrscheinlich Recht - Sie sind in einer kleinen Gruppe von Menschen, die versuchen, so etwas zu tun.

Wenn Sie die Möglichkeit haben, eine .Net-Klasse oder einen Webservice zu schreiben, könnte dies der richtige Weg sein, da die ColdFusion-COM-Implementierung zu wünschen übrig lässt.

Denken Sie über Ihren Prozess nach und versuchen Sie, den Teil des Codes, der das Dokument erstellt, zu refaktorieren, schreiben Sie es dann in .NET und verwenden Sie diese Klasse/diesen Dienst von ColdFusion.

+0

Wird tun. Danke, Adam. –

0

Ich stimme völlig mit allen hier überein, dass COM eine schlechte Idee ist.

Für was es wert ist, hatte ich gute Ergebnisse sehr lange - Hunderte von Seiten - und ziemlich komplexe Dokumente zu Word mit Coldfusion-generierten HTML-Dateien mit CSS-Stylesheets konvertieren.

nur dienen sie zu Wort mit:

<cfcontent type="application/msword" file="#filename#" deletefile="Yes" /> 
0

ich meinen Anteil an Problem mit Coldfusion und COM sowie hatte (wir benutzten es Wort und PPT und konvertieren, um HTML zu konsumieren). Ich denke, Sie sind besser dran, wenn Sie eine ASPX-Seite oder einen .NET-Webdienst schreiben und die benötigten Informationen weitergeben. Wenn Sie planen, mehr MS Office-Dokumentbearbeitung zu tun, gibt es eine für Pay-Loss-Lösung: http://www.aspose.com/categories/file-format-components/aspose.words-for-.net-and-java/default.aspx Wir haben sie für PPT-Dateien verwendet und waren sehr glücklich.