C#使用Oledb datagridview更新Excel

namespace PROCESS_FOLDER_V2 { public partial class OrganiZe : Form { public OrganiZe() { InitializeComponent(); } int TotalCnt = 0; private void Insert(int Col1, string Col2, string Col3, string Col4, int Col5) { // MessageBox.Show("SNo: " + Col1 + "\n"+"\n" + "Material Code " + Col2 + "\n"+"\n" + "Item Text :" + Col3 +"\n"+"\n"+ "PO Text :" + Col4 + "\n"+"\n"+"PR Number :" + Col5, "OrganiZe"); while (Col4.Contains("'")) { Col4 = Col4.Replace("'", "`"); }; while (Col3.Contains("'")) { Col3 = Col3.Replace("'", "`"); }; //File.WriteAllText("Char.txt", Col4); //MessageBox.Show("SNo: " + Col1 + "\n" + "\n" + "Material Code " + Col2 + "\n" + "\n" + "Item Text :" + Col3 + "\n" + "\n" + "PO Text :" + Col4 + "\n" + "\n" + "PR Number :" + Col5, "OrganiZe"); System.Data.OleDb.OleDbConnection MyConnection; System.Data.OleDb.OleDbCommand myCommand = new System.Data.OleDb.OleDbCommand(); string sql = null; MyConnection = new System.Data.OleDb.OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=e:\PRTEXT.xls;Extended Properties=Excel 8.0"); MyConnection.Open(); myCommand.Connection = MyConnection; sql = "INSERT INTO [PR$]" + "([SNo],[MATERIAL CODE],[ITEM TEXT],[PO TEXT],[PRNo])" + "VALUES('" + Col1 + "','" + Col2 + "','" + Col3 + "','" + Col4 + "','" + Col5 + "')"; myCommand.CommandText = sql; myCommand.ExecuteNonQuery(); DataSet ds = new DataSet(); OleDbDataAdapter da; da = new OleDbDataAdapter(myCommand); DataTable dt = new DataTable(); da.Update(dt); // da.Fill(ds); //dgPR.DataSource = ds.Tables[0]; MyConnection.Close(); } //////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // READ TEXT FILE string PRtext = ""; string PRtextEdited = ""; //*************************************************************** private void ReadPDF(string getName) { string strText = null; PdfReader reader = new PdfReader(getName); for (int page = 1; page <= reader.NumberOfPages; page++) { ITextExtractionStrategy its = new iTextSharp.text.pdf.parser.LocationTextExtractionStrategy(); string s = PdfTextExtractor.GetTextFromPage(reader, page, its); s = Encoding.UTF8.GetString(ASCIIEncoding.Convert(Encoding.Default, Encoding.UTF8, Encoding.Default.GetBytes(s))); strText = strText + s; // txtFilee.Text = strText; } PRtext = strText; reader.Close(); //StreamWriter sw = new StreamWriter("PDFtoTEXT.txt"); File.WriteAllText("PDFtoText.txt", PRtext); //sw.Close(); string lRead; lRead = strText; txtFilee.Text = strText; int IndPrvPage = 0; int len = 113; //string Page = ""; if (lRead.Contains("'")) { lRead = lRead.Replace("'", "`"); }; int IndPage = lRead.IndexOf("Page", IndPrvPage); while (lRead.Contains("Page") == true) { if (lRead.Length < (lRead.IndexOf("Page", 0) + len)) { break; } IndPage = lRead.IndexOf("Page", IndPrvPage); //Page = lRead.Substring(IndPage, len); //string temp; if (IndPage > 0) { lRead = lRead.Remove(IndPage, len); }; if (IndPage < 0) { break; }; IndPrvPage = IndPage; //MessageBox.Show(Page); } //MessageBox.Show(lRead); File.WriteAllText("PDFtoTEXT.txt", lRead); PRtextEdited = lRead; //MessageBox.Show(PRtextEdited); } //******************************************************* ///////////////////////////////////////////////////////////////////////////////////////////////////////////// // FINDING AND ORGANIZING private void btnOrganize_Click(object sender, EventArgs e) { FolderBrowserDialog fbd = new FolderBrowserDialog(); fbd.ShowDialog(); string NameFolder = fbd.SelectedPath; foreach (string getName in Directory.GetFiles(@NameFolder, "*.pdf")) { ReadPDF(getName); int IndInitial = 0; int index = 0; string tmp = ""; //***************** tmp = PRtextEdited; //*********************** ///find PR No. int PRNo = 0; int IndPRNo = 0; string PRNum; IndPRNo = tmp.IndexOf("Purchase Requisition") + 23; PRNum = tmp.Substring(IndPRNo, 9); // MessageBox.Show("Purchase Requisition No: " + PRNum, "OrganiZe"); int Finish = 0; // string Zeros="000"; string Zeros3 = "000"; string Zeros2 = "00"; string Zeros1 = "0"; int N = 10; string ItemNo = "00000"; string NxtItemNo = "00000"; int Cnt = 0; string z = "MATERIAL DESCRIPTION & ITEM TEXT"; int IndZ = 0; if ((tmp.IndexOf(z) < 0)) { z = "N & ITEM TEXT"; } IndZ = tmp.IndexOf(z, IndInitial) + 25; // set starting index as MATERIAL DESCRIPTION & ITEM TEXT //MessageBox.Show(tmp); do { string txtFindPO = "Material PO Text"; string txtFindITEM = "Item Text"; string txtLast = "Prepared By"; string matCode = ""; int indMat = 0; int indPO = 0, indItem = 0, indNext = 0; if (N < 100) { ItemNo = Zeros3 + N.ToString(); } if (N >= 100 && N < 1000) { ItemNo = Zeros2 + N.ToString(); } if (N >= 1000 && N < 10000) { ItemNo = Zeros1 + N.ToString(); } //find first item string Item = ItemNo + " " + "M"; while (tmp.IndexOf(Item, IndZ) == -1) { N = N + 10; if (N < 100) { ItemNo = Zeros3 + N.ToString(); } if (N >= 100 && N < 1000) { ItemNo = Zeros2 + N.ToString(); } if (N >= 1000 && N < 10000) { ItemNo = Zeros1 + N.ToString(); } Item = ItemNo + " " + "M"; } if (N < 90) { NxtItemNo = Zeros3 + (N + 10).ToString(); } if (N >= 90 && N < 990) { NxtItemNo = Zeros2 + (N + 10).ToString(); } if (N >= 990 && N < 9990) { NxtItemNo = Zeros1 + (N + 10).ToString(); } index = tmp.IndexOf(Item, IndZ); indMat = index; indPO = tmp.IndexOf(txtFindPO, index); if (indPO >= 0) { indPO = indPO + 43; }; indItem = tmp.IndexOf(txtFindITEM, index); if (indItem >= 0) { indItem = indItem + 9; }; //find next item string NxtItem = NxtItemNo + " " + "M"; while (tmp.IndexOf(NxtItem, IndZ) == -1) { N = N + 10; if (N < 90) { NxtItemNo = Zeros3 + (N + 10).ToString(); } if (N >= 90 && N < 990) { NxtItemNo = Zeros2 + (N + 10).ToString(); } if (N >= 990 && N < 9990) { NxtItemNo = Zeros1 + (N + 10).ToString(); } NxtItem = NxtItemNo + " " + "M"; indNext = tmp.IndexOf(NxtItem, index); if (N >= 990) { int IndLast = 0; IndLast = tmp.IndexOf("Prepared By", 0); IndLast = tmp.IndexOf(txtLast, index); indNext = IndLast; Finish++; break; }; } if (Finish < 1) { if (N < 90) { NxtItemNo = Zeros3 + (N + 10).ToString(); } if (N >= 90 && N < 990) { NxtItemNo = Zeros2 + (N + 10).ToString(); } if (N >= 990 && N < 9990) { NxtItemNo = Zeros1 + (N + 10).ToString(); } NxtItem = NxtItemNo + " " + "M"; indNext = tmp.IndexOf(NxtItem, index); } //********************** int lenITEM = 0; int lenPO = 0; string POtxt = ""; string ITEMtxt = ""; if (indPO > 0 && indItem > 0) { lenPO = (indItem - indPO) - 9; }; if (indPO > 0 && indItem < 0) { lenPO = indNext - indPO - 9; }; if (indItem > 0 && indNext > 0) { lenITEM = (indNext - indItem); } if (lenPO > 255) { lenPO = 255; } if (lenPO < 0) { lenPO = 0; } matCode = tmp.Substring(indMat + 6, 11); //material code if (indPO > 0) { POtxt = tmp.Substring(indPO, lenPO); }; //MessageBox.Show(POtxt); if (lenITEM > 255) { lenITEM = 255; } if (lenITEM < 0) { lenITEM = 0; } if (indItem > 0) { ITEMtxt = tmp.Substring(indItem, lenITEM); }; //MessageBox.Show(ITEMtxt); Cnt = Cnt + 1; PRNo = Convert.ToInt32(PRNum); Insert(Cnt, matCode, ITEMtxt, POtxt, PRNo); // INSERT INTO TABLE if (Finish == 1) break; N = N + 10; } while (N <= 990); //sr.Close(); TotalCnt++; // MessageBox.Show("All Organized", "OrganiZe"); // MessageBox.Show("Total Items Nos: " + Cnt.ToString(), "OrganiZe"); } MessageBox.Show("All completed. " + "\n" + "\n" + "No of PR processed: " + TotalCnt.ToString(), "OrganiZe"); } private void btnShow_Click(object sender, EventArgs e) { string connetionString = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=e:\PRTEXT.xls;Extended Properties=Excel 8.0"; string sql = "SELECT * FROM [PR$]"; OleDbConnection connection = new OleDbConnection(connetionString); connection.ConnectionString = connetionString; adap = new OleDbDataAdapter(sql, connection); DataSet ds = new DataSet(); connection.Open(); adap.Fill(ds); dgPR.DataSource = ds.Tables[0]; connection.Close(); } private void txtFilter_TextChanged(object sender, EventArgs e) { conn = new OleDbConnection(); conn.ConnectionString = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=e:\PRTEXT.xls;Extended Properties=Excel 8.0"; conn.Open(); OleDbCommand cmd = conn.CreateCommand(); cmd.CommandType = CommandType.Text; //cmd.CommandText = "SELECT * FROM [PR$] WHERE [MATERIAL CODE] LIKE ('" + txtFilter.Text + "%')"; /* if (cbFilter.SelectedItem.ToString() == "ITEM TEXT") { cmd.CommandText = "SELECT * FROM [PR$] WHERE [ITEM TEXT] LIKE ('%" + txtFilter.Text + "%')"; } if (cbFilter.SelectedItem.ToString() == "PO TEXT") { cmd.CommandText = "SELECT * FROM [PR$] WHERE [PO TEXT] LIKE ('%" + txtFilter.Text + "%')"; } if (cbFilter.SelectedItem.ToString() == "MATERIAL CODE") { cmd.CommandText = "SELECT * FROM [PR$] WHERE [MATERIAL CODE] LIKE ('%" + txtFilter.Text + "%')"; } if (cbFilter.SelectedItem.ToString() == "PRNo") { cmd.CommandText = "SELECT * FROM [PR$] WHERE [PRNo] LIKE ('%" + txtFilter.Text + "%')"; } */ cmd.CommandText = "SELECT * FROM [PR$] WHERE [ITEM TEXT] LIKE ('%" + txtFilter.Text + "%')"; cmd.ExecuteNonQuery(); //OleDbDataAdapter adap = new OleDbDataAdapter("SELECT * FROM [PR$] LIKE '"+txtFilter.Text+"%'", conn); DataTable dt = new DataTable(); adap = new OleDbDataAdapter(cmd); adap.Fill(dt); dgPR.DataSource = dt; //MessageBox.Show(dt.Rows[0][0].ToString()); } //OleDbDataAdapter adap = new OleDbDataAdapter(); // DataSet ds = new DataSet(@"PRTEXT.XLS"); // string sql; //DataTable dt = new DataTable(); // OleDbConnection conn = new OleDbConnection(); // private string contents; // OleDbCommandBuilder builder; // } private void btnUpdate_Click(object sender, EventArgs e) { conn = new OleDbConnection(); conn.ConnectionString = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=e:\PRTEXT.xls;Extended Properties=Excel 8.0"; conn.Open(); string xlsSheet = "PR$"; string name = ds.Tables[0].Rows[0][0].ToString(); DataTable dt = (DataTable)dgPR.DataSource; string changeColumns = ""; for (int i = 0; i < Table.ColumnName.Count; i++) { changeColumns += Table.ColumnName[i] + "=@" + Table.ColumnName[i]; if (Table.ColumnName.Count - 1 != i) changeColumns += ","; } adap.UpdateCommand = new OleDbCommand("UPDATE [" + xlsSheet + "] SET " + changeColumns + " WHERE " + Table.ColumnName[PrimaryColumnIndex] + " = @" + Table.ColumnName[PrimaryColumnIndex], conn); for (int i = 0; i < Table.ColumnName.Count; i++) { adap.UpdateCommand.Parameters.Add("@" + Table.ColumnName[i], OleDbType.Char, 255).SourceColumn = Table.ColumnName[i]; } foreach (int row in ListOfValues.Keys) { Table tbl = ListOfValues[row]; ds.Tables[0].Rows[row][Table.ColumnName[PrimaryColumnIndex]] = ds.Tables[0].Rows[row][PrimaryColumnIndex]; for (int i = 0; i < tbl.Value.Count; i++) { ds.Tables[0].Rows[row][Table.ColumnName[tbl.col[i]]] = tbl.Value[i]; } //adap.UpdateCommand.ExecuteNonQuery(); adap.Update(ds.Tables[0]); } conn.Close(); MessageBox.Show("Updated"); } bool isFormLoad = false; int PrimaryColumnIndex = 4; OleDbDataAdapter adap; DataSet ds; OleDbConnection conn; OleDbCommandBuilder builder; Dictionary<int, Table> ListOfValues = new Dictionary<int, Table>(); public class Table { public List<string> Value { get; set; } public List<int> col { get; set; } public static List<string> ColumnName; } private void OrganiZe_Load_1(object sender, EventArgs e) { conn = new OleDbConnection(); conn.ConnectionString = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=e:\PRTEXT.xls;Extended Properties=Excel 8.0"; conn.Open(); adap = new OleDbDataAdapter("SELECT * FROM [PR$]", conn); ds = new DataSet(); adap.Fill(ds, "PR"); Table.ColumnName = new List<string>(); foreach (DataColumn str in ds.Tables[0].Columns) { Table.ColumnName.Add(str.ColumnName); } dgPR.DataSource = ds.Tables[0]; conn.Close(); dgPR.Columns[PrimaryColumnIndex].ReadOnly = true; dgPR.RowValidated += new DataGridViewCellEventHandler(dgPR_RowValidated); isFormLoad = true; } private void dgPR_RowValidated(object sender, DataGridViewCellEventArgs e) { if (isFormLoad) { Table tbl = new Table(); DataGridView dgv = (DataGridView)sender; tbl.Value = new List<string>(); tbl.col = new List<int>(); for (int i = 1; i < dgv.ColumnCount; i++) { tbl.Value.Add(dgv.Rows[e.RowIndex].Cells[i].Value.ToString()); tbl.col.Add(i); } if (ListOfValues.Keys.Contains(e.RowIndex)) { ListOfValues[e.RowIndex] = tbl; } else ListOfValues.Add(e.RowIndex, tbl); } } } 

}

代码自动插入在Excel中运行良好。 但代码更新是不working.also我试图一步一步运行..它执行所有,但停在adap.update(ds.tables [0])说UPDATE语句中的语法错误。

 exception: System.Data.OleDb.OleDbException was unhandled HResult=-2147217900 Message=Syntax error in UPDATE statement. Source=Microsoft Office Access Database Engine ErrorCode=-2147217900 

假设您在工作表PR有以下数据


 FirstName LastName Age johny Depp 55 Statham John 45 Diana bantley 35 

那么你必须通过你的button点击更新的代码

  conn= new OleDbConnection(); conn.ConnectionString = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=e:\PRTEXT.xls;Extended Properties=Excel 8.0"; conn.Open(); string xlsSheet = "PR$"; adap.UpdateCommand = new OleDbCommand("UPDATE [" + xlsSheet + "] SET FirstName = ?, LastName = ?, Age = ?" + " WHERE FirstName = "+ ds.Tables[0].Rows[0][0], conn); adap.UpdateCommand.Parameters.Add("@FirstName", OleDbType.Char, 255).SourceColumn = "FirstName"; adap.UpdateCommand.Parameters.Add("@LastName", OleDbType.Char, 255).SourceColumn = "LastName"; adap.UpdateCommand.Parameters.Add("@Age", OleDbType.Char, 255).SourceColumn = "Age"; //// Updates the first row ds.Tables[0].Rows[0]["FirstName"] = "john"; ds.Tables[0].Rows[0]["LastName"] = "Statham"; ds.Tables[0].Rows[0]["Age"] = "55"; adap.Update(ds.Tables[0]); conn.Close(); MessageBox.Show("Updated"); 

在那里我们给整个查询的更新和在哪里条件我们通过第一个索引值(即(零指数)值),这个更新值成功通过改变我们的数据DataTable零索引行。

这是你的条件的完整工作,请从你的目的检查。

 private void btnUpdate_Click(object sender, EventArgs e) { conn.Open(); string xlsSheet = "PR$"; string name = ds.Tables[0].Rows[0][0].ToString(); DataTable dt = (DataTable)dgPR.DataSource; string changeColumns = ""; for (int i = 0; i < Table.ColumnName.Count; i++) { changeColumns += Table.ColumnName[i] + "=@" + Table.ColumnName[i]; if (Table.ColumnName.Count - 1 != i) changeColumns += ","; } adap.UpdateCommand = new OleDbCommand("UPDATE [" + xlsSheet + "] SET " + changeColumns + " WHERE " + Table.ColumnName[PrimaryColumnIndex] + " = @" + Table.ColumnName[PrimaryColumnIndex], conn); for (int i = 0; i < Table.ColumnName.Count; i++) { adap.UpdateCommand.Parameters.Add("@" + Table.ColumnName[i], OleDbType.Char, 255).SourceColumn = Table.ColumnName[i]; } foreach (int row in ListOfValues.Keys) { Table tbl = ListOfValues[row]; ds.Tables[0].Rows[row][Table.ColumnName[PrimaryColumnIndex]] = ds.Tables[0].Rows[row][PrimaryColumnIndex]; for (int i = 0; i < tbl.Value.Count; i++) { ds.Tables[0].Rows[row][Table.ColumnName[tbl.col[i]]] = tbl.Value[i]; } adap.Update(ds.Tables[0]); } conn.Close(); MessageBox.Show("Updated"); } bool isFormLoad = false; int PrimaryColumnIndex = 0; OleDbDataAdapter adap; DataSet ds; OleDbConnection conn; OleDbCommandBuilder builder; Dictionary<int, Table> ListOfValues = new Dictionary<int, Table>(); public class Table { public List<string> Value { get; set; } public List<int> col { get; set; } public static List<string> ColumnName; } private void Form1_Load(object sender, EventArgs e) { conn = new OleDbConnection(); conn.ConnectionString = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=e:\PRTEXT.xls;Extended Properties=Excel 8.0"; conn.Open(); adap = new OleDbDataAdapter("SELECT * FROM [PR$]", conn); ds = new DataSet(); adap.Fill(ds, "PR"); Table.ColumnName = new List<string>(); foreach (DataColumn str in ds.Tables[0].Columns) { Table.ColumnName.Add(str.ColumnName); } dgPR.DataSource = ds.Tables[0]; conn.Close(); dgPR.Columns[PrimaryColumnIndex].ReadOnly = true; dgPR.RowValidated += new DataGridViewCellEventHandler(dgPR_RowValidated); isFormLoad = true; } private void dgPR_RowValidated(object sender, DataGridViewCellEventArgs e) { if (isFormLoad) { Table tbl = new Table(); DataGridView dgv = (DataGridView)sender; tbl.Value = new List<string>(); tbl.col = new List<int>(); for (int i = 1; i < dgv.ColumnCount; i++) { tbl.Value.Add(dgv.Rows[e.RowIndex].Cells[i].Value.ToString()); tbl.col.Add(i); } if (ListOfValues.Keys.Contains(e.RowIndex)) { ListOfValues[e.RowIndex] = tbl; } else ListOfValues.Add(e.RowIndex, tbl); } } 

请更改Excel文件中您不想更改的PrimaryColumnIndex

更新:
用这个replacebtnUpdate_Click

  private void btnUpdate_Click(object sender, EventArgs e) { conn.Open(); string xlsSheet = "PR$"; DataTable dt = (DataTable)dgPR.DataSource; string changeColumns = ""; for (int i = 0; i < Table.ColumnName.Count; i++) { changeColumns += "[" + Table.ColumnName[i] + "]"+ "=@" + Table.ColumnName[i]; if (Table.ColumnName.Count - 1 != i) changeColumns += ","; } adap.UpdateCommand = new OleDbCommand("UPDATE [" + xlsSheet + "] SET " + changeColumns + " WHERE " + "["+ Table.ColumnName[PrimaryColumnIndex] + "]"+ " = @" + Table.ColumnName[PrimaryColumnIndex], conn); for (int i = 0; i < Table.ColumnName.Count; i++) { adap.UpdateCommand.Parameters.Add("@" + Table.ColumnName[i], OleDbType.Char, 255).SourceColumn = Table.ColumnName[i]; } foreach (int row in ListOfValues.Keys) { Table tbl = ListOfValues[row]; ds.Tables[0].Rows[row][Table.ColumnName[PrimaryColumnIndex]] = ds.Tables[0].Rows[row][PrimaryColumnIndex]; for (int i = 0; i < tbl.Value.Count; i++) { ds.Tables[0].Rows[row][Table.ColumnName[tbl.col[i]]] = tbl.Value[i]; } adap.Update(ds.Tables[0]); } conn.Close(); MessageBox.Show("Updated"); } 

更新2:
这是抛出错误,因为, 空间不支持查询之间的名称。
再次从下面的代码更新btnUpdate_Click

 private void btnUpdate_Click(object sender, EventArgs e) { conn.Open(); string xlsSheet = "PR$"; DataTable dt = (DataTable)dgPR.DataSource; string changeColumns = ""; for (int i = 0; i < Table.ColumnName.Count; i++) { changeColumns += "[" + Table.ColumnName[i] + "]"+ "=@" + Table.ColumnName[i].Replace(' ','_'); if (Table.ColumnName.Count - 1 != i) changeColumns += ","; } adap.UpdateCommand = new OleDbCommand("UPDATE [" + xlsSheet + "] SET " + changeColumns + " WHERE " + "["+ Table.ColumnName[PrimaryColumnIndex] + "]"+ " = @" + Table.ColumnName[PrimaryColumnIndex].Replace(' ','_'), conn); for (int i = 0; i < Table.ColumnName.Count; i++) { adap.UpdateCommand.Parameters.Add("@" + Table.ColumnName[i].Replace(' ','_'), OleDbType.Char, 255).SourceColumn = Table.ColumnName[i]; } foreach (int row in ListOfValues.Keys) { Table tbl = ListOfValues[row]; ds.Tables[0].Rows[row][Table.ColumnName[PrimaryColumnIndex]] = ds.Tables[0].Rows[row][PrimaryColumnIndex]; for (int i = 0; i < tbl.Value.Count; i++) { ds.Tables[0].Rows[row][Table.ColumnName[tbl.col[i]]] = tbl.Value[i]; } adap.Update(ds.Tables[0]); } conn.Close(); MessageBox.Show("Updated"); }