一個Asp.net下word在線編輯、全文關鍵字搜索的完整示例

 

 

       本文演示瞭如何在線編輯、保存word文檔,並搜索含有關鍵字的文檔。

1.項目目的

       隨着技術的發展,人們的需求也隨之提高。Office文件的在線處理也越來越受到人們的關注。SOAOffice中間件無疑成了Office文件在線處理的得力助手。本文就是通過使用SOAOffice中間件,實現對本地word文檔的在線處理,並搜索、顯示含有關鍵字的文檔。

2.解決思路

       我們首先對文檔進行在線編輯,並保存。保存的時候,將文檔純文本內容存入數據庫,以備搜索時使用。

要獲取文檔的純文本,在我們能夠想出來的方法中,一般都比較複雜,而且效率也不高,但是利用SOAOfficeDocText屬性卻能輕而易舉的實現。我們將由DocText屬性獲取的純文本賦值給input隱藏域,然後在保存文檔的頁面中通過SOAOfficeRequestFormField(String FieldName)方法獲取input隱藏域的值,然後將此值存入到數據庫中。這樣就實現了獲取文檔純文本並將其保存至數據庫中的功能。在搜索時,我們就可以利用數據庫的這個字段來實現關鍵字搜索功能。

然後是關鍵字搜索功能,我們通過數據庫中存儲文檔純文本的字段,利用sql語句將包含關鍵字的文檔搜索出來。

       實現文檔在線編輯的關鍵是利用SOAOffice,所以我們要確保引用SOAOFFICE中間件的服務器端.NET組件SOAOfficeX。本例中將SOAOfficeX.dll放在了bin文件夾下。

 

3.關鍵步驟   

       1)保存文檔純文本:我們在文檔編輯頁面word1.aspx中利用SOAOfficeAppendToolButton(Index, Caption, IconIndex)方法添加自定義的“保存”按鈕,同時禁掉word自帶的“保存”按鈕以及快捷鍵“Ctrl+S”,這裏利用了SOAOfficeEnableFileCommand(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控件的值:在保存頁面裏通過SOAOfficeRequestFormField(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.csPage_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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章