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 = "]";
我不知道加前綴和后綴的[,],對我的哪個代碼有用處,
需要路過的朋友指點一下