C#通过OLEDB读写Excel2013显示到datagrid控件,修改数据集并更新excel2013
excel是2013的,C#是VS2012的;excel 文件是在本机的D盘;
代码如下:
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 _20 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { //IMEX:只有是0才能成功更新,1或2都有错误提示,操作必须使用一个可更新的查询,2也有奇怪? string strCon = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + @"d:/成绩表2013.xlsx" + ";Extended Properties='Excel 12.0;HDR=YES;IMEX=0'"; //string strCon = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=d:/成绩表2013.xlsx;Extended Properties='Excel 12.0;HDR=YES;IMEX=0'"; OleDbConnection myConn = new OleDbConnection(strCon); string strCom = "SELECT * FROM [Sheet1$]"; myConn.Open(); OleDbDataAdapter myDataAdapter = new OleDbDataAdapter(strCom, myConn); DataSet myDataSet = new DataSet(); myDataAdapter.Fill(myDataSet, "[Sheet1$]"); myConn.Close(); DataTable dt = myDataSet.Tables[0]; //初始化DataTable实例 dt.PrimaryKey = new DataColumn[] { dt.Columns["学生"] };//创建索引列 DataRow myRow = dt.NewRow(); myRow["学生"] = "小蟹"; myRow["英语"] = 82; myRow["数学"] = 93; myRow["自然"] = 39; myRow["美术"] = 39; dt.Rows.Add(myRow); OleDbCommandBuilder odcb = new OleDbCommandBuilder(myDataAdapter); odcb.QuotePrefix = "["; //用于搞定INSERT INTO 语句的语法错误 odcb.QuoteSuffix = "]"; myDataAdapter.Update(myDataSet, "[Sheet1$]"); //更新数据集对应的表 dataGridView1.DataSource = myDataSet.Tables[0].DefaultView; //显示到datagridview } } }
成功了,但有两个问题:
1. 奇怪的是IMEX=0才能更新成功? IMEX=2却不能,与如下原则违背:
当 IMEX=0 时为“写出模式”,这个模式开启的 Excel 档案只能用来做“写入”用途。
当 IMEX=1 时为“写入模式”,这个模式开启的 Excel 档案只能用来做“读取”用途。
当 IMEX=2 时为“混合模式”,这个模式开启的 Excel 档案可同时支援“读取”与“写入”用途。
照例说IMEX=2应该可以啊? 不知为什么上面语句我用IMEX=2就会发生“操作必须使用一个可更新的查询”问题;
2.为什么一定要
odcb.QuotePrefix = "["; //用于搞定INSERT INTO 语句的语法错误 odcb.QuoteSuffix = "]";
我不知道加前缀和后缀的[,],对我的哪个代码有用处,
需要路过的朋友指点一下