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