(一) 问题
一个使用C#编写的小工具,对指定文件夹下的所有Excel文件进行筛选,如果一个文件中含有某个指定的字符串,记录该文件,并且定位这个字符串出现的位置。
网上使用C#对Excel文件进行读写的方法主要有四种:
(1)使用OleDb的方法读取Excel文件;
(2)将xls文件转化为csv文件再进行读取;
(3)使用NPOI进行Excel文件读取;
(4)使用COM组件进行读取。
(二)尝试
这几种读取Excel文件的方法我都了解了一下,每种方法各有利弊。下面进行简单的描述:
(1)使用OleDb的方法读取Excel文件
这种方法相关内容在网上可以找到很多,很多人把这种方法当作读取Excel文件的主流。简单来说就是将Excel文件当作数据库进行操作,对表中内容使用sql语句进行提取,其间需要使用到DataSet类。
顺便说一句,对于不同的.net数据提供者,ADO.NET采用不同的Connection对象连接数据库。这些Connection对我们屏蔽了实现的具体细节,并提供了一种统一的实现方式。Connection类有四种:SqlConnection、OleDbConnection、OdbcConnection和OracleConnection。分别用来连接SQL Server数据库、OLE DB数据库(如Access)、ODBC数据库、Oracle数据库。与数据库的所有通讯都是通过Connection对象完成的。本文简单谈一谈OleDb。
建立OleDb连接的核心是建立连接字符串ConnectionString,主要注意的是,对xls文件(Excel2003)和xlsx文件(Excel2007)进行连接的连接字符串不同。假设excelPath为目的excel文件的路径,则建立OleDb连接的语句分别为:
OleDbConnection connection = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + excelPath + ";" + "Extended Properties=\"Excel 8.0;HDR=yes;IMEX=1;\"");
OleDbConnection connection = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.12.0;Data Source=" + excelPath + ";" + "Extended Properties=\"Excel 12.0;HDR=yes;IMEX=1;\"");
其中"HDR=yes"是说Excel文件的第一列是列明而不是数。如果列中数据类型不一致,使用"IMEX=1"可以避免类型冲突。下面是一段网上的示例代码:
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 = ne