发布网友 发布时间:2022-04-27 09:32
共1个回答
热心网友 时间:2023-09-20 06:46
思路很简单,就是先依次获取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("导入数据没能完全成功!");
}
}
}
}
}