(c#)Excel與SqlServer間數據相互導入
在數據庫編程中,常會遇到要把數據庫表信息導入Excel中, 有時則是把Excel內容導入數據庫中。在這里,將介紹一種比較方便快捷的方式,也是比較普遍的。其實,這方法你并不陌生。原理很簡單,把數據庫表或Excel內容讀取到dataset類型的變量中,再逐條插入到你想要導入的地方。不管是Excel轉SqlServer,還是SqlServer轉Excel,也是適用的。
其實,Excel的也可以用sql語句來操作的。說到這里,你也大概知道怎樣做吧!接下來,通過一個實例來慢慢講解。(該實例下載地址)
首先,提供該實例的數據庫和表:
數據庫名為:MyDataBase
表名為: CutClassTable
表創建語句如下:
-
use MyDataBase
-
go
-
Create Table CutClassTable(
-
StudentID varchar(20) Primary key,
-
Name varchar(20) not null,
-
CutClassSum int default(0),
-
Cause varchar(200) default('未知')
-
)
該實例運行圖:
一.Excel 導入到 SqlServer
大概步驟:
a.用sql語句中“select * from [Sheet1$]”語句獲取 Excel內容,存放到dataset類型變量中。
b.用insert 語句把dataset內容插入到SqlServer里面。
源代碼如下:
-
using System.Data.SqlClient; //用于SqlServer數據庫操作
-
using System.Data.OleDb; //用于Excel數據庫操作
-
#region Excel導入到Sqlserver
-
-
//指定的Excel文件名
-
private string strFileName;
-
//是否已經獲取到Excel文件的路徑
-
private bool hasFile;
-
//是否已經把Excel讀取到Datase中
-
private bool hasContent;
-
//從Excel中讀取到內容
-
private DataSet dsExcel;
-
-
public ExcelOperate()
-
{
-
InitializeComponent();
-
//初始化為false
-
hasFile = false;
-
hasContent = false;
-
}
-
-
private void Form1_Load(object sender, EventArgs e)
-
{}
-
-
-
public void ShowExcelContent()
-
{
-
//下面是Excel數據庫訪問操作:
-
//連接字符串
-
string strCon = @"Provider = Microsoft.Jet.OLEDB.4.0 ; Data Source = '" + strFileName + "';Extended Properties=Excel 8.0";
-
//要執行的sql語句
-
string strSql = "select * from [Sheet1$]";
-
//創建OleDb連接對象
-
OleDbConnection oleDbCon = new OleDbConnection(strCon);
-
//創建OleDbDataAdapter
-
OleDbDataAdapter oleDbDa = new OleDbDataAdapter(strSql, oleDbCon);
-
//實例化ds
-
dsExcel = new DataSet();
-
//打開連接
-
oleDbCon.Open();
-
//從數據庫讀取內容并填充到ds中
-
oleDbDa.Fill(dsExcel, "Info");
-
//關閉連接
-
oleDbCon.Close();
-
-
//綁定數據源
-
bindingSource1.DataSource = dsExcel.Tables[0];
-
//下面該句是bindingNavigator的數據綁定方法,但用該語句會提示錯誤為:bindingNavigator為只讀。所以,只能在屬性欄里的BindingSoure屬性里修改
-
//bindingNavigator1.DataBindings = bindingSource1;
-
//顯示到DataGridView
-
dataGridView1.DataSource = bindingSource1;
-
//標記ds有內容
-
hasContent = true;
-
}
-
-
public void ToSqlServer()
-
{
-
//要執行的sql語句,暫時無.這里采用Stringbuilder類,因為接下來字符串連接操作比較多
-
StringBuilder strbSql = new StringBuilder();
-
//SqlServer連接語句,該實例數據庫為“MyDataBase”
-
string strCon = @"Data Source=Localhost;Initial Catalog=MyDataBase;Integrated Security=True";
-
//創建連接
-
SqlConnection sqlCon = new SqlConnection(strCon);
-
//創建一個空的sql執行對象
-
SqlCommand sqlCom = new SqlCommand();
-
//把連接對象賦予sqlCom
-
sqlCom.Connection = sqlCon;
-
//打開連接
-
sqlCon.Open();
-
//用try catch 語句,捕抓錯誤
-
try
-
{
-
//連續往SqlServer表里插入數據
-
for (int i = 0; i < dsExcel.Tables[0].Rows.Count; i++)
-
{
-
//要執行的insert語句:有一點要注意,在SqlServer中用 '' 標記字符串,這里記得要添加
-
strbSql.Append("insert into CutClassTable(StudentID, Name, CutClassSum, Cause) values('");
-
for (int j = 0; j < 3; j++)
-
{
-
strbSql.Append(dsExcel.Tables[0].Rows[i].ItemArray[j].ToString() + "','");
-
}
-
strbSql.Append(dsExcel.Tables[0].Rows[i].ItemArray[3].ToString() + "')");
-
-
//執行sql語句
-
string strSql = strbSql.ToString();
-
sqlCom.CommandText = strSql;
-
sqlCom.ExecuteNonQuery();
-
//strbSql里面內容要清除,否則會疊加的,提示信息重復插入等信息
-
strbSql.Remove(0, strbSql.Length);
-
}
-
//插入成功提示
-
MessageBox.Show("導入SqlServer成功!請查看?。?, "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
-
-
}
-
catch (Exception ex)
-
{
-
//失敗提示
-
MessageBox.Show("導入SqlServer過程中發生錯誤!/n錯誤提示:" + ex.Message, "警告", MessageBoxButtons.OK, MessageBoxIcon.Error);
-
}
-
finally
-
{
-
//關閉連接
-
sqlCon.Close();
-
}
-
}
-
-
/// <summary>
-
/// 選擇Excel文件
-
/// </summary>
-
/// <param name="sender"></param>
-
/// <param name="e"></param>
-
private void bntFindFile_Click(object sender, EventArgs e)
-
{
-
//文件選擇對話框
-
OpenFileDialog FilePath = new OpenFileDialog();
-
//判斷是否選擇好文件
-
if (FilePath.ShowDialog() == DialogResult.OK)
-
{
-
hasFile = true;
-
strFileName = FilePath.FileName;
-
tbFileName.Text = strFileName;
-
}
-
}
-
-
/// <summary>
-
/// 顯示Excel內容到DatagridView
-
/// </summary>
-
/// <param name="sender"></param>
-
/// <param name="e"></param>
-
private void bntShowExcel_Click(object sender, EventArgs e)
-
{
-
//判斷是否已經選擇好文件
-
if (hasFile)
-
{
-
//顯示Excel內容到DatagridView
-
ShowExcelContent();
-
}
-
}
-
-
private void btnToSqlServer_Click(object sender, EventArgs e)
-
{
-
//判斷ds是否有內容
-
if (hasContent)
-
{
-
//導入到SqlServer
-
ToSqlServer();
-
}
-
}
-
#endregion
運行結果:
二.SqlServer導入Excel
步驟:(同上)
源代碼如下:
-
#region SqlServer導入到Excel
-
-
//新創建的Excel文件路徑
-
public string strSaveFileName;
-
//存放SqlServer內容
-
public DataSet dsSqlServer;
-
-
/// <summary>
-
/// 選擇Excel的保存路徑
-
/// </summary>
-
/// <returns>已經選擇好文件路徑則返回true, 否則false</returns>
-
public bool ChoicePath()
-
{
-
//保存對話框
-
SaveFileDialog savePath = new SaveFileDialog();
-
if (savePath.ShowDialog() == DialogResult.OK)
-
{
-
strSaveFileName = savePath.FileName;
-
//判斷文件是否已存在
-
if (IsExist(strSaveFileName))
-
{
-
return true;
-
}
-
else
-
{
-
return false;
-
}
-
}
-
else
-
{
-
return false;
-
}
-
}
-
-
/// <summary>
-
/// 判斷文件是否已存在,存在則詢問是否覆蓋
-
/// </summary>
-
/// <param name="fileName">文件路徑</param>
-
/// <returns>“不存在”或“存在并允許覆蓋”返回true, 存在但不覆蓋返回false</returns>
-
public bool IsExist(string fileName)
-
{
-
//判斷文件是否已存在
-
if (System.IO.File.Exists(fileName + ".xls"))
-
{ //提示是否覆蓋
-
if (MessageBox.Show("該文件已經存在,是否覆蓋?", "提示", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.No)
-
{
-
return false;
-
}
-
else
-
{ //刪除已有文件
-
System.IO.File.Delete(fileName + ".xls");
-
return true;
-
}
-
}
-
return true;
-
}
-
-
/// <summary>
-
/// 獲取SqlServer內容,存放到dsSqlServer里面
-
/// </summary>
-
public void GetDs()
-
{
-
//要執行的sql語句
-
String strSql = "select * from CutClassTable";
-
//SqlServer連接語句,該實例數據庫為“MyDataBase”
-
string strCon = @"Data Source=Localhost;Initial Catalog=MyDataBase;Integrated Security=True";
-
//創建連接
-
SqlConnection sqlCon = new SqlConnection(strCon);
-
//.......
-
SqlDataAdapter sqlDa = new SqlDataAdapter(strSql, strCon);
-
dsSqlServer = new DataSet();
-
sqlCon.Open();
-
sqlDa.Fill(dsSqlServer, "Info");
-
sqlCon.Close();
-
}
-
-
/// <summary>
-
/// 創建Excel文件,在我的其它文章里,有講這方面內容,不清楚的可翻看前面章節
-
/// </summary>
-
private void CreateExcel()
-
{
-
try
-
{
-
//創建Excel對象
-
Microsoft.Office.Interop.Excel.Application excel = new Microsoft.Office.Interop.Excel.Application();
-
//創建新的Excel工作簿
-
Microsoft.Office.Interop.Excel.Workbook wBook = excel.Application.Workbooks.Add(Missing.Value);
-
//使Excel不可視
-
excel.Visible = false;
-
-
//設置禁止彈出保存和覆蓋的詢問提示框
-
excel.DisplayAlerts = false;
-
excel.AlertBeforeOverwriting = true;
-
-
//保存
-
wBook.SaveAs(@strSaveFileName,
-
Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value,
-
Microsoft.Office.Interop.Excel.XlSaveAsAccessMode.xlNoChange, Missing.Value, Missing.Value, Missing.Value,
-
Missing.Value, Missing.Value);
-
-
wBook = null;
-
//必須有該語句,才能有效結束,否則每次運行會產生一個Excel
-
excel.Quit();
-
excel = null;
-
-
}
-
catch (Exception err)
-
{
-
//錯誤提示
-
MessageBox.Show("Excel操作出錯!錯誤原因:" + err.Message, "提示信息",
-
MessageBoxButtons.OK, MessageBoxIcon.Information);
-
-
}
-
}
-
-
/// <summary>
-
/// 把數據導入Excel
-
/// </summary>
-
private void InsertToExcel()
-
{
-
//下面是Excel數據庫訪問操作:
-
//連接字符串
-
string strCon = @"Provider = Microsoft.Jet.OLEDB.4.0;Data Source = '" + strSaveFileName + "';Extended Properties='Excel 8.0;HDR=NO'";
-
//要執行的sql語句,采用stringbuilder類
-
StringBuilder strbSql = new StringBuilder();
-
//創建OleDb連接對象.
-
OleDbConnection oleDbCon = new OleDbConnection(strCon);
-
//創建執行對象
-
OleDbCommand oleDbCom = new OleDbCommand();
-
//賦予連接對象
-
oleDbCom.Connection = oleDbCon;
-
//打開連接
-
oleDbCon.Open();
-
//下面是數據插入到Excel
-
try
-
{
-
//創建一張新的工作表,表名為MySheet。你或許疑惑為什么不在原有的工作區Sheet1里導入,在后面我會講到!
-
string strSql = "create table MySheet (學號 char(20), 姓名 char(20), 曠課次數 int, 原因 char(255)) ";
-
//賦予sql語句
-
oleDbCom.CommandText = strSql;
-
//執行sql語句,創建一個新表
-
oleDbCom.ExecuteNonQuery();
-
//循環插入數據
-
for (int i = 0; i < dsSqlServer.Tables[0].Rows.Count; i++)
-
{
-
//要注意 參數要用 ' '括起來的。例如: 'value'
-
strbSql.Append("insert into [MySheet$] values('");
-
for (int j = 0; j < 3; j++)
-
{
-
strbSql.Append(dsSqlServer.Tables[0].Rows[i].ItemArray[j].ToString() + "','");
-
}
-
strbSql.Append(dsSqlServer.Tables[0].Rows[i].ItemArray[3].ToString() + "')");
-
//stringbuilder轉為string類型,因為sql語句不能直接執行stringbuilder類
-
strSql = strbSql.ToString();
-
oleDbCom.CommandText = strSql;
-
oleDbCom.ExecuteNonQuery();
-
//清除strbSql過往信息
-
strbSql.Remove(0, strbSql.Length);
-
}
-
//插入成功提示
-
MessageBox.Show("導入Excel成功!請查看?。?, "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
-
}
-
catch (Exception ex)
-
{
-
//失敗提示
-
MessageBox.Show("導入Excel過程中發生錯誤!/n錯誤提示:" + ex.Message, "警告", MessageBoxButtons.OK, MessageBoxIcon.Error);
-
}
-
finally
-
{
-
oleDbCon.Close();
-
}
-
-
}
-
-
/// <summary>
-
/// 導入數據到Excel
-
/// </summary>
-
/// <param name="sender"></param>
-
/// <param name="e"></param>
-
private void bntToExcel_Click(object sender, EventArgs e)
-
{
-
//判斷是否選擇好路徑
-
if (ChoicePath())
-
{
-
//創建一個Excel文件
-
CreateExcel();
-
//獲取SqlServer表內容,存放到dsSqlServer里面
-
GetDs();
-
//導入數據到Excel
-
InsertToExcel();
-
}
-
}
-
-
#endregion
運行結果:
知識點講解:
a.Excel的數據庫操作命名空間為“System.Data.OleDb”;
b.Excel中的表其實是工作區,新建一個Excel,你會看到左下角會有3個工作區(分別為Sheet1, Sheet2, Sheet3)。一般數據存放在Sheet1中。
c.Excel的數據庫連接字符串為@"Provider = Microsoft.Jet.OLEDB.4.0 ; Data Source = '" + strFileName + "';Extended Properties=Excel 8.0";
也可以如下:@"Provider = Microsoft.Jet.OLEDB.4.0;Data Source = '" + strSaveFileName + "';Extended Properties='Excel 8.0;HDR=NO'";
在第二個連接字符串中,新增加了字段”HDR=NO“,表示若Excel里沒有字段名,則用自動采用F1,F2。。作為字段名。(其實,我嘗試過,是不行的。)還有一點要注意:在Extended
Properties=后面可以再接其他擴展屬性字段,但要用單引號' '來括起來,否則會報錯:未找到可安裝的ISAM;即語法錯誤。
d.StingBuider與String的區別和用法
Stringbuilder其實也是字符串。只不過,String是靜態的字符串,而Stringbuilder是動態的 。為什么這么說?String 一當創建,它的大小已經是固定的了,如果在它后面再連接字符串,它會創建一個新的String實例,借于容納更多的字符。所以,說String是靜態的。相反,StringBuilder則類似于動態數組,每當連接新的字符串時,它會動態地申請空間,而不需要重新再創建一個。 其方法如下:
最后,補充幾點:
1.在SqlServer導入Excel例子中,我是采用新建一個表的方法,再往里面插入。其實,你可以直接往Sheet1里面插入數據,這樣更直接,更方便。我要如此做是迫于無奈的,因為調用“insert
into [Sheet1$](F1, F2, F3,F4)
values(...)”中,總是提示無F2,F3,F4字段。無奈啊,HDR=NO/YES,
均試過,都不行。還想過,直接刪掉Sheet1,再建個,可惜,也是夭折了。這里,就不發嘮叨了。
2.導入Excel的方法還有幾種,這里大概講一下原理。其中一種,是通過創建Excel對象,采用“wSheet.Cells[ x, y] = "修改或添加數據"”的方式,詳情見我相關的文章。
3.對于Excel, Access, SqlServer三者間或其他數據庫的數據導入,這種方法也是適用的。
CDA數據分析師考試相關入口一覽(建議收藏):
? 想報名CDA認證考試,點擊>>>
“CDA報名”
了解CDA考試詳情;
? 想學習CDA考試教材,點擊>>> “CDA教材” 了解CDA考試詳情;
? 想加入CDA考試題庫,點擊>>> “CDA題庫” 了解CDA考試詳情;
? 想了解CDA考試含金量,點擊>>> “CDA含金量” 了解CDA考試詳情;