C#使用StreamWriter写入CSV时空单元格添加异常问题排查
问题根因
你搞错了String.Join拼接CSV的逻辑:
- 当你用逗号作为
String.Join的分隔符时,传入方法的每一个参数就对应一个CSV单元格的内容,列和列之间的逗号会由String.Join自动插入,完全不需要你手动传","作为元素来补空列。 - 你传入的","会被识别为「内容是逗号的单元格」,同时
String.Join还会在这个元素的前后自动插入列分隔逗号,最终会生成数量完全不可控的多余空列,这就是你输出的列间隔杂乱的核心原因。
举个最小复现例:
// 你以为这段代码会生成 a,,b(中间隔1个空列,共3列) String.Join(",", "a", ",", "b"); // 实际输出是 a,,,b,对应4列:a、空、内容为逗号的单元格、b,和预期完全不符
修改方法
空单元格直接传入**空字符串""**作为String.Join的元素即可,不要传任何逗号字符串。按照「距左边缘空1列、数据块之间间隔2个空列」的要求,逐行对齐每个单元格的位置传入对应内容就行,修正后的代码如下:
System.Text.Encoding.RegisterProvider(System.Text.CodePagesEncodingProvider.Instance); using (StreamWriter writer = new StreamWriter(outputPath, false, new UTF8Encoding(true))) { writer.WriteLine(""); writer.WriteLine(""); // 第一行半年度表头:左空1列,每个半年度表头后填空字符串,和下方块的第一个单元格列位置对齐即可 writer.WriteLine(string.Join(",", "", // 最左侧空1列 "H2 2020", "", "", "", "", "", // 填空对齐到下一个半年度表头的位置 "H1 2021", "", "", "", "", "", "H2 2021" )); // 第二行指标表头 writer.WriteLine(string.Join(",", "", // 最左侧空1列 "Searches", "Impressions", "Net Cost", "", "", // 块间2个空列 "Searches", "Impressions", "Net Cost", "", "", // 块间2个空列 "Searches", "Impressions", "Net Cost" )); // 数据行 foreach (OutputRow outputRow in outputRows) { writer.WriteLine(string.Join(",", "", // 最左侧空1列 outputRow.Brand, outputRow.SearchesA, outputRow.ImpressionsA, outputRow.NetCostA, "", "", // 块间2个空列 outputRow.Brand, outputRow.SearchesB, outputRow.ImpressionsB, outputRow.NetCostB, "", "", // 块间2个空列 outputRow.Brand, outputRow.SearchesC, outputRow.ImpressionsC, outputRow.NetCostC )); } }
如果后续调整列结构,只需要对应增减空字符串""的数量即可,每一个""就代表一个空单元格。如果CSV格式更复杂,建议直接用专门的CSV处理库(比如CsvHelper),不需要手动处理单元格拼接,能避免很多格式错误。
内容的提问来源于stack exchange,提问作者Ford Burgess
相关产品推荐
相关产品推荐

