使用 CsvHelper 以动态方式从 excel 编写 csv 文件 c#

Write csv file using CsvHelper, from excel in a dynamic way c#

我正在尝试从 excel 文件生成 CSV 文件。我有不同的 Excel 文件,我想阅读它们并生成一个 CSV 文件。我想这一定很容易,但我遇到了一些麻烦。

这是我应该使用的库

https://www.nuget.org/packages/CsvHelper/.

我将不胜感激任何教程或任何关于我如何处理这个问题的方法。 我的想法是读取我的 Excel 文件的第一行,例如 headers,然后将其他行作为值,这样我就可以编写 CSV。

创建一个 class 文件,其中包含与 excel 列相同的属性。 解析您的 excel 文件并将其加载到您的 class 的实例中。写一个简单的程序如下

void Main()
{
    var records = new List<Foo>
    {
        new Foo { Id = 1, Name = "one" },
    };

    using (var writer = new StreamWriter("path\to\file.csv"))
    using (var csv = new CsvWriter(writer))
    {
        csv.WriteRecords(records);
    }
}

public class Foo
{
    public int Id { get; set; }
    public string Name { get; set; }
}

其中 Foo 是 class 文件。 希望这有帮助

public class Program
{
    public static void Main()
    {
        string filePath = "C:\Users\{User}\Desktop\sample.xlsx";
        System.Text.Encoding.RegisterProvider(System.Text.CodePagesEncodingProvider.Instance);
        List<List<object>> rows = new List<List<object>>();
        List<object> row = new List<object>();
        // Excel Reader
        using (var stream = File.Open(filePath, FileMode.Open, FileAccess.Read))
        {
            using (var reader = ExcelReaderFactory.CreateReader(stream, new ExcelReaderConfiguration
            {
                FallbackEncoding = Encoding.GetEncoding(1252),

            }))
            {
                do
                {
                    while (reader.Read())
                    {
                        row.Clear();
                        for (int i = 0; i < reader.FieldCount; i++)
                        {
                            var field = reader.GetValue(i);
                            if (field is int valueInt)
                            {
                                row.Add(valueInt);
                            }
                            else if (field is bool valueBool)
                            {
                                row.Add(valueBool);
                            }
                            else if (field is DateTime valueDate)
                            {
                                //row.Add(valueDate); You can write any condition there
                                row.Add(valueDate.Year);
                            }
                            else if (field is TimeSpan valueTime)
                            {
                                row.Add(valueTime);
                            }
                            else if (field is string valueString)
                            {
                                row.Add(valueString);
                            }
                            else if (field is null)
                            {
                                row.Add(field);
                            }
                        }
                        if (row.Any())
                        {
                            rows.Add(row);
                        }
                    }
                } while (reader.NextResult());

            }
        }
        // CSV Writer
        using (var writer = new StreamWriter("C:\Users\{User}\Desktop\sample.csv"))
        using (var csv = new CsvWriter(writer))
        {
            foreach (var i in rows)
            {
                foreach (var field in i)
                {
                    csv.WriteField(field);
                }
                csv.NextRecord();
            }
        }
    }

}

此程序将 Excel (sample.xlsx) 文件转换为 CSV(sample.csv) 文件。

依赖关系: