c#操作excel方式二:采用OleDB操作Excel文件
2013-04-15 17:59
549 查看
内容:1.dataset转excel函数代码
2.excel转dataset函数代码
3.运用实例:
3.1写入excel
3.2读取excel
dataset格式写入excel函数如下:
读取excel函数如下:
运用例子:
添加一个opendiog用于选择要写入的excel
引用命名空间:
定义dataset转excel函数:
写入按钮代码(从sql数据库中提取一些数据到dataset中,把datatable写入excel中):
可能遇到的问题:
1.不能连接数据库
解决方法:
(1)注意连接语句的版本是否正确
string strConn = "Provider=Microsoft.Jet.OLEDB.4.0;" + "Data Source=" + Path + ";" + "Extended Properties=Excel 8.0;";//string strCon = "Provider=Microsoft.Jet.OleDb.4.0;" + "data source=" +Path+ ";Extended Properties='Excel
8.0; HDR=Yes; IMEX=1'"; //此连接只能操作Excel2007之前(.xls)文件
//string strCon = "Provider=Microsoft.Ace.OleDb.12.0;" + "data source=" + Path + ";Extended Properties='Excel 12.0; HDR=No; IMEX=0'"; //此连接可以操作.xls与.xlsx文件 (支持Excel2003 和 Excel2007 的连接字符串)
(2)检查路径是否正确
(3)路径时检查文件夹是否有写入权限
2.操作必须使用一个可更新的查询
注意连接的参数,这里 我用IMEX=0时才能写入成功
A: HDR ( HeaDer Row )设置
若指定值为Yes,代表 Excel 档中的工作表第一行是栏位名称
若指定值為 No,代表 Excel 档中的工作表第一行就是資料了,沒有栏位名称
B:IMEX ( IMport EXport mode )设置
IMEX 有三种模式,各自引起的读写行为也不同,容後再述:
0 is Export mode
1 is Import mode
2 is Linked mode (full update capabilities)
我这里特别要说明的就是 IMEX 参数了,因为不同的模式代表著不同的读写行为:
当 IMEX=0 时为“汇出模式”,这个模式开启的 Excel 档案只能用来做“写入”用途。
当 IMEX=1 时为“汇入模式”,这个模式开启的 Excel 档案只能用来做“读取”用途。
当 IMEX=2 时为“连結模式”,这个模式开启的 Excel 档案可同时支援“读取”与“写入”用途。
3.无法找到列
观察到 我们这里的newds.Tables["Table1"]表是通过 select * from [Sheet1$]产生的,则它的表结构跟excel的表结构一样
如果你的dataset有4列,而excel是空表(默认为一列),则会报这个错误
所有我们要先打开excel,定好有多少列
最终结果:
好 写入完成 下面是读取
定义读取函数:
读取按钮的代码:
2.excel转dataset函数代码
3.运用实例:
3.1写入excel
3.2读取excel
dataset格式写入excel函数如下:
public void DSToExcel(string Path, DataSet oldds) { //先得到汇总Excel的DataSet 主要目的是获得Excel在DataSet中的结构 string strCon = "Provider=Microsoft.Jet.OLEDB.4.0;" + "Data Source=" + Path + ";" + "Extended Properties=Excel 8.0;"; //string strCon = "Provider=Microsoft.Jet.OleDb.4.0;" + "data source=" +Path+ ";Extended Properties='Excel 8.0; HDR=Yes; IMEX=1'"; //此连接只能操作Excel2007之前(.xls)文件 //string strCon = "Provider=Microsoft.Ace.OleDb.12.0;" + "data source=" + Path + ";Extended Properties='Excel 12.0; HDR=No; IMEX=0'"; //此连接可以操作.xls与.xlsx文件 (支持Excel2003 和 Excel2007 的连接字符串) //备注: "HDR=yes;"是说Excel文件的第一行是列名而不是数据,"HDR=No;"正好与前面的相反。// "IMEX=1 "如果列中的数据类型不一致,使用"IMEX=1"可必免数据类型冲突。 OleDbConnection myConn = new OleDbConnection(strCon); string strCom = "select * from [Sheet1$]"; myConn.Open(); OleDbDataAdapter myCommand = new OleDbDataAdapter(strCom, myConn); System.Data.OleDb.OleDbCommandBuilder builder = new OleDbCommandBuilder(myCommand); //QuotePrefix和QuoteSuffix主要是对builder生成InsertComment命令时使用。 builder.QuotePrefix = "["; //获取insert语句中保留字符(起始位置) builder.QuoteSuffix = "]"; //获取insert语句中保留字符(结束位置) DataSet newds = new DataSet(); myCommand.Fill(newds, "Table1"); for (int i = 0; i < oldds.Tables[0].Rows.Count; i++) { //在这里不能使用ImportRow方法将一行导入到news中, //因为ImportRow将保留原来DataRow的所有设置(DataRowState状态不变)。 //在使用ImportRow后newds内有值,但不能更新到Excel中因为所有导入行的DataRowState!=Added DataRow nrow = newds.Tables["Table1"].NewRow(); for (int j = 0; j < oldds.Tables[0].Columns.Count; j++) { nrow[j] = oldds.Tables[0].Rows[i][j]; } newds.Tables["Table1"].Rows.Add(nrow); } myCommand.Update(newds, "Table1"); myConn.Close(); }
读取excel函数如下:
public DataSet ExcelToDS(string Path) { string strConn = "Provider=Microsoft.Jet.OLEDB.4.0;" + "Data Source=" + Path + ";" + "Extended Properties=Excel 8.0;"; OleDbConnection conn = new OleDbConnection(strConn); conn.Open(); string strExcel = ""; OleDbDataAdapter myCommand = null; DataSet ds = null; strExcel = "select * from [sheet1$]"; myCommand = new OleDbDataAdapter(strExcel, strConn); ds = new DataSet(); myCommand.Fill(ds, "table1"); return ds; }
运用例子:
添加一个opendiog用于选择要写入的excel
引用命名空间:
using System.Data.SqlClient; using System.Data.OleDb; using System.IO;
定义dataset转excel函数:
public void DSToExcel(string Path, DataSet oldds) { //先得到汇总Excel的DataSet 主要目的是获得Excel在DataSet中的结构 string strCon= "Provider=Microsoft.Jet.OLEDB.4.0;" + "Data Source=" + Path + ";" + "Extended Properties=Excel 8.0;"; //string strCon = "Provider=Microsoft.Jet.OleDb.4.0;" + "data source=" +Path+ ";Extended Properties='Excel 8.0; HDR=Yes; IMEX=1'"; //此连接只能操作Excel2007之前(.xls)文件 //string strCon = "Provider=Microsoft.Ace.OleDb.12.0;" + "data source=" + Path + ";Extended Properties='Excel 12.0; HDR=No; IMEX=0'"; //此连接可以操作.xls与.xlsx文件 (支持Excel2003 和 Excel2007 的连接字符串) //备注: "HDR=yes;"是说Excel文件的第一行是列名而不是数据,"HDR=No;"正好与前面的相反。// "IMEX=1 "如果列中的数据类型不一致,使用"IMEX=1"可必免数据类型冲突。 OleDbConnection myConn = new OleDbConnection(strCon); string strCom = "select * from [Sheet1$]"; myConn.Open(); OleDbDataAdapter myCommand = new OleDbDataAdapter(strCom, myConn); System.Data.OleDb.OleDbCommandBuilder builder = new OleDbCommandBuilder(myCommand); //QuotePrefix和QuoteSuffix主要是对builder生成InsertComment命令时使用。 builder.QuotePrefix = "["; //获取insert语句中保留字符(起始位置) builder.QuoteSuffix = "]"; //获取insert语句中保留字符(结束位置) DataSet newds = new DataSet(); myCommand.Fill(newds, "Table1"); for (int i = 0; i < oldds.Tables[0].Rows.Count; i++) { //在这里不能使用ImportRow方法将一行导入到news中, //因为ImportRow将保留原来DataRow的所有设置(DataRowState状态不变)。 //在使用ImportRow后newds内有值,但不能更新到Excel中因为所有导入行的DataRowState!=Added DataRow nrow = newds.Tables["Table1"].NewRow(); for (int j = 0; j < oldds.Tables[0].Columns.Count; j++) { nrow[j] = oldds.Tables[0].Rows[i][j]; } newds.Tables["Table1"].Rows.Add(nrow); } myCommand.Update(newds, "Table1"); myConn.Close(); }
写入按钮代码(从sql数据库中提取一些数据到dataset中,把datatable写入excel中):
private void button1_Click(object sender, EventArgs e) { SqlConnection conn = new SqlConnection("Data Source=.;Initial Catalog=Student;User ID=sa;Password=123;"); conn.Open(); SqlDataAdapter adapter = new SqlDataAdapter(); SqlCommand cmdSelect = new SqlCommand("select * from score"); cmdSelect.Connection = conn; adapter.SelectCommand = cmdSelect; DataSet ds = new DataSet(); adapter.Fill(ds,"class"); this.dataGridView1.DataSource = ds; this.dataGridView1.DataMember="class"; if (openFileDialog.ShowDialog() == DialogResult.OK) { string path=openFileDialog.FileName; DSToExcel(openFileDialog.FileName, ds); MessageBox.Show("写入结束"); } }
可能遇到的问题:
1.不能连接数据库
解决方法:
(1)注意连接语句的版本是否正确
string strConn = "Provider=Microsoft.Jet.OLEDB.4.0;" + "Data Source=" + Path + ";" + "Extended Properties=Excel 8.0;";//string strCon = "Provider=Microsoft.Jet.OleDb.4.0;" + "data source=" +Path+ ";Extended Properties='Excel
8.0; HDR=Yes; IMEX=1'"; //此连接只能操作Excel2007之前(.xls)文件
//string strCon = "Provider=Microsoft.Ace.OleDb.12.0;" + "data source=" + Path + ";Extended Properties='Excel 12.0; HDR=No; IMEX=0'"; //此连接可以操作.xls与.xlsx文件 (支持Excel2003 和 Excel2007 的连接字符串)
(2)检查路径是否正确
(3)路径时检查文件夹是否有写入权限
2.操作必须使用一个可更新的查询
注意连接的参数,这里 我用IMEX=0时才能写入成功
A: HDR ( HeaDer Row )设置
若指定值为Yes,代表 Excel 档中的工作表第一行是栏位名称
若指定值為 No,代表 Excel 档中的工作表第一行就是資料了,沒有栏位名称
B:IMEX ( IMport EXport mode )设置
IMEX 有三种模式,各自引起的读写行为也不同,容後再述:
0 is Export mode
1 is Import mode
2 is Linked mode (full update capabilities)
我这里特别要说明的就是 IMEX 参数了,因为不同的模式代表著不同的读写行为:
当 IMEX=0 时为“汇出模式”,这个模式开启的 Excel 档案只能用来做“写入”用途。
当 IMEX=1 时为“汇入模式”,这个模式开启的 Excel 档案只能用来做“读取”用途。
当 IMEX=2 时为“连結模式”,这个模式开启的 Excel 档案可同时支援“读取”与“写入”用途。
3.无法找到列
观察到 我们这里的newds.Tables["Table1"]表是通过 select * from [Sheet1$]产生的,则它的表结构跟excel的表结构一样
如果你的dataset有4列,而excel是空表(默认为一列),则会报这个错误
所有我们要先打开excel,定好有多少列
最终结果:
好 写入完成 下面是读取
定义读取函数:
public DataSet ExcelToDS(string Path) { string strConn = "Provider=Microsoft.Jet.OLEDB.4.0;" + "Data Source=" + Path + ";" + "Extended Properties=Excel 8.0;"; OleDbConnection conn = new OleDbConnection(strConn); conn.Open(); string strExcel = ""; OleDbDataAdapter myCommand = null; DataSet ds = null; strExcel = "select * from [sheet1$]"; myCommand = new OleDbDataAdapter(strExcel, strConn); ds = new DataSet(); myCommand.Fill(ds, "table1"); return ds; }
读取按钮的代码:
private void button2_Click(object sender, EventArgs e) { if (openFileDialog.ShowDialog() == DialogResult.OK) { DataSet da=ExcelToDS(openFileDialog.FileName); this.dataGridView1.DataSource = da; this.dataGridView1.DataMember = "table1"; } }
相关文章推荐
- c#操作excel方式二:采用OleDB操作Excel文件
- c#中采用OLEDB方式来读取EXCEL文件和将数据写入EXCEL文件
- c#中采用OLEDB方式来读取EXCEL文件和将数据写入EXCEL文件
- c#中采用OLEDB方式来读取EXCEL文件和将数据写入EXCEL文件
- c#中采用OLEDB方式来读取EXCEL文件和将数据写入EXCEL文件
- C#中的Excel操作【1】——设置Excel单元格的内容,打开Excel文件的一种方式
- c#操作excel方式三:使用Microsoft.Office.Interop.Excel.dll读取Excel文件
- C#操作Excel的OLEDB方式与COM方式比较
- c#中采用OLEDB方式来读取EXCEL文件和将数据写入EXCEL文件
- c#操作excel方式三:使用Microsoft.Office.Interop.Excel.dll读取Excel文件
- c# 不采用引用的方式操作Excel
- c#操作excel方式三:使用Microsoft.Office.Interop.Excel.dll读取Excel文件
- c#操作excel方式三:使用Microsoft.Office.Interop.Excel.dll读取Excel文件
- c#中采用OLEDB方式来读取EXCEL文件和将数据写入EXCEL文件
- 【c#操作office】--OleDbDataAdapter 与OleDbDataReader方式读取excel,并转换为datatable
- c#操作excel方式三:使用Microsoft.Office.Interop.Excel.dll读取Excel文件
- C#操作Excel的OLEDB方式与COM方式比较
- C#以OleDb的方式操作Excel文件(三)
- 【c#操作office】--OleDbDataAdapter 与OleDbDataReader方式读取excel,并转换为datatable
- c#操作excel方式三:使用Microsoft.Office.Interop.Excel.dll读取Excel文件