Api MS Word 2000的ColdFusion COM对象操作在100秒后死亡

Api MS Word 2000的ColdFusion COM对象操作在100秒后死亡,api,com,coldfusion,ms-word,timeout,Api,Com,Coldfusion,Ms Word,Timeout,我在Windows2003服务器上使用ColdFusion 7与使用COM对象的默认MicrosoftWord2000安装进行对话。目标是生成一个包含一些表的文档 这就是我能做的。CPU在持续时间内会达到100%,但我的代码可以正常工作,如果很短,就可以正常工作。我遇到的问题是,用于生成Word文档的代码大约为25kb+(一个脚本正在生成大量重复的代码) 服务器花费1分40秒尝试生成文档后: CPU使用率降至0(CPU在用于ColdFusion的jrun.exe和用于Word 2000的win

我在Windows2003服务器上使用ColdFusion 7与使用COM对象的默认MicrosoftWord2000安装进行对话。目标是生成一个包含一些表的文档

这就是我能做的。CPU在持续时间内会达到100%,但我的代码可以正常工作,如果很短,就可以正常工作。我遇到的问题是,用于生成Word文档的代码大约为25kb+(一个脚本正在生成大量重复的代码)

服务器花费1分40秒尝试生成文档后:

  • CPU使用率降至0(CPU在用于ColdFusion的jrun.exe和用于Word 2000的winword.exe之间进行了拆分)
  • winword.exe仍保留在内存中
  • ColdFusion的超时很长,因此客户端浏览器认为页面仍在处理中,但是
  • 如果我终止winword.exe进程,ColdFusion会立即向客户端返回一个错误
所以这些较长的页面永远不会结束。我试过很多变体

  • ColdFusion 8不起作用
  • 为ColdFusion 7/8使用更新的JVM是行不通的
  • 我正在运行的代码的内容没有区别。我正在做很多花哨的桌子着色,但是一百万行的“Hello world”也消失了
  • 令人惊讶的是,Word2007的试用确实有效。格式有点不稳定,因为它默认为Calibri和其他新字体,但服务器将等待,比如说,7分钟,直到它完成然后重新启动服务器,尝试执行相同的代码,Word 2007坚称它不理解我发送的任何命令。我已经完成了试用激活,我甚至在重启后使用远程桌面启动了Word2007。在第一次重启后,这个词变得完全紧张
我没有尝试过的:

  • Word 2003
我的网络搜索除了在ColdFusion land中的“这里是如何连接Word的API”和在ASP.net land中的“这里是如何将页数放入页脚”之外,没有任何结果。似乎没有人用Adobe的东西来做这件事,也没有人用微软的东西来解决我的问题。所以我把自己扔在你们的海岸上,流血和营养不良,寻求对这个令人发狂的超时问题的一些见解

下面是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% --->


是否尝试其他浏览器?IE过早地断开长连接(不管CF requesttimeout设置如何),我也遇到过同样的问题。似乎认为长时间的请求意味着服务器坏了,所以它会中止(即使延迟的原因是因为它仍在上载文件)。

我以前需要创建MS Word文档,并对哪种方法是最好的进行了大量研究。最后,我发现使用MS Word作为COM对象是一个非常非常糟糕的主意,主要是由于您提到的性能问题,但也由于它带来的安全问题。这只是一个坏主意,绝对不会扩展到多个用户

然而,我确实提出了另外两个可以接受的解决方案。这是很久以前的事了,我已经没有代码了,但是我会尽可能地告诉你我能记住的

  • 我将word文档保存为word xml文档,在纯文本编辑器中打开它,将其拆分,并使用ColdFusion自动生成所需内容。这工作得很好,没有性能问题,但是分解xml并找出如何制作所需的内容非常繁琐,而且需要一些时间

  • 我只是做了常规的html,将报告设计成网页的样子,然后添加了cfheader和cfcontent标记,告诉浏览器内容是word文档。此选项起作用,但我想我可能有gotton警告,附件的格式没有正确设置为word文档,是否仍要打开它?在MS Word中打开它看起来很好,用户可以将它保存到桌面上作为文档文件

  • 希望这有帮助

    编辑: 抱歉,我的代码片段显示不正确,请看

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

    好的,回答2。由于.Net Weiner说它可以工作,您可能更幸运地通过外部vb.Net脚本构建文档,并通过配置文件和/或命令行参数传递任何特殊要求。或者,如果您喜欢一种真正的语言,您可以使用带有win32com模块的python来实现


    简而言之,您的问题可能是Coldfusion的COM实现很糟糕。

    我不认为将HTML转换为PDF而不是Word是一种选择?

    您可能是对的——您是一小群试图做这种事情的人中的一员

    如果您可以选择编写一个.Net类或Web服务,那么这可能是一个不错的选择,因为听起来ColdFusion的COM实现还有一些不尽如人意的地方


    考虑一下您的流程,尝试重构创建文档的代码部分,然后将其写入.Net并使用ColdFusion提供的类/服务。

    我完全同意这里的每个人所说的COM是个坏主意

    值得一提的是,我使用Coldfusion生成的HTML文件和CSS样式表,将非常长的数百页相当复杂的文档转换为Word,取得了很好的效果

    只需向他们提供以下信息:

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

    我也有ColdFusion和COM的问题(我们使用它来使用word和PPT并转换为HTML)。我认为您最好编写一个.aspx页面或.NETWeb服务,并传递所需的信息。如果您打算进行更多的MS Office文档操作,有一个付费解决方案值得一看:


    我们已经将它们用于PPT文件,并且非常高兴。

    尝试过。IE 7、8、Firefox 3、Chrome。很确定浏览器不是问题。这是个好把戏。不过我自己也不会依赖它,因为Word的HTML实现