ColdFusion COM объект манипулирования MS Word 2000 умирает через 100 секунд - PullRequest
4 голосов
/ 10 июня 2009

Я использую ColdFusion 7 на сервере Windows 2003, чтобы установить стандартную установку Microsoft Word 2000 с использованием COM-объектов. Цель состоит в том, чтобы создать документ с несколькими таблицами в нем.

Так много я могу сделать. Процессор резко увеличивается до 100%, но мой код работает, и если он короткий, он работает. Проблема, с которой я сталкиваюсь, заключается в том, что размер кода, используемого для создания документа Word, составляет около 25 КБ + (скрипт генерирует много повторяющегося кода).

После того, как сервер потратил 1 минуту 40 секунд, пытаясь сгенерировать документ:

  • Загрузка ЦП снижается до 0 (ЦП был разделен между jrun.exe для ColdFusion и winword.exe для Word 2000).
  • winword.exe остается в памяти.
  • Время ожидания ColdFusion велико, поэтому браузер клиента считает, что страница все еще обрабатывается, однако ...
  • Если я завершу процесс winword.exe, ColdFusion немедленно вернет ошибку клиенту.

Так что эти длинные страницы никогда не заканчиваются. Я перепробовал много вариантов.

  • ColdFusion 8 не работает.
  • Использование обновленной JVM для ColdFusion 7/8 не работает.
  • Содержимое кода, который я запускаю, не имеет значения. Я делаю много необычных раскрасок таблиц, но миллион строк "Hello world" также умирает.
  • Пробная версия Word 2007, как ни странно, работает. Форматирование немного сложнее, поскольку по умолчанию используется Calibri и другие новые шрифты, но сервер подождет, скажем, до 7 минут, пока он не будет завершен. А затем перезагрузите сервер, попробуйте выполнить тот же код, и Word 2007 настаивает, что он не понимает команды, которую я ему отправляю. Я сделал пробную активацию, я даже запустил Word 2007 с помощью удаленного рабочего стола после перезагрузки. После первого перезапуска слух становится совершенно кататоническим.

Что я еще не пробовал:

  • Word 2003

Мои поиски в сети были бесплодны, за исключением «вот как подключиться к API Word» на земле ColdFusion и «вот как подсчитать количество страниц в нижнем колонтитуле» на земле ASP.NET. Кажется, никто не использует вещи Adobe, пытается это сделать, и никто, использующий вещи Microsoft, не сталкивается с моей проблемой. И поэтому я бросаюсь на твои берега, истекающие кровью и истощенные, пытаясь понять эту безумную проблему тайм-аута.

Вот как выглядит фрагмент кода ColdFusion:

<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% --->

Ответы [ 7 ]

3 голосов
/ 10 июня 2009

Хорошо, ответьте номер 2. Так как .Net weiners говорят, что он работает, вам может повезти, если вы создадите документ с помощью внешнего скрипта vb.net и передадите любые специальные требования через файл конфигурации и / или аргументы командной строки. В качестве альтернативы, если вы предпочитаете настоящий язык, вы можете сделать это на python с модулем win32com.

Короче говоря, ваша проблема может заключаться в том, что Coldfusion имеет дрянную реализацию COM.

2 голосов
/ 10 июня 2009

Раньше у меня была необходимость создавать документы MS Word, и я много исследовал, какой из них лучший. В конце концов я обнаружил, что использование MS Word в качестве COM-объекта - это действительно очень плохая идея, в основном из-за проблем производительности, о которых вы упоминали, но также из-за проблем безопасности, которые он приносит. Это просто плохая идея, и она определенно не подходит для нескольких пользователей.

Однако я предложил еще два приемлемых решения. Это было довольно давно, и у меня больше нет кода, но я скажу вам, что я могу вспомнить, как могу.

  1. Я сохранил документ Word как документ Word XML, открыл его в текстовом редакторе, разобрал его и использовал ColdFusion для автоматического создания того, что мне было нужно. Это работало хорошо, и проблем с производительностью не было, но разбирать xml и выяснить, как сделать то, что мне нужно, было утомительно и заняло некоторое время.

  2. Я просто выполнил обычный html, разработав отчет так, чтобы он выглядел хорошо, как веб-страница, а затем добавил теги cfheader и cfcontent, чтобы сообщить браузеру, что содержимое представляет собой документ Word. Эта опция сработала, но я думаю, что я получил предупреждение о том, что вложение неправильно отформатировано как текстовый документ. Вы все равно хотите его открыть? В MS Word его можно было открыть, и пользователи могли сохранить его на рабочем столе в виде файла документа.

Надеюсь, это поможет.

EDIT: Извините, мой фрагмент кода не отображался правильно, вот он ...

<cfheader name="content-disposition" value="attachment; filename=report.doc" />
<cfcontent type="application/msword" />
0 голосов
/ 11 июня 2009

У меня тоже была проблема с ColdFusion и COM (мы использовали его, чтобы потреблять слова и PPT и конвертировать в HTML). Я думаю, что вам лучше написать страницу .aspx или веб-сервис .NET и передать необходимую информацию. Если вы планируете больше манипулировать документами MS Office, стоит обратить внимание на платное решение: http://www.aspose.com/categories/file-format-components/aspose.words-for-.net-and-java/default.aspx

Мы использовали их для файлов PPT и были очень счастливы.

0 голосов
/ 11 июня 2009

Я полностью согласен со всеми, кто говорит, что COM - плохая идея.

Для чего бы это ни стоило, у меня были хорошие результаты, конвертируя очень длинные - сотни страниц - и довольно сложные документы в Word, используя сгенерированные Coldfusion HTML-файлы с таблицами стилей CSS.

Просто служи им Слову с:

<cfcontent type="application/msword" file="#filename#" deletefile="Yes" />
0 голосов
/ 11 июня 2009

Вы, вероятно, правы - вы в небольшой группе людей, пытающихся делать подобные вещи.

Если у вас есть возможность написания .Net-класса или веб-службы, это может быть правильным вариантом, поскольку кажется, что реализация COM в ColdFusion оставляет желать лучшего.

Подумайте о своем процессе и попытайтесь реорганизовать часть кода, которая создает документ, затем запишите его в .Net и используйте этот класс / службу из ColdFusion.

0 голосов
/ 10 июня 2009

Я не думаю, что преобразование HTML в PDF вместо Word - вариант?

0 голосов
/ 10 июня 2009

Попробуйте другой браузер? У меня была доля проблем с тем, что IE преждевременно сбрасывал длинные соединения (независимо от настройки времени ожидания CF). Кажется, что длинные запросы означают, что сервер сломан, поэтому он прерывает работу (даже если причина задержки в том, что он все еще загружает файл).

...