網(wǎng)站首頁 編程語言 正文
OLEDB
定義:
OLE DB(OLEDB)是微軟設(shè)計的通向不同的數(shù)據(jù)源的低級應(yīng)用程序接口。OLE DB不僅包括微軟資助的標(biāo)準(zhǔn)數(shù)據(jù)接口開放數(shù)據(jù)庫連通性(ODBC)的結(jié)構(gòu)化查詢語言(SQL)能力,還具有面向其他非SQL數(shù)據(jù)類型的通路。 作為微軟的組件對象模型(COM)的一種設(shè)計,OLE DB是一組讀寫數(shù)據(jù)的方法(在過去可能被稱為渠道)。OLE DB中的對象主要包括數(shù)據(jù)源對象、階段對象、命令對象和行組對象。
優(yōu)缺點:
優(yōu)點:簡單快速,能夠操作高版本Excel
缺點:只能夠進(jìn)行有限的操作(讀、寫)
應(yīng)用
利用OLEDB將DataTable數(shù)據(jù)寫入Excel文件中,如果數(shù)據(jù)量過多,執(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ù)來使用。
/// 參數(shù)IMEX的值:
/// 當(dāng) IMEX = 0 時為“匯出模式”,這個模式開啟的 Excel 檔案只能用來做“寫入”用途。
/// 當(dāng) IMEX = 1 時為“匯入模式”,這個模式開啟的 Excel 檔案只能用來做“讀取”用途。
/// 當(dāng) IMEX = 2 時為“鏈接模式”,這個模式開啟的 Excel 檔案可同時支援“讀取”與“寫入”用途。
/// </summary>
/// <param name="filepath">文件目錄和文件名</param>
/// <param name="pagesize">每頁記錄數(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ù) 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ù) 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程序支持的文件類型不止一種。
/// 在excel早期版本中,默認(rèn)的工作薄擴展名為".xls",這種格式的文件最多可以包含255個工作頁(Worksheet),每個zhidao工作頁中包含65535行(Row)和256列(Column)。
/// 自O(shè)ffice2007版本起,excel默認(rèn)的工作薄擴展名為".xlsx",這種格式的文件中每個工作頁包含1048576行(Row),16384列(Column)。
/// </summary>
/// <param name="dt">數(shù)據(jù)集</param>
/// <param name="filepath">文件目錄和文件名</param>
/// <param name="tablename">SHEET頁名稱</param>
/// <param name="pagesize">每頁記錄數(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;
//開始分頁
int page = (recordCount + pagecount - 1) / pagecount; //總頁數(shù)
for (int i = 0; i < page; i++)
{
//新的Sheet名稱
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的語句
}
m++;
}
}
//建新sheet和表頭
StringBuilder createSQL = new StringBuilder();
createSQL.Append("CREATE TABLE ").Append("[" + tabname + "]"); //每60000項建一頁
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ù)");
原文鏈接:https://www.cnblogs.com/wsk198726/p/16757033.html
相關(guān)推薦
- 2022-07-12 mac端口號被占用解決辦法
- 2022-11-22 Linux命令學(xué)習(xí)之原來最簡單的ls命令這么復(fù)雜_linux shell
- 2022-07-04 Python如何一行輸入多個數(shù),并存入列表_python
- 2023-04-03 關(guān)于CUDA?out?of?memory的解決方案_python
- 2024-07-15 聊聊消息隊列,發(fā)送消息的4種方式
- 2022-11-06 Android小工具自定義view課表_Android
- 2022-12-15 Tensorflow2.1?MNIST圖像分類實現(xiàn)思路分析_python
- 2022-09-29 Python模塊域名dnspython解析_python
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支