如何从C#中更新Excel表格行
我很沮丧,因为我无法解决这个问题…
那么,我一直在C#中的桌面应用程序,我几乎完成的应用程序,但我有一个大问题。
我的应用程序导入一个Excel工作簿,它有一些GridView中显示的信息。 它工作正常,但我的应用程序更新或修改GridView中显示的数据,只有一列称为平衡。
我想在我的Excel工作簿中更新这个列,就像在SQL中的更新条件,例如我有这个信息被导入到我的应用程序。
如果我在我的应用程序中修改了一些行,例如具有“12345”顺序的行,我想在我的Excel工作簿中更新该行的“平衡”列。
我一直在尝试这个代码:
string order = textBox1.Text; string balance = textBox2.Text; filePath = openFileDialog1.FileName; extension = Path.GetExtension(filePath); header = "Yes"; OleDbConnection MyConnection = new OleDbConnection(conStr); ; OleDbCommand myCommand = new OleDbCommand(); string sql = null; MyConnection.Open(); myCommand.Connection = MyConnection; sql = "UPDATE [" + sheetName + "] SET [" + sheetName + "].[Order]=123 WHERE [" + sheetName + "].[Balance]=12313"; myCommand.CommandText = sql; myCommand.ExecuteNonQuery(); MyConnection.Close();
而如果我debugging代码,这是执行的句子,我认为这是好的,但它不起作用。
UPDATE ['12234$'] SET ['12234$'].[Order]=123 WHERE ['12234$'].[Balance]=12313
它给了我这个错误:
Message=No value given for one or more required parameters. Source=Microsoft Access Database Engine
这只是一个想法 – 但是你的SQL类似的string设置正确吗?
如果您尝试更新某个订单的余额,则需要将其置于SET命令中。
所以,沿着…的方向
UPDATE ['12234$'] SET ['12234$'].[Balance]=12313 WHERE ['12234$'].[Order]=12345
考虑使用NuGet包来处理Excels。 EPPlus是一个很好的。
using (var package = new ExcelPackage(@"someFile.xlsx") { var sheet = package.Workbook.Worksheets.First(); sheet.Cells["E2"].Value = 12345.32M; package.Save(); }
Sql不再可能,但你可以使用Linq:
using (var package = new ExcelPackage(@"someFile.xlsx") { var sheet = package.Workbook.Worksheets.First(); int rowIndex = sheet.Cells["C2:C5"].First(x => int.Parse(x.Value.ToString()) == 12345).Start.Row; const int balanceColumnIndex = 5; sheet.Cells[rowIndex, balanceColumnIndex].Value = 12313M; package.Save(); }
我在博客上写了一个关于EPPlus的系列文章 。