跳到主要内容

BestPractice-最佳实践

一些方便好用的 "最佳实践"

读取/导入

Excel 表格数据

Field0Field1Field2Field3
23323Male233.33
112212Female123.23
............
危险

表格必须要有一个一行的表头,不然无法正常导入

简单使用

备注

最简单的使用方式, 实体定义之后只需一行代码即可完成

根据属性(Property)读取

信息

代码中定义的数据实体

public class ExcelTestDto
{
public string Field0 { get; set; }
public int Field1 { get; set; }
public string Field2 { get; set; }
public double Field3 { get; set; }
}
IEnumerable<ExcelTestDto> entitysFromPath = await ReadConfig<ExcelTestDto>.ExcelToEntityAsync("******.xlsx");
IEnumerable<ExcelTestDto> entitysFromStream = await ReadConfig<ExcelTestDto>.ExcelToEntityAsync(stream);
// OR
IEnumerable<ExcelTestDto> entitysFromPath = await ExcelReadTool.ExcelToEntityAsync<ExcelTestDto>("******.xlsx");
IEnumerable<ExcelTestDto> entitysFromStream = await ExcelReadTool.ExcelToEntityAsync<ExcelTestDto>(stream);
提示

不需要额外配置, 直接传入 Excel 文件 的路径或流即可

根据注解(Attribute)读取

信息

代码中定义的数据实体

public class ExcelTestDto
{
[ExcelRead("Field0")]
public string Name { get; set; }
[ExcelRead("Field1")]
public int Age { get; set; }
[ExcelRead("Field2")]
public string Gender { get; set; }
[ExcelRead("Field3")]
public double Height { get; set; }
}
IEnumerable<ExcelTestDto> entitysFromPath = await ReadConfig<ExcelTestDto>.ExcelToEntityAsync("******.xlsx");
IEnumerable<ExcelTestDto> entitysFromStream = await ReadConfig<ExcelTestDto>.ExcelToEntityAsync(stream);
// OR
IEnumerable<ExcelTestDto> entitysFromPath = await ExcelReadTool.ExcelToEntityAsync<ExcelTestDto>("******.xlsx");
IEnumerable<ExcelTestDto> entitysFromStream = await ExcelReadTool.ExcelToEntityAsync<ExcelTestDto>(stream);
提示

不需要额外配置, 直接传入 Excel 文件 的文件或流即可

与上方使用属性读取的代码相同, 自动优先使用注解读取, 若无注解, 则使用属性

自定义读取配置

"简单使用有极限的!"

"我从短暂的撸代码生涯中学到一件事......"

"越是想要搞骚操作, 就会发现简单使用适用范围不够......"

"所以要自定义读取配置"

var config = new ReadConfig<ExcelTestDto>()
.Add("Field0", item => item.Field0, item => { return item; })
.Add("Field1", item => item.Field1)
.Add("Field2", item => item.Field2, item => item == "Male" ? "男" : "女")
.Add("Field3", item => item.Field3)
;
提示

添加配置时基本上是按照 表头--属性--委托 这样传参

委托全是以 string 作为参数,返回值类型需要与属性一致

IEnumerable<ExcelTestDto> entitys = await config.ToEntityAsync("******.xlsx");
IEnumerable<ExcelTestDto> entitys = await config.ToEntityAsync(stream);

自定义-AddInit

有的时候可能需要在所有数据读完之后做个初始化或者其他什么计算操作

这时就可以使用 AddInit

var config = new ReadConfig<ExcelTestDto>()
.Add("Field0", item => item.Field0, item => { return item; })
.Add("Field1", item => item.Field1)
.Add("Field2", item => item.Field2, item => item == "Male" ? "男" : "女")
.Add("Field3", item => item.Field3)
.AddInit(item =>
{
item.Field2 += $" {item.Field1} 岁";
return item;
})
;

全使用字符串进行配置

可以使用属性名称字符串代替属性,有时可以简化部分代码

var config = new ReadConfig<ExcelTestDto>()
.Add("Field0", "Field0")
.Add("Field1", "Field1")
.Add("Field2", "Field2")
.Add("Field3", "Field3")
;
提示

如果有把配置存入数据库的需要,这边的方式就非常有用了

可以遍历配置,然后添加

// 如果从数据库里读到了配置集合
foreach (var (field, prop) in collection)
config.Add(field, prop);

导出

简单使用

备注

最简单的使用方式, 实体定义之后只需一行代码即可完成

根据属性(Property)导出

信息

代码中定义的数据实体

public class ExcelTestDto
{
public string Field0 { get; set; }
public int Field1 { get; set; }
public string Field2 { get; set; }
public double Field3 { get; set; }
}
备注

使用方式基本上和上方的导入相同

IEnumerable<ExcelTestDto> exportData = new[] {
new ExcelTestDto{Field0="Name-1",Field1=1,Field2="Male",Field3= 1},
new ExcelTestDto{Field0="Name-2",Field1=2,Field2="Male",Field3= 2},
new ExcelTestDto{Field0="Name-3",Field1=3,Field2="Male",Field3= 3},
new ExcelTestDto{Field0="Name-4",Field1=4,Field2="Male",Field3= 4},
new ExcelTestDto{Field0="Name-5",Field1=5,Field2="Male",Field3= 5},
new ExcelTestDto{Field0="Name-6",Field1=6,Field2="Male",Field3= 6},
new ExcelTestDto{Field0="Name-7",Field1=7,Field2="Male",Field3= 7},
new ExcelTestDto{Field0="Name-8",Field1=8,Field2="Male",Field3= 8},
new ExcelTestDto{Field0="Name-9",Field1=9,Field2="Male",Field3= 9},
new ExcelTestDto{Field0="Name-10",Field1=10,Field2="Male",Field3= 10}
};
await ExportConfig<ExcelTestDto>.DataExportAsync(filePath, exportData);

根据注解(Attribute)读取

信息

代码中定义的数据实体

public class ExcelTestDto
{
[ExcelRead("Field0")]
public string Name { get; set; }
[ExcelRead("Field1")]
public int Age { get; set; }
[ExcelRead("Field2")]
public string Gender { get; set; }
[ExcelRead("Field3")]
public double Height { get; set; }
}
备注

使用方式基本上和上方的导入相同

IEnumerable<ExcelTestDto> exportData = new[] {
new ExcelTestDto{Field0="Name-1",Field1=1,Field2="Male",Field3= 1},
new ExcelTestDto{Field0="Name-2",Field1=2,Field2="Male",Field3= 2},
new ExcelTestDto{Field0="Name-3",Field1=3,Field2="Male",Field3= 3},
new ExcelTestDto{Field0="Name-4",Field1=4,Field2="Male",Field3= 4},
new ExcelTestDto{Field0="Name-5",Field1=5,Field2="Male",Field3= 5},
new ExcelTestDto{Field0="Name-6",Field1=6,Field2="Male",Field3= 6},
new ExcelTestDto{Field0="Name-7",Field1=7,Field2="Male",Field3= 7},
new ExcelTestDto{Field0="Name-8",Field1=8,Field2="Male",Field3= 8},
new ExcelTestDto{Field0="Name-9",Field1=9,Field2="Male",Field3= 9},
new ExcelTestDto{Field0="Name-10",Field1=10,Field2="Male",Field3= 10}
};
await ExportConfig<ExcelTestDto>.DataExportAsync(filePath, exportData);

自定义导出配置

备注

使用方式基本上和上方的导入相同

IEnumerable<ExcelTestDto> exportData = new[] {
new ExcelTestDto{Field0="Name-1",Field1=1,Field2="Male",Field3= 1},
new ExcelTestDto{Field0="Name-2",Field1=2,Field2="Male",Field3= 2},
new ExcelTestDto{Field0="Name-3",Field1=3,Field2="Male",Field3= 3},
new ExcelTestDto{Field0="Name-4",Field1=4,Field2="Male",Field3= 4},
new ExcelTestDto{Field0="Name-5",Field1=5,Field2="Male",Field3= 5},
new ExcelTestDto{Field0="Name-6",Field1=6,Field2="Male",Field3= 6},
new ExcelTestDto{Field0="Name-7",Field1=7,Field2="Male",Field3= 7},
new ExcelTestDto{Field0="Name-8",Field1=8,Field2="Male",Field3= 8},
new ExcelTestDto{Field0="Name-9",Field1=9,Field2="Male",Field3= 9},
new ExcelTestDto{Field0="Name-10",Field1=10,Field2="Male",Field3= 10}
};
var exportConfig = new ExportConfig<ExcelTestDto>(exportData)
.Add("Field0", item => item.Field0)
.Add("Field1", item => item.Field1)
.Add("Field2", item => item.Field2 == "Male" ? "男" : "女")
.Add("Field3", item => item.Field3)
;
await exportConfig.DataExportAsync(filePath);
提示

同时也支持使用字符串配置属性,使用方式相同