基于ASP.NET的lucene.net全文搜索(二)

在上一篇博客中写了如何对txt文件进行全文搜索,也阐述了我对lucene.net全文搜索的理解,核心就是提取出各个格式文档的文本内容。

这一篇中将写如何获取word、ppt、excel、pdf格式文档的内容。对于lucene.net全文搜索的框架和代码不再赘述,需要请看基于ASP.NET的lucene.net全文搜索(一)

还是按照由简到难的顺序来进行。

1.首先是读取word文档内容。

读取word文档内容,首先要在工程中添加引用

Microsoft.Vbe.Interop.dll

Microsoft.Office.Interop.Word.dll

其次在代码中添加命名空间

using Microsoft.Office;
using Microsoft.Office.Interop.Word;

View Code
复制代码
 1 public static string WordFileReader(string fileName)
 2     {
 3         //实例化COM
 4         Microsoft.Office.Interop.Word.Application wordApp = new Microsoft.Office.Interop.Word.Application();
 5         object fileobj = fileName;//必须是字符串类型
 6         object nullobj = System.Reflection.Missing.Value;
 7         object readOnly = true;
 8         //打开指定文件
 9         Microsoft.Office.Interop.Word.Document doc = wordApp.Documents.Open(ref fileobj,
10             ref nullobj,ref readOnly,ref nullobj,
11             ref nullobj,ref nullobj,ref nullobj,
12             ref nullobj,ref nullobj,ref nullobj,
13             ref nullobj,ref nullobj,ref nullobj,
14             ref nullobj,ref nullobj,ref nullobj);
15         //取得doc文件中的文本
16         string outText = doc.Content.Text.Replace("\a", "").Replace("\r", "\r\n");
17         //替换空串为空,(word中\a代表空串)替换回车为回车换行
18         doc.Close(ref nullobj, ref nullobj, ref nullobj);
19         wordApp.Quit(ref nullobj, ref nullobj, ref nullobj);
20         return outText;
21 
22     }
复制代码

在这段代码中需要注意的是:

//打开指定文件
Microsoft.Office.Interop.Word.Document doc = wordApp.Documents.Open(ref fileobj,
ref nullobj,ref readOnly,ref nullobj,
ref nullobj,ref nullobj,ref nullobj,
ref nullobj,ref nullobj,ref nullobj,
ref nullobj,ref nullobj,ref nullobj,
ref nullobj,ref nullobj,ref nullobj);

fileobj必须是字符串类型,不然就会报类型不匹配的异常。除了这一点就没有注意的了。

2.读取ppt格式文档

添加引用

Microsoft.Office.Interop.PowerPoint.dll

添加命名空间

using Microsoft.Office.Interop.PowerPoint;

View Code
复制代码
 1 public static string PptFileReader(string fileName)
 2     {
 3         //实例化
 4         Microsoft.Office.Interop.PowerPoint.Application pa = new Microsoft.Office.Interop.PowerPoint.ApplicationClass();
 5         //打开指定文件
 6         Microsoft.Office.Interop.PowerPoint.Presentation pp = pa.Presentations.Open(fileName,
 7             Microsoft.Office.Core.MsoTriState.msoTrue,
 8             Microsoft.Office.Core.MsoTriState.msoFalse,
 9             Microsoft.Office.Core.MsoTriState.msoFalse);
10         string pps = "";
11         //循环遍历每一张ppt
12         foreach (Microsoft.Office.Interop.PowerPoint.Slide slide in pp.Slides)
13         {
14             foreach (Microsoft.Office.Interop.PowerPoint.Shape shape in slide.Shapes)
15             {
16                 if (shape.HasTextFrame == MsoTriState.msoTrue)
17                 {
18                     if (shape.TextFrame.HasText == MsoTriState.msoTrue)
19                     {
20                         pps += shape.TextFrame.TextRange.Text.ToString();
21                         pps += "/n";
22                     }
23                 }
24             }
25         }
26         return pps;
27     }
复制代码

在这段代码中要注意的是:

if (shape.HasTextFrame == MsoTriState.msoTrue)
{
if (shape.TextFrame.HasText == MsoTriState.msoTrue)
{
pps += shape.TextFrame.TextRange.Text.ToString();
pps += "/n";
}
}

我刚开始只写了pps += shape.TextFrame.TextRange.Text.ToString(),没有外部的if判断,结果出现了ppt不能读取,抛出超出存储范围的异常,希望注意这一点。

3.读取excel格式文档

添加引用

Microsoft.Office.Interop.Excel.dll

添加命名空间

using Microsoft.Office.Interop.Excel;

View Code
复制代码
 1 public static string ExcelFileReader(string fileName)
 2     {
 3         System.Data.DataTable ExcelTable;
 4         DataSet ds = new DataSet();
 5         string excelStr = "";
 6         //链接Excel,判断是xls还是xlsx,这个很重要,两种格式连接方式是不一样的。        
 7         string strCon = "";
 8         if (fileName.EndsWith(".xls"))
 9         {
10             strCon = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + fileName + ";Extended Properties='Excel 8.0;HDR=YES;IMEX=1'";
11         }
12         else if (fileName.EndsWith(".xlsx"))
13         {
14             strCon = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + fileName + ";Extended Properties='Excel 12.0;HDR=YES;IMEX=1'";
15         }
16         OleDbConnection objConn =new OleDbConnection(strCon);
17         objConn.Open();
18         System.Data.DataTable schemaTable = objConn.GetOleDbSchemaTable(System.Data.OleDb.OleDbSchemaGuid.Tables, null);
19 
20         string tableName = schemaTable.Rows[0][2].ToString().Trim();//获得表名字,默认是sheet1
21         string strSql = "select * from [" + tableName + "]";
22         OleDbCommand objCmd = new OleDbCommand(strSql, objConn);
23         OleDbDataAdapter myData = new OleDbDataAdapter(strSql, objConn);
24         myData.Fill(ds, tableName);//填充数据
25 
26         ExcelTable = ds.Tables[tableName];
27         int iColums = ExcelTable.Columns.Count;//列数
28         int iRows = ExcelTable.Rows.Count;//行数
29 
30         //定义二维数组存储Excel表中读取的数据
31         string[,] storedata = new string[iRows, iColums];
32         for (int i = 0; i < ExcelTable.Rows.Count; i++)
33             for (int j = 0; j < ExcelTable.Columns.Count; j++)
34             {
35                 //将Excel表中的数据存储到数组
36                 storedata[i, j] = ExcelTable.Rows[i][j].ToString();
37                 excelStr += storedata[i, j];
38 
39             }
40         return excelStr;
41 
42     }
复制代码

实现了读取excel的文本,但是没有标题(特此提醒)

4.读取pdf格式文档

读取pdf格式文档比较复杂,不是代码复杂,复杂是引用问题,因为解析pdf文件的jar是为java开发研制的,要将它转化成.net的dll,在这个期间遇到的问题主要指引用,和下载dll的问题。

需要引用的有:

引用文件下载地址ASP.NET读取pdf文件引用包

添加命名空间

using org.pdfbox.pdmodel;
using org.pdfbox.util;

View Code
复制代码
1 public static string PdfFileReader(FileInfo fileName)
2     {
3         PDDocument doc = PDDocument.load(fileName.FullName);
4         PDFTextStripper pdfStripper = new PDFTextStripper();
5         string text = pdfStripper.getText(doc);
6         return text;
7     }
复制代码

代码很简单,实用。

posted @ 2013-02-13 14:18  Tony.J  阅读(261)  评论(0编辑  收藏  举报