office自动化处理,高分求教

tkdg0224 2010-07-02 01:51:21
我需要在asp中将数据库中的数据以word的形式反馈给客户,实现方式为以字符转替换的方式处理模板,提供给用户下载,
代码在vs自带地调试环境中可以顺利执行,可是一旦部署进iis就会报错

Object Nothing = System.Reflection.Missing.Value;
Microsoft.Office.Interop.Word.Application WordApp = new Microsoft.Office.Interop.Word.ApplicationClass();
Microsoft.Office.Interop.Word.Document WordDoc = WordApp.Documents.Open(path, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing);
Microsoft.Office.Interop.Word.Find findObject = WordApp.Selection.Find;//报错找不到Find(这个具体错误信息忘记了,应该是为将对象引用到实例)



而后我按照网络上找到的办法设置了下:
1、在将应用程序池中将当前网站的的凭证设为administrator,但问题依旧。
2、在“DCOM配置”中,为IIS账号配置操作Word的权限,问题依旧。
3、配置Web.Config文件,在每次请求时模拟本地系统的账户,问题依旧。



最后我放弃在iis做设置,改为编写一个,.Net Remoting

调用方法为
string wordexc(string path, CompanyInfo cominfo, CompanyAddressInfo comaddinfo,………………)

返回值为生成之后的doc文件路径。


这段程序在控制台下执行一切顺利,一但编写为windows服务,就会出现和之前一样的错误:
未将对象引用设置到对象的实例。
说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。

异常详细信息: System.NullReferenceException: 未将对象引用设置到对象的实例。

源错误:
行 133: obj.wordexc(path, cominfo, comaddinfo,……………………);





上下文:

String sSvrIp = null, sPort = null, sObjectUrl = null;
if (sSvrIp == null || sSvrIp == "")
sSvrIp = "localhost";
if (sPort == null || sPort == "")
sPort = "9000";
if (sObjectUrl == null || sObjectUrl == "")
sObjectUrl = "word";
IChannel chan = null;

if (ChannelServices.RegisteredChannels.Length > 0)
foreach (IChannel chan1 in ChannelServices.RegisteredChannels)
{
if (chan1.ChannelName == "wordtcp")
chan = chan1;
}
else
if (chan == null)
{
chan = new TcpClientChannel("wordtcp", new BinaryClientFormatterSinkProvider());
ChannelServices.RegisterChannel(chan, false);
}

word obj;
obj = (word)Activator.GetObject(typeof(word), "tcp://localhost:9000/word/WordExc");
obj.wordexc(path, cominfo, comaddinfo, ……………………);
return path;//obj.wordexc的返回值实际无用

...全文
134 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
tkdg0224 2010-07-02
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 jjkk168 的回复:]

TO 楼上

感觉也是权限的问题,但也不太像

我曾经做过一个试验。当时我出问题就是在64位的Windows 2008上,ASP.NET应用程序池账户为本地管理员,同时以该账户登录服务器,在服务器端使用WinForm生成Word文件(与ASP.NET调用的函数来自于同一个dll),使用WinForm完全没问题,但就是使用ASP.NET来调用,就生成报错。然后在服务器上加调试,跟踪到ASP……
[/Quote]




看完楼上我突然想起一个问题,

我的机器上最初装的是office2007
这个项目进行到一半,我想直接用控制台来用它,所以也就放下了这个问题,
之后为了体验安装了office2010。
最后部署到服务器时 为server2003,office2003

的确比较乱,哈哈

我本机现在就是office2010
还想懒够 2010-07-02
  • 打赏
  • 举报
回复
TO 楼上

感觉也是权限的问题,但也不太像

我曾经做过一个试验。当时我出问题就是在64位的Windows 2008上,ASP.NET应用程序池账户为本地管理员,同时以该账户登录服务器,在服务器端使用WinForm生成Word文件(与ASP.NET调用的函数来自于同一个dll),使用WinForm完全没问题,但就是使用ASP.NET来调用,就生成报错。然后在服务器上加调试,跟踪到ASP.NET生成WORD文件时,检测调用的用户,用户也没有任何变化,也就是说调用生成的用户还是应用程序池的账户。因此我只能断定是ASP.NET调用DCOM的时候,传递给WORD2007的身份为NETWORK Service(很低的权限)。后来安装Office2010,这问题才搞定。
tkdg0224 2010-07-02
  • 打赏
  • 举报
回复
我感觉这个的重点还是在权限设置上,首先使用vs自带的调试程序完全没有问题,然后使用控制台处理.net Remoting 时也没有问题

iis,和windows服务,对调用OfficePIA的限制有人清楚么?

另,我的iis和服务全设置为administrator来执行了
tkdg0224 2010-07-02
  • 打赏
  • 举报
回复
2010?组件里面07和10没有太大变化吧,msdn里的东西都是说对应于2007和2010,
我用的是office2007,vs2010,office2003也试过
还想懒够 2010-07-02
  • 打赏
  • 举报
回复
与我上次碰到的问题非常类似,建议楼主试试Office2010吧,我也期待这个解决方案,哈
myhope88 2010-07-02
  • 打赏
  • 举报
回复
不懂,帮顶下
tkdg0224 2010-07-02
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 jjkk168 的回复:]
如果楼主的服务器是64位,那建议在服务器上安装Office2010,Office2007是在64位上会报出未将对象引用设置到对象的实例的错误。其原因在于DCOM那里的配置死活不知道是怎么回事。
[/Quote]


是32位的,
server2008,iis66
还想懒够 2010-07-02
  • 打赏
  • 举报
回复
如果楼主的服务器是64位,那建议在服务器上安装Office2010,Office2007是在64位上会报出未将对象引用设置到对象的实例的错误。其原因在于DCOM那里的配置死活不知道是怎么回事。
tkdg0224 2010-07-02
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 liujintaozyc 的回复:]
上网找找太多了这类信息
[/Quote]

我找了好久,要是给我个有效关键词我也给分
辰爸 2010-07-02
  • 打赏
  • 举报
回复
给楼主推荐个 使用Aspose.Words.dll这个控件能将word域中的数据使用数据库中的数据替换掉,而且比较可靠,对环境要求也不高!~
-小蕾- 2010-07-02
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 lishuai1030 的回复:]
帮 顶
[/Quote]
+1
lishuai1030 2010-07-02
  • 打赏
  • 举报
回复
帮 顶
liujintaozyc 2010-07-02
  • 打赏
  • 举报
回复
上网找找太多了这类信息
tkdg0224 2010-07-02
  • 打赏
  • 举报
回复
我在msdn中看到ms建议使用rtf来替代word自动化,可我找不到有关的文档,如能提供,依然给分

62,039

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧