zoukankan      html  css  js  c++  java
  • 基于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     }
    复制代码

    代码很简单,实用。

    --------------------------------------

    欢迎您,进入 我系程序猿 的cnBlog博客。

    你不能改变你的过去,但你可以让你的未来变得更美好。一旦时间浪费了,生命就浪费了。

    You cannot improve your past, but you can improve your future. Once time is wasted, life is wasted.

    --------------------------------------

    分享到QQ空间  

  • 相关阅读:
    入职一周
    Qt音视频开发49-通用截图截屏
    Qt音视频开发48-通用通道管理
    Qt音视频开发47-通用视频控件
    Qt音视频开发46-视频传输UDP版
    Qt音视频开发45-视频传输TCP版
    Qt音视频开发44-实时人脸框
    Qt音视频开发43-人脸识别服务端
    Qt音视频开发42-人脸识别客户端
    Qt音视频开发41-人脸识别嵌入式
  • 原文地址:https://www.cnblogs.com/jqmtony/p/2910789.html
Copyright © 2011-2022 走看看