Loading

CSV文件导出工具

前言

在一般公司后台系统中一般都会有导出excel或者csv的需求,或者做sass后台,也会有用户数据导出的需求。如果只是重心在于数据本身,我们一般都会推荐导出文件时csv文件,体积更小。

  • 支持续写文件
  • 支持自定义保留标头
    csv 对于数字,数字大于15位的,用wps打开会直接截断,15位的后面变成0,文件本身没有问题,现兼容数字文本的正常显示

使用

安装

Install-Package Qin.CsvRelevant -Version 1.1.1.2

public void ConfigureServices(IServiceCollection services)
{
  services.AddCsvGenerate();
}

private ICsvGenerate _csvGenerate;
public TestA(ICsvGenerate iCsvGenerate)
{
    _csvGenerate = iCsvGenerate;
}

1.自定义csv文件表格列

  List<dynamic> listData = new List<dynamic>();
  listData.Add(new { name = "Sully1", Poe = 12333 });
  listData.Add(new { name = "Ben1", Poe = 12333 });
  listData.Add(new { name = "Fiy1", Poe = 12333 });
  Dictionary<string, string> column = new Dictionary<string, string>();
  column.Add("MyName", "name");
  column.Add("MyOrderId", "Poe");
  var charBytes = await _csvGenerate.WriteAsync(listData, column, "xxx\\demo1.csv");

2.通过扩展方法,流畅的设置表格列和字段映射关系

 List<ExportEntity> listData2 = GetList();
 var culumn2 = _csvGenerate.Map<ExportEntity>("MyOrderId", a => a.Orderid)
                                      .Map<ExportEntity>("MyName", a => a.Name)
                                      .Map<ExportEntity>("MyName2", a => a.Name2)
                                      .Map<ExportEntity>("MyName3", a => a.Name3)
                                      .Map<ExportEntity>("State", a => a.State)
                                      .Map<ExportEntity>("Money", a => a.Money)
                                      .Map<ExportEntity>("Isdel", a => a.Isdel)
                                      .Map<ExportEntity>("Area", a => a.Area).BuildDictionary();

 _csvGenerate.ForMat = (column, fieldname, fieldvalue) =>
 {
     if (fieldvalue is null)
         return fieldvalue;

     if (column == "Date" && fieldname == "CreateTime")
     {
         fieldvalue = fieldvalue is DateTime s1 ? s1.ToString("yyyy-MM-dd") : fieldvalue;
     }
     return fieldvalue;
 };

 var charBytes2 = await _csvGenerate.WriteAsync(listData2, culumn2, "xxx\\demo2.csv");

ForMat 属性可以指定,当数据源的某些字段和字段值需要进行转换时,可以使用 ForMat

3.实体标签映射表格列

public class ExportEntity
{
  [Qin.CsvRelevant.ExportColumn("Myorderid")]
  public int Orderid { get; set; }

  [Qin.CsvRelevant.ExportColumn("myname")]
  public string Name { get; set; }

  [Qin.CsvRelevant.ExportColumn("Date")]
  public DateTime CreateTime { get; set; }
}
// Split line
List<ExportEntity> listData = new List<ExportEntity>();
listData.Add(new ExportEntity { Name = "Sully", Orderid = 12333 });
listData.Add(new ExportEntity { Name = "Ben", Orderid = 12333 });
listData.Add(new ExportEntity { Name = "Fiy", Orderid = 12333 });

var charBytes0 = await _csvGenerate.WriteByAttributeAsync(listData, "xxx\\demo3.csv");

写入 CSV 文件时,当"文件名"字段为 null 或默认值时,将返回字节 [],但不会生成该文件
仓库地址:https://github.com/Qintai/Qin.CsvRelevant

更新

  • 1.1.1.4
    新增方法:WritePhysicalFile。结合Dapper一起使用,数据超过十几万应该将文件生成在硬盘,避免内存挤爆。
        [HttpGet]
        public async Task<IActionResult> Export6()
        {
            var name = nameof(Export6);
            Console.WriteLine(name);

            List<ExportEntity> listData = new List<ExportEntity>();
            listData.Add(new ExportEntity { Name = "bob", Orderid = 12333, State = 1 });

            string localexportpath = "Export";
            var path = Path.Combine(localexportpath);

            if (!Directory.Exists(path))
                Directory.CreateDirectory(path);
            var connstr = await System.IO.File.ReadAllTextAsync("D://connstr.txt");
            var sqlstr = await System.IO.File.ReadAllTextAsync("D://sqlstr.txt");
            using var connStr = new MySqlConnector.MySqlConnection(connstr);
            connStr.Open();
            var reader = connStr.ExecuteReader(sqlstr);
            var func = reader.GetRowParser<ExportEntity>();
            await _csvGenerate.WritePhysicalFile($"{localexportpath}\\{name}.csv", reader, (reader) =>
            {
                var model = func(reader);
                return model;
            });
            return Ok($"{path} build success");
        } 
posted @ 2022-03-10 21:01  大意了啊  阅读(286)  评论(0编辑  收藏  举报