一个Asp.net下word在线编辑、全文关键字搜索的完整示例(包含源代码)



本文演示了如何在线编辑、保存word文档,并搜索含有关键字的文档。
1.项目目的
随着技术的发展,人们的需求也随之提高。Office文件的在线处理也越来越受到人们的关注。SOAOffice中间件无疑成了Office文件在线处理的得力助手。本文就是通过使用SOAOffice中间件,实现对本地word文档的在线处理,并搜索、显示含有关键字的文档。
2.解决思路
我们首先对文档进行在线编辑,并保存。保存的时候,将文档纯文本内容存入数据库,以备搜索时使用。
要获取文档的纯文本,在我们能够想出来的方法中,一般都比较复杂,而且效率也不高,但是利用SOAOffice的DocText属性却能轻而易举的实现。我们将由DocText属性获取的纯文本赋值给input隐藏域,然后在保存文档的页面中通过SOAOffice的RequestFormField(String FieldName)方法获取input隐藏域的值,然后将此值存入到数据库中。这样就实现了获取文档纯文本并将其保存至数据库中的功能。在搜索时,我们就可以利用数据库的这个字段来实现关键字搜索功能。
然后是关键字搜索功能,我们通过数据库中存储文档纯文本的字段,利用sql语句将包含关键字的文档搜索出来。
实现文档在线编辑的关键是利用SOAOffice,所以我们要确保引用SOAOFFICE中间件的服务器端.NET组件SOAOfficeX。本例中将SOAOfficeX.dll放在了bin文件夹下。

3.关键步骤
(1)保存文档纯文本:我们在文档编辑页面word1.aspx中利用SOAOffice的AppendToolButton(Index, Caption, IconIndex)方法添加自定义的“保存”按钮,同时禁掉word自带的“保存”按钮以及快捷键“Ctrl+S”,这里利用了SOAOffice的EnableFileCommand(CommandType)方法来实现。代码如下:
*******************************************************************************
<script type="text/javascript" event="OnDocumentOpened(str,obj)" for="SOAOfficeCtrl">
// 控件打开文档后立即触发,添加自定义菜单,自定义工具栏
// 禁止打印,禁止另存,禁止保存等等
bDocOpen = true;
document.all("SOAOfficeCtrl").EnableFileCommand(3) = false;
//添加自定义工具栏
SOAOfficeCtrl.AppendToolButton(1, "保存", 1);
</script>
*******************************************************************************
然后添加自定义“保存”按钮的响应函数,我们利用SOAOffice提供的DocText属性,获取打开的文档的纯文本,并将其保存到input隐藏域控件中。代码如下:
*******************************************************************************
<script type="text/javascript"
event="OnCustomToolBarClick(index, caption)" for="SOAOfficeCtrl">
// 添加您的自定义工具栏按钮事件响应
if (index == 1)
{
document.getElementById("inputText").value = document.all("SOAOfficeCtrl").DocText;
SOAOfficeCtrl.WebSave();
alert("恭喜你保存成功!");
}
</script>
*******************************************************************************
(2)获取input控件的值:在保存页面里通过SOAOffice的RequestFormField(String FieldName)方法获取input的值,代码如下:
*******************************************************************************
SOAOfficeX.SaveDocObj SOAObj = new SOAOfficeX.SaveDocObj();
strText = SOAObj.RequestFormField("inputText");
*******************************************************************************
4.示例程序架构
----FileManage.aspx //显示文档列表和搜索关键字的页面
----FileManage.aspx.cs

----word1.aspx //实现文档在线编辑的页面
----word1.aspx.cs

----SaveDoc2.aspx //保存文档的页面
----SaveDoc2.aspx.cs

doc/ //存储文档的目录

5.代码编写
首先是实现文档在线编辑功能的页面:word1.aspx。要实现文档的在线编辑功能,我们首先需要安装SOAOffice的客户端,因为我们需要在保存文档的时候,将编辑后的文档内容存入到数据库中,所以就需要禁掉word自带的“保存”功能,使用自定义的“保存”功能。前台Html添加的代码如下:
*******************************************************************************
<!--客户端代码开始-->
    <script type="text/javascript" event="OnInit()" for="SOAOfficeCtrl">
    //控件打开文档前触发,用来初始化界面样式
    </script>
    <script type="text/javascript" event="OnDocumentOpened(str,obj)" for="SOAOfficeCtrl">
    // 控件打开文档后立即触发,添加自定义菜单,自定义工具栏,禁止打印,禁止另存,禁止保存等等
    bDocOpen = true;
    document.all("SOAOfficeCtrl").EnableFileCommand(3) = false;
    //添加自定义工具栏
    SOAOfficeCtrl.AppendToolButton(1, "保存", 1);
    </script>
    <script type="text/javascript" even="OnDocumentClosed()" for="SOAOfficeCtrl">
    bDocOpen = false;
    </script>
    <script type="text/javascript" event="OnUserMenuClick(index, caption)" for="SOAOfficeCtrl">
    // 添加您的自定义菜单项事件响应
    </script>
    <script type="text/javascript" event="OnCustomToolBarClick(index, caption)" for="SOAOfficeCtrl">
    // 添加您的自定义工具栏按钮事件响应
    if (index == 1)
    {
        document.getElementById("inputText").value = document.all("SOAOfficeCtrl").DocText;
        SOAOfficeCtrl.WebSave();
        alert("恭喜你保存成功!");
    }
    </script>
    <!--OBJECT标签,客户端控件引用-->
    <object id="SOAOfficeCtrl" codebase="SOAOffice.ocx#version=8,1,0,9" height="100%"
     width="100%" data="" classid="clsid:83171BA4-BDCA-42a8-BE44-745ABF36EB7E" viewastext>
    <div align="center" style="color:Red">
    本机尚未安装SOAOFFICE客户端控件,请安装浏览器上方黄色提示条或弹出提示框中的SOAOFFICE客户端控件。
    </div>
    </object>
    <!--客户端代码结束-->
*******************************************************************************
具体代码如下:
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="word1.aspx.cs" Inherits="word1" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title>word1</title>
</head>
<body>
    <form id="formdata" method="post" name="formdata">
        <input id="inputText" name="inputText" type="text" style="width:50%; visibility: hidden;" />
   <!--客户端代码开始-->
    <script type="text/javascript" event="OnInit()" for="SOAOfficeCtrl">
    //控件打开文档前触发,用来初始化界面样式
    </script>
    <script type="text/javascript" event="OnDocumentOpened(str,obj)" for="SOAOfficeCtrl">
    // 控件打开文档后立即触发,添加自定义菜单,自定义工具栏,禁止打印,禁止另存,禁止保存等等
    bDocOpen = true;
    document.all("SOAOfficeCtrl").EnableFileCommand(3) = false;
//添加自定义工具栏
    SOAOfficeCtrl.AppendToolButton(1, "保存", 1);
    </script>
    <script type="text/javascript" even="OnDocumentClosed()" for="SOAOfficeCtrl">
    bDocOpen = false;
    </script>
    <script type="text/javascript" event="OnUserMenuClick(index, caption)" for="SOAOfficeCtrl">
    // 添加您的自定义菜单项事件响应
    </script>
    <script type="text/javascript" event="OnCustomToolBarClick(index, caption)" for="SOAOfficeCtrl">
    // 添加您的自定义工具栏按钮事件响应
    if (index == 1)
    {
      document.getElementById("inputText").value = document.all("SOAOfficeCtrl").DocText;
      SOAOfficeCtrl.WebSave();
      alert("恭喜你保存成功!");
    }
    </script>
    <!--OBJECT标签,客户端控件引用-->
    <object id="SOAOfficeCtrl" codebase="SOAOffice.ocx#version=8,1,0,9" height="100%"
     width="100%" data="" classid="clsid:83171BA4-BDCA-42a8-BE44-745ABF36EB7E" viewastext>
    <div align="center" style="color:Red">
    本机尚未安装SOAOFFICE客户端控件,请安装浏览器上方黄色提示条或弹出提示框中的SOAOFFICE客户端控件。
    </div>
    </object>
    <!--客户端代码结束-->
    </form>
</body>
</html>

接着是word1.aspx的后台代码word1.aspx.cs,因为要利用SOAOffice中间件,所以我们需要在它里面添加服务器端代码,主要是用来设置文档的保存URL和打开文档。服务器端代码如下:
*******************************************************************************
// --------------SOAOFFICE 服务器端编程开始---------------------------//
// 首先确保引用SOAOFFICE中间件的服务器端.NET组件SOAOfficeX
// SOAOfficeX.dll 在本示例代码的 bin 文件夹下
SOAOfficeX.SOAOfficeCtrl SOACtrl = new SOAOfficeX.SOAOfficeCtrl();
SOACtrl.ServerURL = "soaservice/soaserv.aspx";
SOACtrl.SaveDocURL = "SaveDoc2.aspx";
SOACtrl.WebOpen("doc/" + strDocName, SOAOfficeX.soaWorkMode.docAdmin, "someone", "Word.Document");
*******************************************************************************
具体实现如下:
定义两个变量:
public string strDocID; //文档的ID
private string strDocName;//文档的名字(包括文件扩展名)
接着只需在Page_Load(object sender, EventArgs e)函数中添加如下代码即可:
if (Request.QueryString["ID"] == null)
{
Response.Redirect("FileManage.aspx");
}
strDocID = Request.QueryString["ID"];
string sql = "select * from DocRecord where ID=" + strDocID + "";
string connString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" +
               Server.MapPath("demodata/soademo.mdb");
OleDbConnection con = new OleDbConnection(connString);
OleDbCommand cmd = new OleDbCommand(sql, con);
con.Open();
cmd.CommandType = CommandType.Text;
OleDbDataReader Reader = cmd.ExecuteReader();
if (Reader.Read())
{
  strDocName = Reader["Doc_Name"].ToString();
}
Reader.Close();
con.Close();
// --------------SOAOFFICE 服务器端编程开始---------------------------//
// 首先确保引用SOAOFFICE中间件的服务器端.NET组件SOAOfficeX
// SOAOfficeX.dll 在本示例代码的 bin 文件夹下
SOAOfficeX.SOAOfficeCtrl SOACtrl = new SOAOfficeX.SOAOfficeCtrl();
SOACtrl.ServerURL = "soaservice/soaserv.aspx";
SOACtrl.SaveDocURL = "SaveDoc2.aspx";
SOACtrl.WebOpen("doc/" + strDocName, SOAOfficeX.soaWorkMode.docAdmin, "someone", "Word.Document");

然后是FileManage.aspx,此页面主要实现搜索包含关键字的文档和显示文档列表的功能。其中关于搜索,我们可以利用sql查询语句来实现,您可以这样写sql语句:“select * from DocRecord where [Doc_Text] like '%" + strKeywd + "%'”,其中“DocRecord”是表名,“[Doc_Text]”是指表中存储文档纯文本的字段名,“strKeywd”就是我们输入的关键字。
最后就是保存文档页面SaveDoc2.aspx,它实现了两个功能,一是将编辑后的文档的内容保存到数据库中,二是将编辑后的文档保存到doc/目录下。具体实现步骤如下:
首先定义两个变量:
private string strText;//文档的内容
private string strDocID;//文档的ID
然后您只需要在SaveDoc2.aspx.cs的Page_Load(object sender, EventArgs e)函数中添加下面的代码即可:
if (Request.QueryString["DocID"] == null)
{
return;
}
strDocID = Request.QueryString["DocID"].ToString();
int nDocID = Int32.Parse(strDocID);//防止非法字符

SOAOfficeX.SaveDocObj SOAObj = new SOAOfficeX.SaveDocObj();
strText = SOAObj.RequestFormField("inputText");

string connString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" +
                Server.MapPath("demodata/soademo.mdb");
OleDbConnection con = new OleDbConnection(connString);
OleDbCommand cmd = new OleDbCommand();
con.Open();
cmd.Connection = con;
cmd.CommandType = CommandType.Text;
cmd.CommandText = "UPDATE  DocRecord SET Doc_Text=@DocText WHERE ID=@DocID" ;
OleDbParameter paramDocID = new OleDbParameter("@DocID", OleDbType.Integer);
paramDocID.Value = nDocID;
cmd.Parameters.Add(paramDocID);
OleDbParameter paramDocText = new OleDbParameter("@DocText", OleDbType.VarChar);
paramDocText.Value = strText.ToString();
cmd.Parameters.Add(paramDocText);
cmd.ExecuteNonQuery();
con.Close();
              
SOAObj.SaveToFile(Server.MapPath("doc/") + SOAObj.FileName);   //这里的参数设置为物理路径(如:"d:\abc.doc"),表明保存文件到此路径下
SOAObj.ReturnOK();

通过这几个页面就可以轻松实现word文档的在线编辑、保存,以及搜索包含关键字的文档了。
本示例代码在VS2008下编译通过。本文完整的示例代码如下:
http://www.kehansoft.com/web/shared/democode/Full-TextRetrieval.rar

你可能感兴趣的:(sql,.net,SQL Server,asp.net,asp)