思路很简单,就是先依次获取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是否成功的标记变量 //如果有一张Excel表导入不成功,那么就标记为0,整个过程就视为失败了 //全部Excel表导入进去,整个过程才算完全成功 if(textBox1.Text.Length == 0) //判断是否选中导入的Excel文件 { MessageBox.Show("请选择导入数据的Execl文件"); } else { string[] tableName = new string[20]; //获取Excel中所有表的表名 tableName = GetTableName(this.textBox1.Text.Trim()); for(int j = 0;j < tableNameNum;j++) { if (!TableExists(tableName[j])) //判断数据库中是否已有要新建的表,没有的话,直接新建,有的话,先删除,再新建 { if(dataTableToMdb(this.textBox1.Text.Trim(),tableName[j])) //Excel表转换到Mdb数据库中 { MessageBox.Show("导入" + tableName[j] + "表数据成功!"); } else { flag = 0; MessageBox.Show("导入" + tableName[j] + "表数据失败!"); } } else { DeleteTable(tableName[j]); //删除数据库已有的同名表 if (dataTableToMdb(this.textBox1.Text.Trim(), tableName[j])) Excel表转换到Mdb数据库中 { MessageBox.Show("导入" + tableName[j] + "表数据成功!"); } else { flag = 0; MessageBox.Show("导入" + tableName[j] + "表数据失败!"); } } } if(flag==1) { MessageBox.Show("导入数据成功!"); } else { MessageBox.Show("导入数据没能完全成功!"); } } } } }