C#中如何用GemBox.Spreadsheet将NumericUpDown值写入CSV指定单元格?
问题:修改CSV中已存在的指定单元格内容(使用GemBox.Spreadsheet)
当前代码可获取NumericUpDown的值并写入CSV,但仅能追加至表格底部。需求是使用该值修改CSV文件中已存在的指定单元格内容,通过GemBox.Spreadsheet库将CSV加载为Excel工作簿编辑后保存为CSV格式。
原代码
if (int.TryParse(kit_csv_quantity.Text, out int kitOut)) { decimal kitOutValue = kitOut + kits_upDown.Value; kit_csv_quantity.Text = kitOutValue.ToString(); ItemLine IL = new ItemLine(); kitOutValue = IL.Quantity; allItems.Add(IL); SpreadsheetInfo.SetLicense("FREE-LIMITED-KEY"); var workbook = ExcelFile.Load(@"C:\Users\carson.sumner\Desktop\PSP Kanban Program\Backend Files\Kits_be.csv", new CsvLoadOptions(CsvType.CommaDelimited)); var worksheet = workbook.Worksheets[0]; var row = worksheet.Rows[worksheet.Rows.Count]; var column = worksheet.Columns[worksheet.Columns.Count]; var searchText = kit_csv_quantity.Text; var range = worksheet.Cells.GetSubrange("C2:C25"); row.Cells[2].Value = searchText; workbook.Save("Output.csv", new CsvSaveOptions(CsvType.CommaDelimited)); }
修改后的代码方案
方式1:直接指定目标单元格位置
如果明确知道要修改的单元格行号和列号(注意:GemBox中行列索引从0开始),可以直接定位修改:
if (int.TryParse(kit_csv_quantity.Text, out int kitOut)) { decimal kitOutValue = kitOut + kits_upDown.Value; kit_csv_quantity.Text = kitOutValue.ToString(); ItemLine IL = new ItemLine(); kitOutValue = IL.Quantity; allItems.Add(IL); SpreadsheetInfo.SetLicense("FREE-LIMITED-KEY"); var workbook = ExcelFile.Load(@"C:\Users\carson.sumner\Desktop\PSP Kanban Program\Backend Files\Kits_be.csv", new CsvLoadOptions(CsvType.CommaDelimited)); var worksheet = workbook.Worksheets[0]; // 示例:修改第3行(索引2)第3列(索引2,对应C列)的单元格 int targetRowIndex = 2; int targetColumnIndex = 2; worksheet.Rows[targetRowIndex].Cells[targetColumnIndex].Value = kitOutValue.ToString(); workbook.Save(@"C:\Users\carson.sumner\Desktop\PSP Kanban Program\Backend Files\Kits_be.csv", new CsvSaveOptions(CsvType.CommaDelimited)); }
方式2:根据条件查找目标单元格
如果需要根据某列的特定值找到对应的行,再修改目标列内容(比如根据A列的物料编号找到行,修改C列的数量):
if (int.TryParse(kit_csv_quantity.Text, out int kitOut)) { decimal kitOutValue = kitOut + kits_upDown.Value; kit_csv_quantity.Text = kitOutValue.ToString(); ItemLine IL = new ItemLine(); kitOutValue = IL.Quantity; allItems.Add(IL); SpreadsheetInfo.SetLicense("FREE-LIMITED-KEY"); var workbook = ExcelFile.Load(@"C:\Users\carson.sumner\Desktop\PSP Kanban Program\Backend Files\Kits_be.csv", new CsvLoadOptions(CsvType.CommaDelimited)); var worksheet = workbook.Worksheets[0]; // 假设要查找A列(索引0)中值为"Kit001"的行,修改对应C列(索引2)的内容 string targetIdentifier = "Kit001"; foreach (var row in worksheet.Rows) { // 跳过表头行(如果有) if (row.Index == 0) continue; if (row.Cells[0].Value.ToString() == targetIdentifier) { row.Cells[2].Value = kitOutValue.ToString(); break; // 找到目标行后退出循环 } } workbook.Save(@"C:\Users\carson.sumner\Desktop\PSP Kanban Program\Backend Files\Kits_be.csv", new CsvSaveOptions(CsvType.CommaDelimited)); }
关键修改点说明
- 移除了原代码中获取最后一行的追加逻辑,改为定位已存在的单元格
- 保存时可选择覆盖原CSV文件或保存为新文件
- 行列索引从0开始,需注意表头行的处理(如果CSV包含表头)
内容的提问来源于stack exchange,提问作者Csumner
相关产品推荐
相关产品推荐

