C#使用CsvHelper向现有CSV文件写入指定单元格的问题
问题原因
- 你声明的
StringBuilder没有实际作用:拼接后的内容既没有赋值给record.EmailSent属性,也没有传入写入方法,代码里直接写入的还是读取时的原始EmailSent值,自然不会更新为"sent"。且AppendFormat用法错误,第一个参数没有占位符的情况下,第二个参数不会生效。 - 目前只写入了
EmailSent单个字段,原始CSV的其他列(姓名、邮箱等)会全部丢失,不符合使用需求。 - 写入逻辑在邮件发送之前执行,哪怕邮件发送失败也会标记为已发送,逻辑不合理。
- 没有对
CsvWriter和StreamWriter做资源释放、缓冲区刷新操作,部分写入内容可能滞留在内存中没有落盘。
修正后代码
// 用using自动释放资源、刷新缓冲区 using var scan = new StreamReader(myBlob); using var csvv = new CsvReader(scan, CultureInfo.InvariantCulture); var records = csvv.GetRecords<Records>().ToList(); using var scanwriter = new StreamWriter(myBlob4); using var csvwriter = new CsvWriter(scanwriter, CultureInfo.InvariantCulture); // 先写CSV表头 csvwriter.WriteHeader<Records>(); csvwriter.NextRecord(); foreach (Records record in records) { var from = new EmailAddress("example.com", "John"); var to = new EmailAddress(record.Email, record.Name); var subject = "example"; var msg = MailHelper.CreateSingleEmail(from, to, subject, txtf, htmlf); // 先发送邮件,成功后再更新标记 var response = await client.SendEmailAsync(msg); // 可根据实际返回的response判断是否发送成功再赋值 record.EmailSent = "sent"; // 直接写入整条记录,保留所有原有列 csvwriter.WriteRecord(record); csvwriter.NextRecord(); }
补充说明
如果不需要保留原始CSV的其他列,只需要输出邮箱和发送状态两列,可以自定义写入逻辑,不需要写入整行记录。如果写入的文件需要兼容Excel打开,可以配置CsvHelper的编码为UTF-8带BOM。
内容的提问来源于stack exchange,提问作者Juan Pablo Guerra
相关产品推荐
相关产品推荐

