在上一篇博客中写了如何对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;
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;
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;
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;
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 }
代码很简单,实用。