本文演示瞭如何在線編輯、保存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