使用OLE DB讀寫Excel


說明:

使用這種技術的好處是無需引用對象,壞處是無法處理類似合並單元格這樣的復雜情況

一些更新:

為了使用Office 2010,需要安裝Microsoft Access 2010 數據庫引擎可再發行程序包

https://www.microsoft.com/zh-CN/download/details.aspx?id=13255

如果您是使用 OLEDB 的應用程序開發人員,請將 ConnectionString 屬性的 Provider 參數設置為“Microsoft.ACE.OLEDB.12.0”。 

如果要連接到 Microsoft Office Excel 數據,請根據 Excel 文件類型添加相應的 OLEDB 連接字符串擴展屬性: 

文件類型(擴展名)                                             擴展屬性
---------------------------------------------------------------------------------------------
Excel 97-2003 工作簿 (.xls)                                  “Excel 8.0”
Excel 2007-2010 工作簿 (.xlsx)                             “Excel 12.0 Xml”
啟用宏的 Excel 2007-2010 工作簿 (.xlsm)     “Excel 12.0 宏”
Excel 2007-2010 非 XML 二進制工作簿 (.xlsb)     “Excel 12.0”

 

 

低版本Excel看下面

來自:http://blog.csdn.net/hlzyly/article/details/5710644

Microsoft Jet 提供程序用於連接到 Excel 工作簿。在以下連接字符串中,Extended Properties 關鍵字設置 Excel 特定的屬性。“HDR=Yes;”指示第一行中包含列名,而不是數據,“IMEX=1;”通知驅動程序始終將“互混”數據列作為文本讀取。Excel 8.0 針對Excel2000及以上版本,Excel5.0 針對Excel97。

Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:/MyExcel.xls;Extended Properties=""Excel 8.0;HDR=Yes;IMEX=1""
注意,Extended Properties 所需的雙引號必須還要加雙引號。

使用ADO.NET打開、讀取並關閉代碼示例如下:

using System.Data.OleDb;

using System.Data;

 

String sConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" +

"Data Source=c:/test.xls;" +

"Extended Properties=Excel 8.0;";

OleDbConnection objConn = new OleDbConnection(sConnectionString);

objConn.Open();

OleDbCommand objCmdSelect =new OleDbCommand("SELECT * FROM [sheet1]", objConn);

OleDbDataAdapter objAdapter1 = new OleDbDataAdapter();

objAdapter1.SelectCommand = objCmdSelect;

DataSet objDataset1 = new DataSet();

//將Excel中數據填充到數據集

objAdapter1.Fill(objDataset1, "XLData");

objConn.Close();
從上面可以看出,使用ADO.Net可將Excel當作普通數據庫,使用SQL語句來操作。

通過ADO.NET獲取Excel文件的各Sheet名稱,可使用元數據方式:

String sConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" +

"Data Source=c:/test.xls;" +

"Extended Properties=Excel 8.0;";

OleDbConnection cn = new OleDbConnection(sConnectionString);

cn.Open();

DataTable tb = cn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);

foreach (DataRow row in tb.Rows)

{

//遍歷彈出各Sheet的名稱

MessageBox.Show(row["TABLE_NAME"]);

}
關於使用ADO.NET創建並寫入Excel文件與普通數據庫操作極為類似,參見以下代碼:

String sConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" +

"Data Source=c:/test.xls;" +

"Extended Properties=Excel 8.0;";

OleDbConnection cn = new OleDbConnection(sConnectionString);

string sqlCreate = "CREATE TABLE TestSheet ([ID] INTEGER,[Username] VarChar,[UserPwd] VarChar)";

OleDbCommand cmd = new OleDbCommand(sqlCreate, cn);

//創建Excel文件:C:/test.xls

cn.Open();

//創建TestSheet工作表

cmd.ExecuteNonQuery();

//添加數據

cmd.CommandText = "INSERT INTO TestSheet VALUES(1,'elmer','password')";

cmd.ExecuteNonQuery();

//關閉連接

cn.Close();
關於SQL語句中用到的數據類型,請查看System.Data.OleDb.OleDbType 枚舉。

至此,使用ADO.NET打開、創建、讀取、寫入、保存並退出已全部實現,總結起來,與數據庫操作基本無異,很簡單。這種方式的好處就是通用性強,將Excel中內容看作數據表,讀取操作簡單可靠,適合內容規范的Excel表格的數據讀取。缺點是當Excel結構復雜,如含合並單元等時,無法正確讀取,甚至出現不可預知的異常。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM