很常要匯EXCEL資料到資料庫
於是請AI幫忙寫了一支通用程式,只要建好和EXCEL表頭一樣的資料表,按一下資料就進去了.
先拉一個web form aspx,然後拉一個button
然後把以下程式碼copy過去.
把button click選Button1_Click
這樣程式就OK了.不用再外掛什麼.
然後CREATE一個table 欄位名稱和要匯入的EXCEL檔案表頭一樣.
把EXCEL轉成CSV,放到設定的位置
按下按鈕,資料就進去了
protected void Button1_Click(object sender, EventArgs e)
{
// 設定區
string targetTableName = "ExcelImportData";
string filePath = @"D:\123.csv";
try
{
DataTable dt = ImportCSVToDataTable(filePath);
// 顯示在 GridView (選用)
//GridView1.DataSource = dt;
//GridView1.DataBind();
// 執行大批匯入
ExecuteBulkCopy(dt, targetTableName);
Response.Write("<script>alert('匯入成功!共 " + dt.Rows.Count + " 筆');</script>");
}
catch (Exception ex)
{
Response.Write("<script>alert('發生錯誤: " + ex.Message.Replace("'", "") + "');</script>");
}
}
/// <summary>
/// 自動讀取 CSV 並動態建立 DataTable (自動抓表頭)
/// </summary>
private DataTable ImportCSVToDataTable(string filePath)
{
DataTable dt = new DataTable();
// 使用 Big5 處理中文字,若 CSV 是 UTF8 則改為 Encoding.UTF8
using (StreamReader sr = new StreamReader(filePath, Encoding.GetEncoding("big5")))
{
string line = sr.ReadLine();
if (string.IsNullOrEmpty(line)) throw new Exception("CSV 檔案是空的");
// 1. 建立表頭
string[] headers = line.Split(',');
foreach (string header in headers)
{
dt.Columns.Add(header.Trim());
}
// 2. 讀取資料
while ((line = sr.ReadLine()) != null)
{
string[] values = line.Split(',');
if (values.Length == headers.Length)
{
dt.Rows.Add(values);
}
}
}
return dt;
}
/// <summary>
/// 通用 BulkCopy:自動對應 DataTable 與 SQL 欄位
/// </summary>
private void ExecuteBulkCopy(DataTable dt, string tableName)
{
string connStr = "server=127.0.0.1;uid=sa;pwd=1234;database=test;Connection Lifetime=600;Max Pool Size=200";
using (SqlConnection conn = new SqlConnection(connStr))
{
conn.Open();
using (SqlBulkCopy bulkCopy = new SqlBulkCopy(conn))
{
bulkCopy.DestinationTableName = tableName;
bulkCopy.BatchSize = 1000; // 效能優化
// 【核心關鍵】:自動將 CSV 的表頭對應到 SQL 同名的欄位
foreach (DataColumn col in dt.Columns)
{
bulkCopy.ColumnMappings.Add(col.ColumnName, col.ColumnName);
}
bulkCopy.WriteToServer(dt);
}
}
}