在使用lucent检索文档时,必须先为各文档创建索引。索引的创建即读出文档信息(如文档名称、上传时间、文档内容等),然后再经过分词建索引写入到索引文件里。这里主要是总结下读取各类文档内容这一步。

一、之前做过一个小工具也涉及到读取word和excel内容,采用的是com组件的方式来读取。即导入COM库,引入命名空间(using Microsoft.Office.Interop.Word;using Microsoft.Office.Interop.Excel;),然后读代码如下:

读取word

   public string readWORD(object filepath)
{
string filename = Convert.ToString(filepath);
Microsoft.Office.Interop.Word.Application wordapp = new Microsoft.Office.Interop.Word.Application();
object isreadonly = true;
object nullobj = System.Reflection.Missing.Value;
object missingValue = Type.Missing;
object miss = System.Reflection.Missing.Value;
object saveChanges = WdSaveOptions.wdDoNotSaveChanges;
Microsoft.Office.Interop.Word._Document doc = wordapp.Documents.Open(ref filename, ref nullobj, ref isreadonly);
string content = doc.Content.Text;
doc.Close(ref saveChanges, ref missingValue, ref missingValue);
wordapp.Quit(ref saveChanges, ref miss, ref miss);
wordapp = null;
return content;
}

读取excel

用COM读取excel代码,首先是启动excel程序打开工作表,然后取得工作表名,再读取单元格内容,比较繁琐,代码略。

另外,也可以采用OleDB读取EXCEL文件,即把excel作为一个数据库,读出内容返回datatable,代码:

public DataSet ExcelToDS(string Path)
{
string strConn = "Provider=Microsoft.Jet.OLEDB.4.0;" +"Data Source="+ Path +";"+"Extended Properties=Excel 8.0;";
OleDbConnection conn = new OleDbConnection(strConn);
conn.Open();
string strExcel = "";
OleDbDataAdapter myCommand = null;
DataSet ds = null;
strExcel="select * from [sheet1$]";
myCommand = new OleDbDataAdapter(strExcel, strConn);
ds = new DataSet();
myCommand.Fill(ds,"table1");
return ds;
} 对于EXCEL中的表即sheet([sheet1$])如果不是固定的可以使用下面的方法得到
string strConn = "Provider=Microsoft.Jet.OLEDB.4.0;" +"Data Source="+ Path +";"+"Extended Properties=Excel 8.0;";
OleDbConnection conn = new OleDbConnection(strConn);
DataTable schemaTable = objConn.GetOleDbSchemaTable(System.Data.OleDb.OleDbSchemaGuid.Tables,null);
string tableName=schemaTable.Rows[][].ToString().Trim();

读取ppt

        public string readPPT(object filepath)
{
string file = filepath.ToString();
Microsoft.Office.Interop.PowerPoint.Application pa = new Microsoft.Office.Interop.PowerPoint.Application();
Microsoft.Office.Interop.PowerPoint.Presentation pp = pa.Presentations.Open(file, Microsoft.Office.Core.MsoTriState.msoTrue, Microsoft.Office.Core.MsoTriState.msoFalse, Microsoft.Office.Core.MsoTriState.msoFalse);
string content = "";
foreach (Microsoft.Office.Interop.PowerPoint.Slide slide in pp.Slides)
{
foreach (Microsoft.Office.Interop.PowerPoint.Shape shape in slide.Shapes)
content += shape.TextFrame.TextRange.Text.ToString();
}
pa.Quit();
pp.Close();
pa = null;
return content;
}

采用COM方式读取效率很低,而创建索引只需取得文档内容,也要求要快速高效获得要索引的文件内容。因此,COM读取不适用于创建索引。POI包含了各类文档所需的类,使用时只需添加相应的类,实现代码也简单,更重要的是能快速地取得文档内容。

二、采用POI

(1)首先下载POI包,在解决方案中通过“管理NuGet程序包”工具来下载;也可以到Apache官网下载。

(2)以下是POI读取各文档内容代码(包含读取txt、word、excel、ppt、pdf)。

        /// <summary>
/// 读取各类文档内容
/// </summary>
/// <param name="filepath">文档路径</param>
/// <param name="filename">文档名称</param>
/// <returns></returns>
public string textToreader(string filepath, object filename)
{
string content = null;
FileInfo file = new FileInfo(filename.ToString());
switch (file.Extension.ToLower())
{
case ".txt":
content = readTXT(filepath);
break;
case ".doc":
content = readWORD(filepath);
break;
case ".docx":
content = readWORDX(filepath);
break;
case ".xls":
content = readEXCEL(filepath);
break;
case ".xlsx":
content = readEXCELX(filepath);
break;
case ".pdf":
content = readPDF(filepath);
break;
case ".ppt":
content = readPPT(filepath);
break;
}
return content;
} /// <summary>
/// 读取txt
/// </summary>
/// <param name="filepath"></param>
/// <returns></returns>
public string readTXT(string filepath)
{
StreamReader st = new StreamReader(filepath, Encoding.GetEncoding("gb2312"));
string content = st.ReadToEnd();
return content;
} /// <summary>
/// 读取word2003
/// </summary>
/// <param name="filepath"></param>
/// <returns></returns>
public string readWORD(string filepath)
{
FileInputStream fs = new FileInputStream(filepath);
HWPFDocument doc = new HWPFDocument(fs);
string content = doc.getDocumentText();
return content;
} /// <summary>
/// 读取word2007
/// </summary>
/// <param name="filepath"></param>
/// <returns></returns>
public string readWORDX(string filepath)
{
FileInputStream fs = new FileInputStream(filepath);
XWPFDocument XDocument = new XWPFDocument(fs);
XWPFWordExtractor doc = new XWPFWordExtractor(XDocument);
string content = doc.getText();
return content;
} /// <summary>
/// 读取excel2003
/// </summary>
/// <param name="filepath"></param>
/// <returns></returns>
public string readEXCEL(object filepath)
{
string filename = filepath.ToString();
FileStream fs = new FileStream(filename, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);//读取流
POIFSFileSystem ps = new POIFSFileSystem(fs);
HSSFWorkbook hwb = new HSSFWorkbook(ps);
ExcelExtractor extractor = new ExcelExtractor(hwb);
extractor.FormulasNotResults = true;
extractor.IncludeSheetNames = true;
string content = extractor.Text;
return content;
} /// <summary>
/// 读取excel2007
/// </summary>
/// <param name="filepath"></param>
/// <returns></returns>
public string readEXCELX(string filepath)
{
//FileStream fs = new FileStream(filepath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);//读取流
FileInputStream fis = new FileInputStream(filepath);
//POIFSFileSystem ps = new POIFSFileSystem(fs);
XSSFWorkbook hwb = new XSSFWorkbook(fis);
XSSFExcelExtractor extractor = new XSSFExcelExtractor(hwb);
string content = extractor.getText();
return content;
} /// <summary>
/// 读取pdf
/// </summary>
/// <param name="filepath"></param>
/// <returns></returns>
public string readPDF(string filepath)
{
PDDocument doc = PDDocument.load(filepath);
PDFTextStripper pdfStripper = new PDFTextStripper();
string content = pdfStripper.getText(doc);
doc.close();
return content;
} /// <summary>
/// 读取ppt2003
/// </summary>
/// <param name="filepath"></param>
/// <returns></returns>
public string readPPT(string filepath)
{
FileInputStream fs = new FileInputStream(filepath);
SlideShow ss = new SlideShow(new HSLFSlideShow(fs));
Slide[] slides = ss.getSlides();// 获得每一张幻灯片 string content = "";
for (int i = ; i < slides.Length; i++)
{
TextRun[] t = slides[i].getTextRuns();// 为了取得幻灯片的文字内容,建立TextRun
for (int j = ; j < t.Length; j++)
{
content += t[j].getText();
}
}
return content;
}

注:不同版本的读取对应不同的POI接口程序。

Excel 文件: xls 格式文件对应 POI API 为 HSSF ; xlsx 格式为 office 2007 的文件格式,POI 中对应的API 为XSSF。

Word 文件:doc 格式文件对应的 POI API 为 HWPF; docx 格式为 XWPF。

powerPoint 文件:ppt 格式对应的 POI API 为 HSLF; pptx 格式为 XSLF。

三、使用POITextExtractor类可实现读取office2007兼容以上版本的文档代码:

        /// <summary>
/// 读取word2007,excel2003/2007,ppt2003/2007
/// </summary>
/// <param name="filepath"></param>
/// <returns></returns>
public string ReadOfficeText(string filepath)
{
//docx 、pptx 、xlsx、 ppt 、xls
FileInputStream fs = new FileInputStream(filepath);
POITextExtractor extractor = ExtractorFactory.createExtractor(fs);
string text = extractor.getText();
return text;
}

但是不知什么原因采用这个方法读取word2003会报错,暂时先用着上面第二点中读取word2003的方法吧。

lucent检索技术之创建索引:使用POI读取txt/word/excel/ppt/pdf内容的更多相关文章

  1. Java操作word文档使用JACOB和POI操作word,Excel,PPT需要的jar包

    可参考文档: http://wibiline.iteye.com/blog/1725492 下载jar包 http://download.csdn.net/download/javashixiaofe ...

  2. Java使用POI读取和写入Excel指南

    Java使用POI读取和写入Excel指南 做项目时经常有通过程序读取Excel数据,或是创建新的Excel并写入数据的需求: 网上很多经验教程里使用的POI版本都比较老了,一些API在新版里已经废弃 ...

  3. Java使用POI读取和写入Excel指南(转)

    做项目时经常有通过程序读取Excel数据,或是创建新的Excel并写入数据的需求: 网上很多经验教程里使用的POI版本都比较老了,一些API在新版里已经废弃,这里基于最新的Apache POI 4.0 ...

  4. 【MySQL】MySQL中针对大数据量常用技术_创建索引+缓存配置+分库分表+子查询优化(转载)

    原文地址:http://blog.csdn.net/zwan0518/article/details/11972853 目录(?)[-] 一查询优化 1创建索引 2缓存的配置 3slow_query_ ...

  5. Java中使用POI读取大的Excel文件或者输入流时发生out of memory异常参考解决方案

    注意:此参考解决方案只是针对xlsx格式的excel文件! 背景 前一段时间遇到一种情况,服务器经常宕机,而且没有规律性,查看GC日志发生了out of memory,是堆溢出导致的,分析了一下堆的d ...

  6. poi读取写入word【未完,待续】

    , [项目实战]Java POI之Word导出经典案例一 Java POI 读取word文件 POI-对于WORD的操作(一)

  7. Java 使用Apache POI读取和写入Excel表格

    1,引入所用的包 <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxm ...

  8. java使用org.apache.poi读取与保存EXCEL文件

    一.读EXCEL文件 package com.ruijie.wis.cloud.utils; import java.io.FileInputStream; import java.io.FileNo ...

  9. zz阿里妈妈深度树检索技术(TDM)及应用框架的探索实践

    分享嘉宾:何杰 阿里妈妈 高级算法专家 编辑整理:孙锴 内容来源:DataFun AI Talk 出品社区:DataFun 注:欢迎转载,转载请注明出处 导读:阿里妈妈是阿里巴巴集团旗下数字营销的大中 ...

随机推荐

  1. cocos2dX 音乐和声音效果

    今天, 我们学习cocos2dX里面音乐和音效, 为什么学他呢, 难道你喜欢看无声电影( 旁白: 我就喜欢关着声音玩), 我们不要管旁白了, 她是个疯子 老规矩, 资源准备好: 一首<故宫神思& ...

  2. Arduino 数码管LED驱动器 阵列方法

    样品谈到最后一个驱动程序LED数码管,采用了最简单的解决方案之一,对于每一个LED高低电平控制,这样的好处是每个LED控制可检.避免短路造成的错觉,因为,但是对于数字的变化是,它是多余的写,因此,这种 ...

  3. 端口扫描之王——nmap入门精讲(转)

    端口扫描在百度百科上的定义是: 端口扫描是指某些别有用心的人发送一组端口扫描消息,试图以此侵入某台计算机,并了解其提供的计算机网络服务类型(这些网络服务均与端口号相关),但是端口扫描不但可以为黑客所利 ...

  4. HDU 3788 和九度OJ 1006测试数据是不一样的

    ZOJ问题 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Subm ...

  5. hibernate学习笔记(1)hibernate基本步骤

    hibernate基本步骤 1.创hibernate置对象 Configuration config = newConfiguration(); config.configure("hibe ...

  6. 在SurfaceView中自由书写和擦除

    /////////继承SurfaceView 的类 public class PaintView extends SurfaceView implements Runnable,SurfaceHold ...

  7. 一个IT学生的personal statement

    前一段时间的英语老师要求我们写一个自己的personal statement,我相信,作为一个IT学生,人很多personal statement应该都了如指掌.进一步的研究是必要的出国留学,当然,也 ...

  8. How to recover from 'programmers burnout(转)

    程序员这个压力大,节奏快,任务繁重,所以很容易令人感觉倦怠,令人感觉烦躁,郁闷,疲惫不堪. 本文将介绍的是程序员如何克服可怕的“职业倦怠”. 丰盛的早餐——身处高科技产业漩涡的我们常常会熬夜到凌晨两三 ...

  9. NET ERP系统架构设计

    解析大型.NET ERP系统架构设计 Framework+ Application 设计模式 我对大型系统的理解,从数量上面来讲,源代码超过百万行以上,系统有超过300个以上的功能,从质量上来讲系统应 ...

  10. 平原绫香 Hirahara Ayaka-Jupiter

    我第一次听到平原绫香(Hirahara Ayaka)久石让在武道馆演唱会.她的歌声真的很震惊! 声音是如此的纯净,演唱会是如此的优雅.她着迷,只是如此美丽. 然后我去检查她的信息.发现Jupiter. ...