Excel表中数据导入到数据库Mdb文件实例(附源码)

思路很简单,就是先依次获取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] { nullnull, 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("导入数据没能完全成功!");
                }
            }
        }
    }
}


你可能感兴趣的:(WF)