思路很簡單,就是先依次獲取Excel中表的表名,然後再將Excel表的數據導入到內存以DataTable格式存在,最後再把dataTable數據導入到Mdb數據庫文件中。最後實現的功能可以使Excel多表進行導入,如果Mdb數據庫文件中已有新建的表,操作是先刪除數據庫中的已存在表,再重新創建表,導數據。
源碼:
using?System;using?System.Collections.Generic;using?System.ComponentModel;using?System.Data;using?System.Drawing;using?System.Linq;using?System.Text;using?System.Threading.Tasks;using?System.Windows.Forms;using?System.Data.OleDb;
namespace?TestK
{
public?partial?class?Form1?:?Form{
public?Form1()
{
InitializeComponent();
}
public?int?tableNameNum?=?0;//記錄Excel中所有表的數量public?OleDbConnection?connection?=?new?OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data?Source=C:\\Users\\CES\\Desktop\\CES.mdb");
//建立與數據庫文件CES.mdb的連接
//打開以.xls或者.xlsx結尾的文件private?void?button1_Click(object?sender,?EventArgs?e)
{
OpenFileDialog?dlg?=?new?OpenFileDialog();//創建窗體dlg.Filter?=?"Excel文件?(*.xls;*.xlsx)|*.xls;*.xlsx";//瀏覽過濾出以.xls或者.xlsx結尾的文件if(dlg.ShowDialog()?==?DialogResult.OK)
{
string?filePath?=?dlg.FileName;?//獲取打開文件的路徑this.textBox1.Text?=?filePath;
}
}
//獲取Excel中所有表的表名public?string[]?GetTableName(string?excelFilename)
{
//建立與指定Excel文件的連接string?connectionString?=?string.Format("Provider=Microsoft.ACE.OLEDB.12.0;Data?Source={0};Jet?OLEDB:Engine?Type=35;Extended?Properties=Excel?8.0;Persist?Security?Info=False",?excelFilename);
string[]?tableName?=?new?string[20];?//存儲Excel中所有表的表名string?temp;?//中間變量
using?(System.Data.OleDb.OleDbConnection?connection?=?new?System.Data.OleDb.OleDbConnection(connectionString))
{
connection.Open();
//獲取數據庫架構信息,包括列、主鍵、表等信息DataTable?table?=?connection.GetOleDbSchemaTable(System.Data.OleDb.OleDbSchemaGuid.Tables,?null);
for?(int?i?=?0;?i?<?table.Rows.Count;i++?)
{
temp?=?table.Rows[i]["Table_Name"].ToString();?//獲取Excel中的表名tableName[i]?=?temp.Replace("$",?"");//因為獲取的表名最後會有$符號,所以要替換}
tableNameNum?=?table.Rows.Count;
connection.Close();
}
return?tableName;
}
//獲取Excel中每張表的數據,以datatable類型返回public?DataTable?GetExcelTable(string?excelFilename,string?tableName)
{
//建立與指定Excel文件的連接string?connectionString?=?string.Format("Provider=Microsoft.ACE.OLEDB.12.0;Data?Source={0};Jet?OLEDB:Engine?Type=35;Extended?Properties=Excel?8.0;Persist?Security?Info=False",?excelFilename);
DataSet?ds?=?new?DataSet();?//數據集//using中聲明的對象connection,在using語句塊結束後會自動釋放using?(System.Data.OleDb.OleDbConnection?connection?=?new?System.Data.OleDb.OleDbConnection(connectionString))
{
connection.Open();
//獲取數據庫架構信息,包括列、主鍵、表等信息DataTable?table?=?connection.GetOleDbSchemaTable(System.Data.OleDb.OleDbSchemaGuid.Tables,?null);
string?strExcel?=?"select?*?from?"?+?"["?+?tableName?+?"$]";
//打開數據鏈接,得到壹個數據集OleDbDataAdapter?adapter?=?new?OleDbDataAdapter(strExcel,?connectionString);
//在數據集中查詢表名為tableName的表,然後把其數據在裝入數據集ds中adapter.Fill(ds,?tableName);
connection.Close();
}
return?ds.Tables[tableName];//以datatable類型返回數據集ds中表名為tableName的表}
//判斷在數據庫中,指定表名的表是否存在public?bool?TableExists(string?table)
{
bool?rythm;
connection.Open();
//讀取表名為table的表的行數信息rythm?=?connection.GetSchema("Tables",?new?string[4]?{?null,?null,?table,?"TABLE"?}).Rows.Count?>?0;
connection.Close();
return?rythm;
}
//如果在建表之前,數據庫已經存在該表,那麽首先要先刪除此表public?void?DeleteTable(string?tableName)
{
string?sql?=?"drop?table?"+tableName+";";
connection.Open();
OleDbCommand?cmd?=?new?OleDbCommand(sql,?connection);
cmd.ExecuteNonQuery();
connection.Close();
}
//中間類型為dataTable的表數據轉換到數據庫mdb文件中public?bool?dataTableToMdb(string?excelPath,string?tableName)
{
//獲取Excel中表的數據DataTable?dt?=?GetExcelTable(excelPath,tableName);
//表中數據大於等於兩行,數據轉入格式才是正確的if?(dt.Rows.Count?>=?2)
{
string[]?cloumnName?=?new?string[50];
//獲取Excel中表的所有列名for?(int?i?=?0;?i?<?dt.Columns.Count;?i++)
{
cloumnName[i]?=?dt.Rows[0][i].ToString();
}
//在mdb數據庫文件中創建表string?sql?=?"create?table?"?+?tableName?+?"?("?+?cloumnName[0]?+?"?varchar?null)";
connection.Open();
OleDbCommand?cmd?=?new?OleDbCommand(sql,?connection);
cmd.ExecuteNonQuery();
//在mdb數據庫文件中,給已創建好的表添加好所有列for?(int?i?=?1;?i?<?dt.Columns.Count;?i++)
{
sql?=?"alter?table?"?+?tableName?+?"?add?"?+?cloumnName[i]?+?"?varchar?null";
cmd?=?new?OleDbCommand(sql,?connection);
cmd.ExecuteNonQuery();
}
//在mdb數據庫文件中,給已創建好的表加入數據for?(int?t?=?1;?t?<?dt.Rows.Count;?t++)
{
sql?=?"insert?into?"?+?tableName?+?"?values('";
for?(int?k?=?0;?k?<?dt.Columns.Count;?k++)
{
if?(k?!=?dt.Columns.Count?-?1)
{
sql?=?sql?+?dt.Rows[t][k].ToString()?+?"','";
}
else{
sql?=?sql?+?dt.Rows[t][k].ToString()?+?"')";
}
}
cmd?=?new?OleDbCommand(sql,?connection);
cmd.ExecuteNonQuery();
}
connection.Close();
return?true;
}
else{
MessageBox.Show("Excel中"+?tableName?+"表的原始數據格式不正確!");
}
return?false;
}
private?void?button2_Click(object?sender,?EventArgs?e)
{
int?flag?=?1;?//判斷由Excel表導入到Mdb是否成功的標記變量?