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 = "]";
我不知道加前缀和后缀的[,],对我的哪个代码有用处,
需要路过的朋友指点一下