为了方便数据的导入,写一个通用的数据库导入方法进行导入数据会节省很大的时间,有的客户有很多的Execl,几个还好,如果多了有几百种表各种格式的表格都有,如果一个个来进行数据导入那是一个相当大的工作,写代码要每个都写一个,完了客户需求在进行变更,表格在进行改变,那代码修改量是相当大的,闹不好要死人撒,o(∩_∩)o 哈哈……懒人总会有懒的思维方式,嘿嘿……
大体的思维方式如下:
一、先创建一个Execl文件模版。在里面进行编辑一个模版,大家都知道Execl里面有公式的,从一个表里面引用其他表的数据是可以实现,这样我们把客户的表弄成跟我们模版相对应的表格,在把客户的表格用公式进行替换到其他的表格里面,在其他的表格里面我们写成利于我们进行编程的竖向表格化数据。模版的的sheet表面和里面的字段完全和数据库里面的字段一一对应。
二、编写code用代码实现导入的步骤。
(1)将创建的模版copy到临时文件夹里面
(2)将客户要导入的数据的sheet表copy到临时文件夹里面的模板里
(3)读取新模版里面的表格数据到Datatable
(4)获取Datatable里面的表名和列名生成相应的sql语句
(5)将Datatable里面数据进行循环去执行生成的sql将数据导入到创建好的数据库。
思路就是上面那样,具体实现如下面的Code所示:
引入一下命名空间
using Excel = Microsoft.Office.Interop.Excel;
using System.IO;
using System.Data.OleDb;
具体只要代码如下:
private void btn_copyToM_Click(object sender, EventArgs e)
{
//将模版copy到临时文件路径下
string tempPath = Application.StartupPath + "//temp//";
fileName = tempPath + "result_temp.xls";
string strDataFile = txt_filename.Text.Trim();
if (!System.IO.Directory.Exists(tempPath))
{
Directory.CreateDirectory(tempPath);
}
//判断是否存在模版文件
string modlPath = Application.StartupPath + "//mold//result.xls";
if (File.Exists(modlPath))
{
if (File.Exists(fileName))
{
File.Delete(fileName);
}
File.Copy(modlPath, fileName);
}
label1.Text = fileName;
// Excel.Range objRange = null;
Excel.Application objExcel = new Excel.Application();
Excel.Workbook objWorkBookMold = null;
Excel.Workbook objWorkBookData = null;
objExcel.Workbooks.Open(fileName);
objWorkBookMold = objExcel.Workbooks[1];
objExcel.Workbooks.Open(strDataFile);
objWorkBookData = objExcel.Workbooks[2];
Excel.Worksheet objSheetData = objWorkBookData.Sheets[1];
Excel.Worksheet objSheetMold = objWorkBookMold.Sheets[1];
objSheetData.UsedRange.Copy();
objSheetMold.Range["A1"].PasteSpecial();
objWorkBookMold.Save();
objWorkBookMold.Close(true, Type.Missing, Type.Missing);
objWorkBookMold = null;
objWorkBookData.Close(true, Type.Missing, Type.Missing);
objWorkBookData = null;
objExcel.Quit();
objExcel = null;
//Thread.Sleep(2000);
// File.Delete(filename);
}
/// <summary>
/// 查找指定表里面的指定数据
/// </summary>
/// <param name="path"></param>
/// <param name="tableName"></param>
/// <returns></returns>
DataTable GetDataByExcel(string path, string tableName)
{
string sqlconn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + path + ";Extended Properties=Excel 8.0";
string sql = "SELECT * FROM [" + tableName + "$] ";
DataTable dtda = new DataTable();
using (OleDbCommand oldcom = new OleDbCommand(sql, new OleDbConnection(sqlconn)))
{
OleDbDataAdapter oleda = new OleDbDataAdapter(oldcom);
dtda.TableName = tableName;
oleda.Fill(dtda);
}
return dtda;
}
/// <summary>
/// 通过数据表获取表的名字和字段名称
/// </summary>
/// <param name="data"></param>
void getDataMsg(DataTable data)
{
fileTableName = data.TableName;
fileTableColunmsName = new string[data.Columns.Count];
for (int i = 0; i < fileTableColunmsName.Length; i++)
{
fileTableColunmsName[i] = data.Columns[i].ColumnName;
}
}
/// <summary>
/// 获取模版里面的所有的表名
/// </summary>
/// <param name="path"></param>
/// <returns></returns>
string[] GetTabaleNames(string path)
{
Excel.Application objExcel = new Excel.Application();
objExcel.Workbooks.Open(path);
string[] strTableName = new string[objExcel.Workbooks[1].Worksheets.Count];
for (int i = 0; i < strTableName.Length; i++)
{
Excel.Worksheet sheet = objExcel.Workbooks[1].Worksheets[i + 1];
strTableName[i] = sheet.Name;
sheet = null;
}
objExcel.Quit();
objExcel = null;
return strTableName;
}
private void btn_sql_Click(object sender, EventArgs e)
{
StringBuilder sbSql = new StringBuilder();
sbSql.Append("insert into " + fileTableName + " ");
sbSql.Append("( ");
if (fileTableColunmsName != null)
{
if (fileTableColunmsName.Length > 0)
{
for (int i = 0; i < fileTableColunmsName.Length; i++)
{
if (i == 0)
{
sbSql.Append(fileTableColunmsName[i]);
}
else
{
sbSql.Append("," + fileTableColunmsName[i]);
}
}
sbSql.Append(")");
sbSql.Append("values ");
sbSql.Append("(");
for (int i = 0; i < fileTableColunmsName.Length; i++)
{
if (i == 0)
{
sbSql.Append("@" + fileTableColunmsName[i]);
}
else
{
sbSql.Append(",@" + fileTableColunmsName[i]);
}
}
}
}
sbSql.Append(")");
}
以上面的方式进行导入数据,不管你有多少表格了,俺们苦逼的程序员将不在进行编写Code了,只要把模版改改就OK了!
大体的思维方式如下:
一、先创建一个Execl文件模版。在里面进行编辑一个模版,大家都知道Execl里面有公式的,从一个表里面引用其他表的数据是可以实现,这样我们把客户的表弄成跟我们模版相对应的表格,在把客户的表格用公式进行替换到其他的表格里面,在其他的表格里面我们写成利于我们进行编程的竖向表格化数据。模版的的sheet表面和里面的字段完全和数据库里面的字段一一对应。
二、编写code用代码实现导入的步骤。
(1)将创建的模版copy到临时文件夹里面
(2)将客户要导入的数据的sheet表copy到临时文件夹里面的模板里
(3)读取新模版里面的表格数据到Datatable
(4)获取Datatable里面的表名和列名生成相应的sql语句
(5)将Datatable里面数据进行循环去执行生成的sql将数据导入到创建好的数据库。
思路就是上面那样,具体实现如下面的Code所示:
引入一下命名空间
using Excel = Microsoft.Office.Interop.Excel;
using System.IO;
using System.Data.OleDb;
具体只要代码如下:
private void btn_copyToM_Click(object sender, EventArgs e)
{
//将模版copy到临时文件路径下
string tempPath = Application.StartupPath + "//temp//";
fileName = tempPath + "result_temp.xls";
string strDataFile = txt_filename.Text.Trim();
if (!System.IO.Directory.Exists(tempPath))
{
Directory.CreateDirectory(tempPath);
}
//判断是否存在模版文件
string modlPath = Application.StartupPath + "//mold//result.xls";
if (File.Exists(modlPath))
{
if (File.Exists(fileName))
{
File.Delete(fileName);
}
File.Copy(modlPath, fileName);
}
label1.Text = fileName;
// Excel.Range objRange = null;
Excel.Application objExcel = new Excel.Application();
Excel.Workbook objWorkBookMold = null;
Excel.Workbook objWorkBookData = null;
objExcel.Workbooks.Open(fileName);
objWorkBookMold = objExcel.Workbooks[1];
objExcel.Workbooks.Open(strDataFile);
objWorkBookData = objExcel.Workbooks[2];
Excel.Worksheet objSheetData = objWorkBookData.Sheets[1];
Excel.Worksheet objSheetMold = objWorkBookMold.Sheets[1];
objSheetData.UsedRange.Copy();
objSheetMold.Range["A1"].PasteSpecial();
objWorkBookMold.Save();
objWorkBookMold.Close(true, Type.Missing, Type.Missing);
objWorkBookMold = null;
objWorkBookData.Close(true, Type.Missing, Type.Missing);
objWorkBookData = null;
objExcel.Quit();
objExcel = null;
//Thread.Sleep(2000);
// File.Delete(filename);
}
/// <summary>
/// 查找指定表里面的指定数据
/// </summary>
/// <param name="path"></param>
/// <param name="tableName"></param>
/// <returns></returns>
DataTable GetDataByExcel(string path, string tableName)
{
string sqlconn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + path + ";Extended Properties=Excel 8.0";
string sql = "SELECT * FROM [" + tableName + "$] ";
DataTable dtda = new DataTable();
using (OleDbCommand oldcom = new OleDbCommand(sql, new OleDbConnection(sqlconn)))
{
OleDbDataAdapter oleda = new OleDbDataAdapter(oldcom);
dtda.TableName = tableName;
oleda.Fill(dtda);
}
return dtda;
}
/// <summary>
/// 通过数据表获取表的名字和字段名称
/// </summary>
/// <param name="data"></param>
void getDataMsg(DataTable data)
{
fileTableName = data.TableName;
fileTableColunmsName = new string[data.Columns.Count];
for (int i = 0; i < fileTableColunmsName.Length; i++)
{
fileTableColunmsName[i] = data.Columns[i].ColumnName;
}
}
/// <summary>
/// 获取模版里面的所有的表名
/// </summary>
/// <param name="path"></param>
/// <returns></returns>
string[] GetTabaleNames(string path)
{
Excel.Application objExcel = new Excel.Application();
objExcel.Workbooks.Open(path);
string[] strTableName = new string[objExcel.Workbooks[1].Worksheets.Count];
for (int i = 0; i < strTableName.Length; i++)
{
Excel.Worksheet sheet = objExcel.Workbooks[1].Worksheets[i + 1];
strTableName[i] = sheet.Name;
sheet = null;
}
objExcel.Quit();
objExcel = null;
return strTableName;
}
private void btn_sql_Click(object sender, EventArgs e)
{
StringBuilder sbSql = new StringBuilder();
sbSql.Append("insert into " + fileTableName + " ");
sbSql.Append("( ");
if (fileTableColunmsName != null)
{
if (fileTableColunmsName.Length > 0)
{
for (int i = 0; i < fileTableColunmsName.Length; i++)
{
if (i == 0)
{
sbSql.Append(fileTableColunmsName[i]);
}
else
{
sbSql.Append("," + fileTableColunmsName[i]);
}
}
sbSql.Append(")");
sbSql.Append("values ");
sbSql.Append("(");
for (int i = 0; i < fileTableColunmsName.Length; i++)
{
if (i == 0)
{
sbSql.Append("@" + fileTableColunmsName[i]);
}
else
{
sbSql.Append(",@" + fileTableColunmsName[i]);
}
}
}
}
sbSql.Append(")");
}
以上面的方式进行导入数据,不管你有多少表格了,俺们苦逼的程序员将不在进行编写Code了,只要把模版改改就OK了!