lucent检索技术之创建索引:使用POI读取txt/word/excel/ppt/pdf内容
在使用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内容的更多相关文章
- Java操作word文档使用JACOB和POI操作word,Excel,PPT需要的jar包
可参考文档: http://wibiline.iteye.com/blog/1725492 下载jar包 http://download.csdn.net/download/javashixiaofe ...
- Java使用POI读取和写入Excel指南
Java使用POI读取和写入Excel指南 做项目时经常有通过程序读取Excel数据,或是创建新的Excel并写入数据的需求: 网上很多经验教程里使用的POI版本都比较老了,一些API在新版里已经废弃 ...
- Java使用POI读取和写入Excel指南(转)
做项目时经常有通过程序读取Excel数据,或是创建新的Excel并写入数据的需求: 网上很多经验教程里使用的POI版本都比较老了,一些API在新版里已经废弃,这里基于最新的Apache POI 4.0 ...
- 【MySQL】MySQL中针对大数据量常用技术_创建索引+缓存配置+分库分表+子查询优化(转载)
原文地址:http://blog.csdn.net/zwan0518/article/details/11972853 目录(?)[-] 一查询优化 1创建索引 2缓存的配置 3slow_query_ ...
- Java中使用POI读取大的Excel文件或者输入流时发生out of memory异常参考解决方案
注意:此参考解决方案只是针对xlsx格式的excel文件! 背景 前一段时间遇到一种情况,服务器经常宕机,而且没有规律性,查看GC日志发生了out of memory,是堆溢出导致的,分析了一下堆的d ...
- poi读取写入word【未完,待续】
, [项目实战]Java POI之Word导出经典案例一 Java POI 读取word文件 POI-对于WORD的操作(一)
- Java 使用Apache POI读取和写入Excel表格
1,引入所用的包 <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxm ...
- java使用org.apache.poi读取与保存EXCEL文件
一.读EXCEL文件 package com.ruijie.wis.cloud.utils; import java.io.FileInputStream; import java.io.FileNo ...
- zz阿里妈妈深度树检索技术(TDM)及应用框架的探索实践
分享嘉宾:何杰 阿里妈妈 高级算法专家 编辑整理:孙锴 内容来源:DataFun AI Talk 出品社区:DataFun 注:欢迎转载,转载请注明出处 导读:阿里妈妈是阿里巴巴集团旗下数字营销的大中 ...
随机推荐
- 必须掌握的八个cmd命令
原文:必须掌握的八个cmd命令 一.ping 它是用来检查网络是否通畅或者网络连接速度的命令.作为一个生活在网络上的管理员或者黑客来说,ping命令是第一个必须掌握的DOS命令,它所利用的原理是这样的 ...
- Oracle拉进sqlserver表声明的建设
我们将Oracle数据被同步到sqlserver时间,早餐在sqlserver表中的端构造. 我们是不同步的复杂领域,只考虑以下四种数据类型. Oracle到SQLServer做的映射: int -& ...
- POSIX 螺纹具体解释(1-概要)
线程是有趣的 线程类似于进程.如同进程,线程由内核按时间分片进行管理.在单处理器系统中,内核使用时间分片来模拟线程的并发运行.这样的方式和进程的同样. 而在多处理器系统中,如同多个进程.线程实际上一样 ...
- 多于ListView同步滚动
简介: 发展过程中可能遇到的2一个或多个其他listview为了用相应的关系保持滚动的情况下一起,本文演示了这种效应为大家. 功效: 实现原理: 在滚动当中不论什么一个ListView的时候,同一时候 ...
- 【leetcode】Clone Graph(python)
类似于二叉树的三种遍历,我们能够基于遍历的模板做非常多额外的事情,图的两种遍历,深度和广度模板相同也能够做非常多额外的事情,这里举例利用深度优先遍历的模板来进行复制,深度优先中,我们先訪问第一个结点, ...
- 【软件project】生存期模型(含图)
为了反映软件生存周期内各个工作应怎样组织,各阶段怎样衔接,须要软件开发模型给出直观图示表达.软件开发模型是软件思想的详细化,是实施在过程模块中的软件开发方法和工具. 以下来介绍开发模型的特点以及他们的 ...
- HDU 3117 Fibonacci Numbers(围绕四个租赁斐波那契,通过计++乘坐高速动力矩阵)
HDU 3117 Fibonacci Numbers(斐波那契前后四位,打表+取对+矩阵高速幂) ACM 题目地址:HDU 3117 Fibonacci Numbers 题意: 求第n个斐波那契数的 ...
- Repository模式
Repository模式的两种写法与疑惑 现如今DDD越来越流行,园子里漫天都是介绍关于它的文章.说到DDD就不能不提Repository模式了,有的地方也叫它仓储模式. 很多时候我们对Reposit ...
- .Net常用方法汇总
//创建某个目录的文件夹 调用如下: var folder = initFolder(Export_Folder.Text, "ExportMembers"); private s ...
- MVC6项目
解读ASP.NET 5 & MVC6系列(2):初识项目 2015-05-14 09:08 by 汤姆大叔, 2866 阅读, 19 评论, 收藏, 编辑 初识项目 打开VS2015,创建We ...