基于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     }

代码很简单,实用。

本人菜鸟,编码水平有限,欢迎批评指点,QQ343548233

 

你可能感兴趣的:(asp.net)