asp.net 如何调用客户端word程序打开服务器上的word文档进行查看
用 COM 当然可以。
不过,COM 封装比较复杂,不太熟悉的话,出错调试很麻烦。
而且要求的知识面较宽。
简单的封装可以这样实现:1)通过 VS 创建一个 CLR 类库项目,在其中可以简单封装标准的 DLL 导出函数,当然,这些导出函数实际上是不导出。
然后定义一个 .net 类,在这个类中定义对应所有导出函数的公共方法,然后在公共方法内部调用这些标准的 C++ 函数。
生成这个 CLR DLL。
2)在VB中,可以引入这个 CLR DLL,然后 VB 就可以通过调用 CLR DLL 中定义的 .net 类来间接调用原来标准的 C++ DLL 导出函数了。
当然,因为在.net 中,所有的实现都是通过类来封装的,强调的是面向对象的编程理念。
因此,可以将 C++ DLL 本来的导出函数封装成类。
然后实例化一个全局 C++ 类,在后续定义的.net 类中,定义相关的公共方法,私有方法,在内部对这个全局的 C++ 类进行操作(这一切都是在同一个.cpp文件中就可以完成的,利用 cl 编译器的混编特性进行编译)。
在客户程序,唯一要做的就是调用公共方法就 OK 了。
以下提供示例,楼主可以参考一下:// CLR 类库项目。
// NestedCppClassDll.cpp ///////////////////////////////// 非托管代码。
#pragma unmanaged#pragma once#include #include class NestedCppClass { public: void PrintInfo() { printf("NestedCppClass\r\n"); } int Func(int i) { return ++i; } }; NestedCppClass g_ncc;#pragma managed//////////////////////////////////////////////////////////////// 托管代码。
using namespace System; namespace NestedCppClassDll { public ref class OutClrClass { public: void PrintInfo() { Console::WriteLine("OutClrClass"); g_ncc.PrintInfo(); } int Func(int i) { return g_ncc.Func(i); } }; }///////////////////////////////'VB控制台项目。
'项目需要引入CLR DLL'Module1.vb Module Module1 Sub Main() Dim c As NestedCppClassDll.OutClrClass c = New NestedCppClassDll.OutClrClass c.PrintInfo() System.Console.WriteLine(c.Func(1)) End Sub End Module'控制台输出内容:'OutClrClass'NestedCppClass'2// C#控制台项目。
// 项目需要引入 CLR DLL。
// Program.cs /////////////////////////////// using System; using NestedCppClassDll; namespace NestedCppClassApp { class Program { static void Main(string[] args) { OutClrClass c = new OutClrClass(); c.PrintInfo(); Console.Write(c.Func(1)); } } }//控制台输出内容://OutClrClass//NestedCppClass//2
如何控制不同的用户只能编辑同一word文档中的自己有权限编辑的区域...
第一种方法:在后台添加Word的类型库引用,自动化调用Word。
缺点是:你要了解Word的VBA接口,对象层次,调用方法,还要给asp.net添加模拟交互账户,还要处理word死进程问题等等。
微软明确指出不建议在服务器端自动化Office,参考http://support.microsoft.com/default.aspx?scid=kb;zh-cn;Q257757 第二种方法:采用SOAOffice中间件。
SOAOffice是微软OFFICE的专业Web中间件。
服务器端不需要安装运行Office软件,SOAOffice 完全克服了传统利用Office服务器端自动化技术存取文档数据的种种弊端和缺陷。
SOAOffice还能在浏览器里提供完全Office功能的在线编辑功能。
--------------------------------------------------------------------------- 采用第二种方法,以SOAOffice中间件作为平台,编写简单的调用代码实现本文的用户需求。
实现方法: 假设用户UserA只能编辑公文test.doc中的a区域,用户UserB只能编辑test.doc中的b区域。
首先打开test.doc文档,选择a区域,添加书签,命名为SOA_a;选择b区域,添加书签,命名为SOA_b。
为避免和用户其他书签名称冲突,在SOAOffice里数据区域名称都是以SOA_为前缀的书签名称。
保存test.doc。
新建EditWord.aspx页面,在Page_Load里编写代码: private void Page_Load(object sender, System.EventArgs e) { // 在此处放置用户代码以初始化页面 if(Session["UserName"]==null) Response.Redirect("Index.aspx"); string strUserName = Session["UserName"].ToString(); string strDataRegion = "a"; //----------- SOAOFFICE 服务器端编程开始 -------------------// // 首先确保引用SOAOFFICE中间件的服务器端.NET组件SOAOfficeX // SOAOfficeX.dll 在本示例代码的 bin 文件夹下 SOAOfficeX.WordResponse SOAWord = new SOAOfficeX.WordResponse(); SOAWord.FormMode = true; SOAWord.DisableWindowRightClick = true;//禁止Word右键菜单 if(strUserName == "UserA") strDataRegion = "a"; else if(strUserName == "UserB") strDataRegion = "b"; SOAOfficeX.IWordResDataRegion dataRegion = SOAWord.OpenDataRegion(strDataRegion); dataRegion.NeedSubmit = true; SOAOfficeX.SOAOfficeCtrl SOACtrl = new SOAOfficeX.SOAOfficeCtrl(); // 设置连接SOAOFFICE中间件服务器端SOAServer的参数 SOACtrl.Server = Request.ServerVariables["HTTP_HOST"]; SOACtrl.ServerPort = "4357"; // 设置界面样式 SOACtrl.MainStyle = SOAOfficeX.soaMainStyle.VistaBlue; SOACtrl.Caption = "填写文档内容,并提交填写的内容到服务器数据库。
"; SOACtrl.BorderStyle = SOAOfficeX.soaBorderStyle.BorderNone; SOACtrl.Toolbars = false; SOACtrl.Menubar = false; // 设置保存文档的服务器页面 SOACtrl.SaveDataURL = "SaveData.aspx"; // 获取数据对象 SOACtrl.Assign(SOAWord); // 打开文档 SOACtrl.WebOpen("doc/test.doc", SOAOfficeX.soaWorkMode.docReadOnly, strUserName, "Word.Document"); //----------- SOAOFFICE 服务器端编程结束 -------------------// } 其中关键代码是: if(strUserName == "UserA") strDataRegion = "a"; else if(strUserName == "UserB") strDataRegion = "b"; SOAOfficeX.IWordResDataRegion dataRegion = SOAWord.OpenDataRegion(strDataRegion); dataRegion.NeedSubmit = true; 判断当前登录用户,OpenDataRegion指定当前可编辑提交的文本区域。
创建SaveData.aspx页面,用来保存用户的输入内容,保存到数据库。
在Page_Load里编写代码:{ // 在此处放置用户代码以初始化页面 //----------- SOAOFFICE 服务器端编程开始 -------------------// SOAOfficeX.WordRequest SOAWord = new SOAOfficeX.WordRequest(); if(Session["UserName"]==null) { Label1.Text = "保存失败!登录用户无效。
"; SOAWord.ShowPage(580,270); return; } string strUserName = Session["UserName"].ToString(); string strDataRegion = "a"; if(strUserName == "UserA") strDataRegion = "a"; else if(strUserName == "UserB") strDataRegion = "b"; Label1.Text = "当前登录用户是:" +strUserName+ ""; if(SOAWord.OpenDataRegion(strDataRegion).value=="") { Label1.Text = Label1.Text + "请填写工作进度。
"; SOAWord.ShowPage(580,270); return; } Label1.Text = Label1.Text + "保存成功!"; Label1.Text = Label1.Text + "保存内容如下:" + SOAWord.OpenDataRegion(strDataRegion).value; SOAWord.ShowPage(580,270); SOAWord.ReturnOK();//此句是必须的,向SOAOffice客户端控件返回保存成功消息。
//----------- SOAOFFICE 服务器端编程结束 -------------------// } 其中关键代码是:if(strUserName == "UserA") strDataRegion = "a"; else if(strUserName == "UserB") strDataRegion = "b"; Label1.Text = Label1.Text + "保存内容如下:" + SOAWord.OpenDataRegion(strDataRegion).value; 判断当前登录用户,OpenDataRegion获取当前提交的文本区域内容。
这里并没...
转载请注明出处51数据库 » asp.net 调用word com报错
我来段子深造的