0、前言
在进行数据操作的时候经常会碰到这样的要求,“将从数据从Excel文件导入到数据库中”或者“将数据导出到Excel文件中”,这时我们不得不对Excel文件进行操作。
一般情况下我们使用Excel自带的一套COM对象对Excel文件进行操作,这套对象模型的功能非常强大,不仅可以通过WorkBook、WorkSheet等一系列对象操纵每一个Cell的数据,而且还可以操作Excel界面中的窗口、脚本等。Excel应用程序的这套对象模型功能是强大,但在使用的时候我们不得不面临这样几个小小的缺陷:要在工程中引用Excel的类型库,但是Excel版本众多,如果开发环境和部署环境中Excel版本不一致,就会有问题;Excel对象模型的使用逻辑和一般ADO等的数据库模型不一致,我们不得不熟悉一套新的接口对象。
幸运的是,Microsoft Jet引擎为提供了针对Excel文件的支持,这样我们就可以利用ADO/OleDb接口像操作Access数据库一样,操作Excel文件。本文简要介绍了利用在DotNET开发环境中,利用OleDb数据访问接口读取和创建Excel文件。
1、创建数据连接
在OleDb中访问数据源,非常简单,只要是安装了相应数据源的Provider,并且正确书写了连接字符串(Connection String)即可创建数据连结。创建Excel连接的示例如下:
public Boolean Open(String dataFile)
{
String sConnString = null;
Boolean fRet = false;
if (dataFile == null || dataFile == String.Empty)
return false;
if (!System.IO.File.Exists(dataFile))
return false;
/*
1: Excel 8.0 针对EXCEL 2000 或更高版本;Excel 5.0 FOR EXCEL 97
2: HDR == HEADER ROW 表示第一行是否为字段名。Yes为首行字段,No为无首行字段
3: IMEX 表示对同一列中有混合数据类型的列,是统一按字符型处理,还是将个别不同类型的值读为DBNULL。为混合,为不混合
*/
sConnString = String.Format("Provider=Microsoft.Jet.OleDb.4.0;Data Source={0};Extended Properties='Excel {1}; HDR={2}; IMEX={3};';",
dataFile, m_sExcelVersion, m_fHasHeaderRow ? "Yes" : "No", m_fMixRow ? 1 : 2);
try
{
m_connExcel = new OleDbConnection(sConnString);
if (m_connExcel != null)
{
m_connExcel.Open();
fRet = true;
}
}
catch (Exception e)
{
fRet = false;
Trace.WriteLine("COleDbExcelWrapper.Open: Open excel file failed! " + e.Message);
}
return fRet;
}
2、获取Excel文件中表单的名称
Excel文件中的每一个表单(Sheet)相当于一般数据库中的表,通过下面的示例我们可以获得一个Excel文件中包含的所有表单的名称。
/**//// <summary>
/// 获得所有表单的名称
/// </summary>
/// <returns></returns>
public ArrayList GetSheetNameList()
...{
DataTable schemaTableView;
ArrayList alData = null;
DataTableReader rsResult = null;
//'得到全部的表、视图
schemaTableView = m_connExcel.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);
if (schemaTableView != null)
...{
rsResult = schemaTableView.CreateDataReader();
if (rsResult != null)
...{
alData = new ArrayList();
if (alData != null)
...{
while (rsResult.Read())
...{
alData.Add(rsResult.GetString(2)); // Table Name;
}
}
rsResult.Close();
rsResult = null;
}
schemaTableView = null;
}
return alData;
}
3、获取Excel文件中某一个表单的数据
Excel表单中的每一行相当于一条记录,每一列相当于一个字段,所以和数据库一样可以通过SELECT语句获得一个表单中的数据。获取整个表单中所有数据的示例如下:
public OleDbDataReader GetData(String sheetName)
{
OleDbCommand oCommand = null;
OleDbDataReader rsResult = null;
if (sheetName == null || sheetName == string.Empty)
return null;
if (sheetName.Substring(sheetName.Length - 1, 1) != "$")
sheetName = sheetName + "$";
oCommand = new OleDbCommand();
Debug.Assert(oCommand != null);
try
{
oCommand.Connection = m_connExcel;
oCommand.CommandType = CommandType.Text;
oCommand.CommandText = String.Format("SELECT * FROM [{0}]", sheetName);
rsResult = oCommand.ExecuteReader(CommandBehavior.SequentialAccess);
}
catch (Exception e)
{
rsResult = null;
Trace.WriteLine("COleDbExcelWrapper.GetData: Error! " + e.Message);
}
oCommand = null;
return rsResult;
}
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/Mittermeyer/archive/2008/04/05/2253152.aspx