使用CsvHelper导入导出csv文件
今天记录一下使用CsvHelper导入导出CSV文件的方法。
1. CSV介绍
csv文件是一种纯文本存储的文件格式,行和列分别用逗号和换行来代替,可以直接使用Excel打开。在代码中可以直接使用TextWrite
操作,比较方便快速。
2. CsvHelper
2.1. 项目介绍:
github主页:https://github.com/JoshClose/CsvHelper
文档:http://joshclose.github.io/CsvHelper/
wiki:https://github.com/JoshClose/CsvHelper/wiki
2.2. Examples
模拟场景是需要从数据库中导出导入用户信息,有如下一个类:
1
2
3
4
5
|
class People{
public string Name{get;set;}
public int Age{get;set}
public string Gender{get;set;}
}
|
2.2.1. Write
写入的时候需要注意列标题的名字问题,因为CsvHelper会默认将属性名作为列标题,想显示中文就得做映射(参考文档)
Map类:
1
2
3
4
5
6
7
8
9
10
11
12
|
/// <summary>
/// 配置导出类映射
/// </summary>
sealed class PeopleMap:CsvClassMap<People>
{
public PeopleMap()
{
Map(m => m.Name).Name("姓名");
Map(m => m.Age).Name("年龄");
Map(m => m.Gender).Name("性别");
}
}
|
上面的映射类可以根据需要调整,可以配置属性输出的列索引等,可以参考项目wiki
写入操作代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
// 代替数据库读取操作
var peoples= new List<People>();
for (int i = 0; i < 100000; i++)
{
peoples.Add(new People()
{
Name = "iCtr",
Age = 100,
Gender = "未知"
});
}
//测试写入操作的时间
Stopwatch watch = new Stopwatch();
watch.Start();
using (TextWriter write = new StreamWriter(@"C:\Users\ictr-jd.hai\Desktop\Test.csv", false, Encoding.UTF8))
{
using (var csv = new CsvWriter(write))
{
csv.Configuration.Encoding = Encoding.UTF8;
csv.Configuration.RegisterClassMap<PeopleMap>(); //映射
csv.WriteHeader<People>(); //写入列标题
//循环写入行
foreach (var item in peoples)
{
csv.WriteRecord(item);
}
}
}
watch.Stop();
Console.WriteLine(watch.ElapsedMilliseconds.ToString());
Console.ReadKey();
|
2.2.2. Read
读取操作代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
var objs = new List<People>();
//测试读取的速度
Stopwatch watch = new Stopwatch();
watch.Start();
using (TextReader reader=new StreamReader(@"C:\Users\ictr-jd.hai\Desktop\Test.csv",Encoding.UTF8))
{
using (var csv=new CsvReader(reader))
{
csv.Configuration.Encoding = Encoding.UTF8;
//csv.Configuration.RegisterClassMap<PeopleMap>(); //如果有标题头,那么也需要映射,而且字段名字必须匹配
//csv.Configuration.HasHeaderRecord = false; //如果没有标题头,那么就配置为false
//一次行读取全部的行,也可以使用循环一行行读取(多种读取方式请参考文档)
objs = csv.GetRecords<People>().ToList();
}
}
Console.WriteLine(objs.Count);
watch.Stop();
Console.WriteLine(watch.ElapsedMilliseconds.ToString());
Console.ReadKey();
|
3. 结束
操作csv文件比较简单,就是读取一个文本文件的操作,借助CsvHelper的帮助,可以省去我们自己排版、映射类等操作,操作速度很快,其配置也多种多样,文档比较详细,推荐大家使用,在此感谢组件作者的工作。