C#利用OLEDB實(shí)現(xiàn)將DataTable寫(xiě)入Excel文件中
OLEDB
定義:
OLE DB(OLEDB)是微軟設(shè)計(jì)的通向不同的數(shù)據(jù)源的低級(jí)應(yīng)用程序接口。OLE DB不僅包括微軟資助的標(biāo)準(zhǔn)數(shù)據(jù)接口開(kāi)放數(shù)據(jù)庫(kù)連通性(ODBC)的結(jié)構(gòu)化查詢語(yǔ)言(SQL)能力,還具有面向其他非SQL數(shù)據(jù)類(lèi)型的通路。 作為微軟的組件對(duì)象模型(COM)的一種設(shè)計(jì),OLE DB是一組讀寫(xiě)數(shù)據(jù)的方法(在過(guò)去可能被稱(chēng)為渠道)。OLE DB中的對(duì)象主要包括數(shù)據(jù)源對(duì)象、階段對(duì)象、命令對(duì)象和行組對(duì)象。
優(yōu)缺點(diǎn):
優(yōu)點(diǎn):簡(jiǎn)單快速,能夠操作高版本Excel
缺點(diǎn):只能夠進(jìn)行有限的操作(讀、寫(xiě))
應(yīng)用
利用OLEDB將DataTable數(shù)據(jù)寫(xiě)入Excel文件中,如果數(shù)據(jù)量過(guò)多,執(zhí)行效率很緩慢,大數(shù)據(jù)量不推薦使用此方法。
/// <summary> /// 創(chuàng)建DataTable /// </summary> /// <returns></returns> private DataTable CreateDataTable() { var dt = new DataTable(); dt.Columns.Add("Field1"); dt.Columns.Add("Field2"); return dt; } /// <summary> /// 根據(jù)文件后綴名判斷Excel版本 鏈接字符串 /// 參數(shù)HDR的值: /// HDR=Yes,這代表第一行是標(biāo)題,不做為數(shù)據(jù)使用 ,如果用HDR=NO,則表示第一行不是標(biāo)題,做為數(shù)據(jù)來(lái)使用。 /// 參數(shù)IMEX的值: /// 當(dāng) IMEX = 0 時(shí)為“匯出模式”,這個(gè)模式開(kāi)啟的 Excel 檔案只能用來(lái)做“寫(xiě)入”用途。 /// 當(dāng) IMEX = 1 時(shí)為“匯入模式”,這個(gè)模式開(kāi)啟的 Excel 檔案只能用來(lái)做“讀取”用途。 /// 當(dāng) IMEX = 2 時(shí)為“鏈接模式”,這個(gè)模式開(kāi)啟的 Excel 檔案可同時(shí)支援“讀取”與“寫(xiě)入”用途。 /// </summary> /// <param name="filepath">文件目錄和文件名</param> /// <param name="pagesize">每頁(yè)記錄數(shù)</param> /// <returns></returns> public static string GetExcelConnStr(string filepath, out int pagesize) { StringBuilder sb = new StringBuilder(); string extension = Path.GetExtension(filepath); if (extension == ".xlsx") { pagesize = 1048575; //實(shí)際行數(shù) 1048576 sb.Append("Provider=Microsoft.Ace.OleDb.12.0;Data Source="); sb.Append(filepath); sb.Append(";Extended Properties='Excel 12.0;HDR=Yes;IMEX=2'"); } else { pagesize = 65535; //實(shí)際行數(shù) 65536 sb.Append("Provider=Microsoft.Jet.OLEDB.4.0;Data Source="); sb.Append(filepath); sb.Append(";Extended Properties='Excel 8.0;HDR=Yes;IMEX=2'"); } return sb.ToString(); } /// <summary> /// 使用OLEDB導(dǎo)出Excel /// Excel程序支持的文件類(lèi)型不止一種。 /// 在excel早期版本中,默認(rèn)的工作薄擴(kuò)展名為".xls",這種格式的文件最多可以包含255個(gè)工作頁(yè)(Worksheet),每個(gè)zhidao工作頁(yè)中包含65535行(Row)和256列(Column)。 /// 自O(shè)ffice2007版本起,excel默認(rèn)的工作薄擴(kuò)展名為".xlsx",這種格式的文件中每個(gè)工作頁(yè)包含1048576行(Row),16384列(Column)。 /// </summary> /// <param name="dt">數(shù)據(jù)集</param> /// <param name="filepath">文件目錄和文件名</param> /// <param name="tablename">SHEET頁(yè)名稱(chēng)</param> /// <param name="pagesize">每頁(yè)記錄數(shù)</param> public static void Export(DataTable dt, string filepath, string tablename, int pagesize = 0) { int pagecount = 0; string connString = GetExcelConnStr(filepath, out pagecount); if (pagesize > 0) { pagecount = pagesize; } try { using (OleDbConnection con = new OleDbConnection(connString)) { con.Open(); DataTable dtSheet = con.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null); var sheetCount = dtSheet.Rows.Count; //總記錄數(shù) var recordCount = dt.Rows.Count; //列數(shù) var columnCount = dt.Columns.Count; OleDbCommand cmd = new OleDbCommand(); cmd.Connection = con; //開(kāi)始分頁(yè) int page = (recordCount + pagecount - 1) / pagecount; //總頁(yè)數(shù) for (int i = 0; i < page; i++) { //新的Sheet名稱(chēng) string tabname = tablename + (i + 1).ToString(); //獲取已存在的表 if (sheetCount > 0) { int m = 0; foreach (DataRow dr in dtSheet.Rows) { if (m == i) { tabname = dr["TABLE_NAME"].ToString(); cmd.CommandText = "DROP TABLE [" + tabname + "]"; cmd.ExecuteNonQuery();// 執(zhí)行創(chuàng)建sheet的語(yǔ)句 } m++; } } //建新sheet和表頭 StringBuilder createSQL = new StringBuilder(); createSQL.Append("CREATE TABLE ").Append("[" + tabname + "]"); //每60000項(xiàng)建一頁(yè) createSQL.Append("("); for (int j = 0; j < columnCount; j++) { createSQL.Append("[" + dt.Columns[j].ColumnName + "] text,"); } createSQL = createSQL.Remove(createSQL.Length - 1, 1); createSQL.Append(")"); cmd.CommandText = createSQL.ToString(); cmd.ExecuteNonQuery(); StringBuilder strfield = new StringBuilder(); for (int z = 0; z < columnCount; z++) { if (z > 0) { strfield.Append(","); } strfield.Append("[" + dt.Columns[z].ColumnName + "]"); } //準(zhǔn)備逐條插入數(shù)據(jù) for (int j = i * pagecount; j < (i + 1) * pagecount; j++) { if (i == 0 || j < recordCount) { StringBuilder insertSQL = new StringBuilder(); StringBuilder strvalue = new StringBuilder(); for (int z = 0; z < columnCount; z++) { if (z > 0) { strvalue.Append(","); } strvalue.Append("'" + dt.Rows[j][z].ToString() + "'"); } insertSQL.Append(" insert into [" + tabname + "]( ") .Append(strfield.ToString()) .Append(") values (").Append(strvalue).Append(") "); cmd.CommandText = insertSQL.ToString(); cmd.ExecuteNonQuery(); } } } con.Close(); } } catch (Exception ex) { GC.Collect(); } }
具體使用方法:
DataTable dt = CreateDataTable(); for (int i = 0; i < 70000; i++) { DataRow dr = dt.NewRow(); dr[0] = i; dr[1] = "Value" + i.ToString(); dt.Rows.Add(dr); } string filepath = Server.MapPath("~/") + "數(shù)據(jù)_" + DateTime.Now.ToString("yyyyMMddhhmmssffff") + ".xls"; Export(dt, filepath, "數(shù)據(jù)");
到此這篇關(guān)于C#利用OLEDB實(shí)現(xiàn)將DataTable寫(xiě)入Excel文件中的文章就介紹到這了,更多相關(guān)C# OLEDB DataTable寫(xiě)入Excel內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C#實(shí)現(xiàn)驗(yàn)證字符串的長(zhǎng)度的方法詳解
這篇文章主要為大家詳細(xì)介紹了C#如何使用正則表達(dá)或者計(jì)算字符數(shù)組長(zhǎng)度或字符串的長(zhǎng)度來(lái)驗(yàn)證驗(yàn)證字符串的長(zhǎng)度,感興趣的小伙伴可以學(xué)習(xí)一下2024-02-02C#中static void Main(string[] args) 參數(shù)示例詳解
這篇文章主要介紹了C#中static void Main(string[] args) 參數(shù)詳解,本文通過(guò)具體示例給大家介紹的非常詳細(xì),需要的朋友可以參考下2017-03-03