Word文档与日常办公密不可分,在实际应用中,当某一文档服务器中有很多Word文档,假如有成千上万个文档时,用户查找打开包含某些指定关键字的文档就变得很困难,目前这一问题没有好的解决方案,我个人能想到的解决方案是使用服务器端的Apache poi技术将所有文档的文本获取后存储到数据库,然后打开文档时利用sql语句检索文档是否包含关键字来判断是否是打开文档。但是这种解决办法有很大的弊端,首先poi技术对word文档支持不是很好,其中支持word的接口单一而且不太稳定,对word文档的格式也要求很高。其次如果将成千上万个文档使用poi将其文本内容存储到数据库这一操作将会在很大程度上影响服务器的性能。经过我们的不懈努力,PageOffice研究出了获取Word文档全文纯文本保存到数据库,利用数据库sql语句检索文档是否包含关键字来实现这一需求。PageOffice获取全文的纯文本文档是客户端执行的,这样就在很大程度上减轻了对服务器的压力,提高了服务器的性能。
二、主要实现代码
1、获取Word文档中的纯文本文件并保存到数据库。(以java语言为例)
- FileSaver fs = new FileSaver(request, response);
- String strDocumentText = fs.getDocumentText();
- // 您可以把此文本字符串保存到数据库字段。保存到数据库的代码此处省略
- fs.saveToFile(request.getSession().getServletContext().getRealPath("doc/") + "/" + fs.getFileName());
- fs.Close();
获取文档的纯文本内容,不带任何附加格式。如果把此文本字符串保存到数据库字段,可以简单利用SQL语句轻松实现文档管理中的全文检索功能。 注意:此属性目前仅适用于Word。 |
1、 获取文档中的纯文本保存到数据库,根据关键字检索文档中是否包含该关键字。获取文档中纯文本的代码此处不再赘述,请参考步骤二即可。
1) 数据库中的文档的存储结构说明(以access数据库为例)。
2) 搜索包含关键字的文档,以列表显示文档名。
主要代码:
- //获取页面传过来的文本框中的关键字的文本值
- String key = request.getParameter("Input_KeyWord");
- String sql = "";
- if (key != null && key.trim().length() > 0) {
- key= new String(key.getBytes("ISO-8859-1"), "utf-8");
- ql = "select * from word where Content like '%" + key
- + "%' order by ID desc";
- } else {
- sql = "select * from word order by ID desc";
- }
- Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");//载入驱动程序类别
- String strUrl = "jdbc:odbc:driver={Microsoft Access Driver (*.mdb)};DBQ="
- + this.getServletContext().getRealPath("demodata/")
- + "\\demo_search.mdb";
- Connection conn = DriverManager.getConnection(strUrl);
- Statement stmt = conn.createStatement();
- ResultSet rs = stmt.executeQuery(sql);
- int id;
- String FileName = "";
- String Content = "";
- while (rs.next()) {
- FileName = rs.getString("FileName");
- Content = rs.getString("Content");
- //id = rs.getInt("ID");
- ……
- }
- stmt.close();
- conn.close();
2、 打开编辑包含关键字的文档,并且高亮显示关键字。
高亮显示的主要js代码:
- var sMac = "function myfunc()" + "\r\n"
- + "Application.Selection.HomeKey(6) \r\n"
- + "Application.Selection.Find.ClearFormatting \r\n"
- + "Application.Selection.Find.Replacement.ClearFormatting \r\n"
- + "Application.Selection.Find.Text = \"" + key + "\" \r\n"
- + "While (Application.Selection.Find.Execute()) \r\n"
- + "If (" + visible + ") Then \r\n"
- + "Application.Selection.Range.HighlightColorIndex = 7 \r\n"
- + "Else \r\n"
- + "Application.Selection.Range.HighlightColorIndex = 0 \r\n"
- + "End If \r\n"
- + "Wend \r\n"
- + "Application.Selection.HomeKey(6) \r\n"
- + "End function";
- document.getElementById("PageOfficeCtrl1").RunMacro("myfunc", sMac);
① document.getElementById("PageOfficeCtrl1").RunMacro( MacroName, MacroScript ); //运行文档中的无返回值的宏命令。 //运行有返回值的宏命令。 在在线打开的PageOffice文档中执行已录制的宏指令或者新编写的宏指令(VBA代码)。 缺省该参数时,在客户端调用时,会根据宏指令名称执行打开的文档中已录制或存在的宏指令;如果传递该参数,就直接执行该参数中的宏指令。这里的宏指令指的是完整的VBA函数字符串,必须包含函数的开始和结束,并且函数的名字要和MacroName参数指定的函数名字完全相同。 |
注:上述示例中的详细代码及使用方式请参考Samples的综合演示三、全文搜索包含关键字的Word文档(专业版、企业版)(SaveAndSearch)和PageOffice客户端开发帮助。
|