如何用CSV Helper将CSV的Quantity列设为数字格式而非常规格式
问题
我使用CSV Helper编写如下C#代码生成CSV文件:
for (int i = 0; i < dsData.Rows.Count; i++) { DateTime invDate = Convert.ToDateTime(dsData.Rows[i]["DocDate"].ToString()); string invoiceDate = invDate.ToString("yyyyMMdd"); invoices.Add(new Invoices { Recordtype = "DIALSALES01ZA", DistributorCode = 161457, InvoiceNumber = dsData.Rows[i]["DocNum"].ToString(), InvDate = invoiceDate, SCJProductCode = dsData.Rows[i]["CardCode"].ToString(), DistributorProductCode = dsData.Rows[i]["CardCode"].ToString(), SalesmanCode = dsData.Rows[i]["SlpCode"].ToString(), SalesmanName = dsData.Rows[i]["SlpName"].ToString(), SupervisorCode = "Kinyanjui", SupervisorName = "Kamau", WarehouseCode = dsData.Rows[i]["WhsCode"].ToString(), WarehouseName = dsData.Rows[i]["WhsName"].ToString(), OutletTypeCode = "Mini mart", OutletTypeName = "Mini mart", ClientInternalCode = dsData.Rows[i]["CardCode"].ToString(), ClientFederalID = dsData.Rows[i]["CardCode"].ToString(), ClientName = dsData.Rows[i]["CardName"].ToString(), City = dsData.Rows[i]["City"].ToString(), ZipCode = 0, DeliveryAddress = dsData.Rows[i]["Address"].ToString(), Quantity = Convert.ToDouble(dsData.Rows[i]["U_PCs"].ToString()), GrossValue = Convert.ToDouble(dsData.Rows[i]["GTotal"].ToString()), NetValue = Convert.ToDouble(dsData.Rows[i]["LineTotal"].ToString()), Fraction = 1, EANCode = "1", }); } DateTime dateTimeNow = DateTime.Now; Random rnd = new Random(); double num = rnd.Next(1, 10000000); string filename = dateTimeNow.ToString("yyyyMMdd") + num.ToString() + ".csv"; var csvPath = "C:/Integrations/RAISONS/SCJohnsonIntegration/Invoices_CSVs/" + filename + ""; using (var streamWriter = new StreamWriter(csvPath)) { using (var csvWriter = new CsvWriter(streamWriter, CultureInfo.InvariantCulture)) { csvWriter.WriteRecords(invoices); } }
生成的CSV文件中Quantity列格式为「常规」,我希望将该列设置为「数字」格式,请问该如何实现?
解决方案
CSV本质是纯文本文件,没有内置格式定义,但可以通过CSV Helper的配置让输出内容被Excel识别为数字格式,以下两种方法可以实现:
方法一:使用ClassMap配置列格式
创建Invoices类的映射配置,显式指定Quantity列的数字格式:
public class InvoicesMap : ClassMap<Invoices> { public InvoicesMap() { // 映射其他字段(按需添加) Map(m => m.Recordtype); Map(m => m.DistributorCode); // 配置Quantity列:设置数字格式,确保输出无引号 Map(m => m.Quantity) .TypeConverterOption.NumberStyles(NumberStyles.Float) .TypeConverterOption.Format("0.00"); // 可根据需求调整小数位数,比如"0"表示整数 } }
然后在写入CSV时注册该映射:
using (var streamWriter = new StreamWriter(csvPath)) { using (var csvWriter = new CsvWriter(streamWriter, CultureInfo.InvariantCulture)) { csvWriter.Context.RegisterClassMap<InvoicesMap>(); csvWriter.WriteRecords(invoices); } }
方法二:全局配置数字类型输出格式
如果不需要单独映射每个字段,可以直接全局配置double类型的输出格式:
using (var streamWriter = new StreamWriter(csvPath)) { using (var csvWriter = new CsvWriter(streamWriter, CultureInfo.InvariantCulture)) { // 配置double类型的输出格式,确保Excel识别为数字 csvWriter.Context.TypeConverterOptionsCache.GetOptions<double>() .Format = "0.00"; csvWriter.WriteRecords(invoices); } }
核心说明
- 确保
Quantity字段类型为double(你的代码已满足),CSV Helper会自动将其识别为数字类型,输出时不会添加引号,Excel打开时会默认识别为数字格式。 - 通过指定
Format参数(如"0"、"0.00"),可以进一步明确数字的显示格式,避免Excel将其识别为常规文本。
内容的提问来源于stack exchange,提问作者Kinyanjui Kamau
相关产品推荐
相关产品推荐

