开源导入导出通用库Magicodes.ExporterAndImporter发布

640

640?wx_fmt=gif

导入导出通用库

Magicodes.ExporterAndImporter为心莱团队封装的导入导出通用库,并且仍在跟随项目不断地打磨。

GitHub地址:

https://github.com/xin-lai/Magicodes.ExporterAndImporter

目录

特点

相关官方Nuget包

导出 Demo

  • 普通导出

  • 特性导出

  • 列头处理或者多语言支持

导入Demo

  • 普通模板

  • 多数据类型

  • 数据验证

Docker中使用

Dockerfile Demo

特点

  • 封装导入导出业务,目前仅支持 Excel,有兴趣的小伙伴可以考虑支持 CSV 以及PDF或其他格式的导出

  • 配置特性即可控制相关逻辑和显示结果,无需修改逻辑代码

  • 推荐配合 导入导出DTO 使用

  • 导出支持列头自定义处理以便支持多语言等场景

  • 导出支持文本自定义过滤或处理

  • 导入支持自动根据导入DTO生成导入模板及模板验证

  • 导入支持数据验证逻辑

  • 导入支持数据下拉选择

  • 导入支持注释添加

相关官方Nuget包

640?wx_fmt=png

导出 Demo

Demo1-1

普通导出

640?wx_fmt=png

public class ExportTestData	
{	public string Name1 { get; set; }	public string Name2 { get; set; }	public string Name3 { get; set; }	public string Name4 { get; set; }	
}	var result = await Exporter.Export(filePath, new List<ExportTestData>()	
{	new ExportTestData()	{	Name1 = "1",	Name2 = "test",	Name3 = "12",	Name4 = "11",	},	new ExportTestData()	{	Name1 = "1",	Name2 = "test",	Name3 = "12",	Name4 = "11",	}	
});

Demo1-2

特性导出

640?wx_fmt=png

[ExcelExporter(Name = "测试", TableStyle = "Light10")]public class ExportTestDataWithAttrs	
{	[ExporterHeader(DisplayName = "加粗文本", IsBold = true)]	public string Text { get; set; }	[ExporterHeader(DisplayName = "普通文本")]	public string Text2 { get; set; }	[ExporterHeader(DisplayName = "忽略", IsIgnore = true)]	public string Text3 { get; set; }	[ExporterHeader(DisplayName = "数值", Format = "#,##0")]	public double Number { get; set; }	[ExporterHeader(DisplayName = "名称", IsAutoFit = true)]	public string Name { get; set; }	
}	var result = await Exporter.Export(filePath, new List<ExportTestDataWithAttrs>()	{	new ExportTestDataWithAttrs()	{	Text = "啊实打实大苏打撒",	Name="aa",	Number =5000,	Text2 = "w萨达萨达萨达撒",	Text3 = "sadsad打发打发士大夫的"	},	new ExportTestDataWithAttrs()	{	Text = "啊实打实大苏打撒",	Name="啊实打实大苏打撒",	Number =6000,	Text2 = "w萨达萨达萨达撒",	Text3 = "sadsad打发打发士大夫的"	},	new ExportTestDataWithAttrs()	{	Text = "啊实打实速度大苏打撒",	Name="萨达萨达",	Number =6000,	Text2 = "突然他也让他人",	Text3 = "sadsad打发打发士大夫的"	},	});

列头处理或者多语言支持

640?wx_fmt=png

[ExcelExporter(Name = "测试", TableStyle = "Light10")]	
public class AttrsLocalizationTestData	
{	[ExporterHeader(DisplayName = "加粗文本", IsBold = true)]	public string Text { get; set; }	[ExporterHeader(DisplayName = "普通文本")]	public string Text2 { get; set; }	[ExporterHeader(DisplayName = "忽略", IsIgnore = true)]	public string Text3 { get; set; }	[ExporterHeader(DisplayName = "数值", Format = "#,##0")]	public double Number { get; set; }	[ExporterHeader(DisplayName = "名称", IsAutoFit = true)]	public string Name { get; set; }	
}	ExcelBuilder.Create().WithLocalStringFunc((key) =>	{	if (key.Contains("文本"))	{	return "Text";	}	return "未知语言";	}).Build();	var filePath = Path.Combine(Directory.GetCurrentDirectory(), "testAttrsLocalization.xlsx");	if (File.Exists(filePath)) File.Delete(filePath);	var result = await Exporter.Export(filePath, new List<AttrsLocalizationTestData>()	{	new AttrsLocalizationTestData()	{	Text = "啊实打实大苏打撒",	Name="aa",	Number =5000,	Text2 = "w萨达萨达萨达撒",	Text3 = "sadsad打发打发士大夫的"	},	new AttrsLocalizationTestData()	{	Text = "啊实打实大苏打撒",	Name="啊实打实大苏打撒",	Number =6000,	Text2 = "w萨达萨达萨达撒",	Text3 = "sadsad打发打发士大夫的"	},	new AttrsLocalizationTestData()	{	Text = "啊实打实速度大苏打撒",	Name="萨达萨达",	Number =6000,	Text2 = "突然他也让他人",	Text3 = "sadsad打发打发士大夫的"	},	});

导入特性(ImporterHeader):

  • Namestring 表头显示名称(不可为空)。

  • Descriptionstring 表头添加注释。

  • Authorstring 注释作者,默认值为X.M。

导入结果(ImportModel<T>):

  • DataIList<T>  导入的数据集合。

  • ValidationResultsIList<ValidationResultModel> 数据验证结果。

  • HasValidTemplatebool 模板验证是否通过。

数据验证结果(ValidationResultModel):

  • Indexint  错误数据所在行。

  • ErrorsIDictionary<string, string> 整个Excel错误集合。目前仅支持数据验证错误。

  • FieldErrorsIDictionary<string, string> 数据验证错误。


Demo2-1 普通模板

生成模板

640?wx_fmt=png

public class ImportProductDto	
{	/// <summary>	/// 产品名称	/// </summary>	[ImporterHeader(Name = "产品名称")]	public string Name { get; set; }	/// <summary>	/// 产品代码	/// </summary>	[ImporterHeader(Name = "产品代码")]	public string Code { get; set; }	/// <summary>	/// 产品条码	/// </summary>	[ImporterHeader(Name = "产品条码")]	public string BarCode { get; set; }	}

640?wx_fmt=png

640?wx_fmt=png


Demo2-2 多数据类型

生成模板

640?wx_fmt=png

public class ImportProductDto	
{	/// <summary>	/// 产品名称	/// </summary>	[ImporterHeader(Name = "产品名称")]	public string Name { get; set; }	/// <summary>	/// 产品代码	/// </summary>	[ImporterHeader(Name = "产品代码")]	public string Code { get; set; }	/// <summary>	/// 产品条码	/// </summary>	[ImporterHeader(Name = "产品条码")]	public string BarCode { get; set; }	/// <summary>	/// 客户Id	/// </summary>	[ImporterHeader(Name = "客户代码")]	public long ClientId { get; set; }	/// <summary>	/// 产品型号	/// </summary>	[ImporterHeader(Name = "产品型号")]	public string Model { get; set; }	/// <summary>	/// 申报价值	/// </summary>	[ImporterHeader(Name = "申报价值")]	public double DeclareValue { get; set; }	/// <summary>	/// 货币单位	/// </summary>	[ImporterHeader(Name = "货币单位")]	public string CurrencyUnit { get; set; }	/// <summary>	/// 品牌名称	/// </summary>	[ImporterHeader(Name = "品牌名称")]	public string BrandName { get; set; }	/// <summary>	/// 尺寸	/// </summary>	[ImporterHeader(Name = "尺寸(长x宽x高)")]	public string Size { get; set; }	/// <summary>	/// 重量	/// </summary>	[ImporterHeader(Name = "重量(KG)")]	public double Weight { get; set; }	/// <summary>	/// 类型	/// </summary>	[ImporterHeader(Name = "类型")]	public ImporterProductType Type { get; set; }	/// <summary>	/// 是否行	/// </summary>	[ImporterHeader(Name = "是否行")]	public bool IsOk { get; set; }	
}

public enum ImporterProductType	
{	[Display(Name = "第一")]	One,	[Display(Name = "第二")]	Two	}

640?wx_fmt=png

640?wx_fmt=png

Demo2-3 数据验证

生成模板


必填项表头文本为红色

640?wx_fmt=png

public class ImportProductDto	
{	/// <summary>	/// 产品名称	/// </summary>	[ImporterHeader(Name = "产品名称",Description ="必填")]	[Required(ErrorMessage = "产品名称是必填的")]	public string Name { get; set; }	/// <summary>	/// 产品代码	/// </summary>	[ImporterHeader(Name = "产品代码", Description = "最大长度为8")]	[MaxLength(8,ErrorMessage = "产品代码最大长度为8")]	public string Code { get; set; }	/// <summary>	/// 产品条码	/// </summary>	[ImporterHeader(Name = "产品条码")]	[MaxLength(10, ErrorMessage = "产品条码最大长度为10")]	[RegularExpression(@"^\d*$", ErrorMessage = "产品条码只能是数字")]	public string BarCode { get; set; }	/// <summary>	/// 客户Id	/// </summary>	[ImporterHeader(Name = "客户代码")]	public long ClientId { get; set; }	/// <summary>	/// 产品型号	/// </summary>	[ImporterHeader(Name = "产品型号")]	public string Model { get; set; }	/// <summary>	/// 申报价值	/// </summary>	[ImporterHeader(Name = "申报价值")]	public double DeclareValue { get; set; }	/// <summary>	/// 货币单位	/// </summary>	[ImporterHeader(Name = "货币单位")]	public string CurrencyUnit { get; set; }	/// <summary>	/// 品牌名称	/// </summary>	[ImporterHeader(Name = "品牌名称")]	public string BrandName { get; set; }	/// <summary>	/// 尺寸	/// </summary>	[ImporterHeader(Name = "尺寸(长x宽x高)")]	public string Size { get; set; }	/// <summary>	/// 重量	/// </summary>	[ImporterHeader(Name = "重量(KG)")]	public double Weight { get; set; }	/// <summary>	/// 类型	/// </summary>	[ImporterHeader(Name = "类型")]	public ImporterProductType Type { get; set; }	/// <summary>	/// 是否行	/// </summary>	[ImporterHeader(Name = "是否行")]	public bool IsOk { get; set; }	
}	
public enum ImporterProductType	
{	[Display(Name = "第一")]	One,	[Display(Name = "第二")]	Two	}

640?wx_fmt=png

640?wx_fmt=png

Docker中使用

# 安装libgdiplus库,用于Excel导出	
RUN apt-get update && apt-get install -y libgdiplus libc6-dev	
RUN ln -s /usr/lib/libgdiplus.so /usr/lib/gdiplus.dll

Dockerfile Demo

FROM microsoft/dotnet:2.2-aspnetcore-runtime AS base	
# 安装libgdiplus库,用于Excel导出	
RUN apt-get update && apt-get install -y libgdiplus libc6-dev	
RUN ln -s /usr/lib/libgdiplus.so /usr/lib/gdiplus.dll	
WORKDIR /app	
EXPOSE 80	FROM microsoft/dotnet:2.2-sdk AS build	
WORKDIR /src	
COPY ["src/web/Admin.Host/Admin.Host.csproj", "src/web/Admin.Host/"]	
COPY ["src/web/Admin.Web.Core/Admin.Web.Core.csproj", "src/web/Admin.Web.Core/"]	
COPY ["src/application/Admin.Application/Admin.Application.csproj", "src/application/Admin.Application/"]	
COPY ["src/core/Magicodes.Admin.Core/Magicodes.Admin.Core.csproj", "src/core/Magicodes.Admin.Core/"]	
COPY ["src/data/Magicodes.Admin.EntityFrameworkCore/Magicodes.Admin.EntityFrameworkCore.csproj", "src/data/Magicodes.Admin.EntityFrameworkCore/"]	
COPY ["src/core/Magicodes.Admin.Core.Custom/Magicodes.Admin.Core.Custom.csproj", "src/core/Magicodes.Admin.Core.Custom/"]	
COPY ["src/application/Admin.Application.Custom/Admin.Application.Custom.csproj", "src/application/Admin.Application.Custom/"]	
RUN dotnet restore "src/web/Admin.Host/Admin.Host.csproj"	
COPY . .	
WORKDIR "/src/src/web/Admin.Host"	
RUN dotnet build "Admin.Host.csproj" -c Release -o /app	FROM build AS publish	
RUN dotnet publish "Admin.Host.csproj" -c Release -o /app	FROM base AS final	
WORKDIR /app	
COPY --from=publish /app .	
ENTRYPOINT ["dotnet", "Magicodes.Admin.Web.Host.dll"]

640?wx_fmt=jpeg

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/313963.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

第一个错误的版本

题目描述 你是产品经理&#xff0c;目前正在带领一个团队开发新的产品。不幸的是&#xff0c;你的产品的最新版本没有通过质量检测。由于每个版本都是基于之前的版本开发的&#xff0c;所以错误的版本之后的所有版本都是错的。 假设你有 n 个版本 [1, 2, …, n]&#xff0c;你…

P4705 玩游戏(生成函数,多项式ln)

P4705 玩游戏 有ansk∑i1n∑j1m(aibj)knm先舍弃nm不管ansk∑r0k∑i1n∑j1mCkrairbjk−r∑r0k∑i1n∑j1mk!r!(k−r)!airbjk−rk!∑r0k(1r!∑i1nair)(1(k−r)!∑j1mbjk−r)不难发现这就是一个卷积的形式了&#xff0c;但是我们现在还不知道∑i1nair,∑i1mbir,(r∈[0,k])设A(x)为∑…

爬楼梯

假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢&#xff1f; 注意&#xff1a;给定 n 是一个正整数。 示例 1&#xff1a; 输入&#xff1a; 2 输出&#xff1a; 2 解释&#xff1a; 有两种方法可以爬到楼顶…

netcore 中的动态代理与RPC实现(微服务专题)

一、关于RPC的调用1. 调用者&#xff08;客户端Client&#xff09;以本地调用的方式发起调用&#xff1b;  2. Client stub&#xff08;客户端存根&#xff09;收到调用后&#xff0c;负责将被调用的方法名、参数等打包编码成特定格式的能进行网络传输的消息体&#xff1b; …

多项式除法,多项式取模

多项式除法 给定一个nnn次多项式F(x)F(x)F(x)和mmm次多项式G(x)G(x)G(x)&#xff0c;要求R(x),Q(x)R(x), Q(x)R(x),Q(x)&#xff0c;满足F(x)R(x)G(x)Q(x)F(x) R(x)G(x) Q(x)F(x)R(x)G(x)Q(x)。 R(x)R(x)R(x)是一个n−mn - mn−m阶多项式&#xff0c;Q(x)Q(x)Q(x)是一个小于…

[翻译] .NET Core 3.0 Preview 9 发布

原文: Announcing .NET Core 3.0 Preview 9今天&#xff0c;我们宣布推出 .NET Core 3.0 Preview 9。就像 Preview 8 一样&#xff0c;我们专注于打磨 .NET Core 3.0 的最终版本&#xff0c;而不是添加新功能。如果这些最终版本看起来不像早期预览版那么令人兴奋&#xff0c;我…

南昌网络赛E Interesting Series

Interesting Series 可求得通项Fnan−1a−1F_n \frac{a ^ n - 1}{a - 1}Fn​a−1an−1​&#xff0c;一个等比数列的前nnn项和&#xff0c;value(s)Fsum(s)value(s) F_{sum(s)}value(s)Fsum(s)​。 题目要我们求的是Answer(K)∑s∈subsetofSand∣s∣Kvalue(s)Answer(K) \s…

谈谈“学习”这件事儿

曾经有童鞋在我博客留言&#xff1a;楼主你是如何学习的&#xff0c;肿么那么牛逼&#xff08;注&#xff1a;真不牛逼&#xff0c;只不过我讲的你刚好不知道&#xff0c;在你心中就形成了好牛逼的样子&#xff09;曾经也有童鞋加我好友&#xff0c;开头第一句则是&#xff1a;…

牛客练习赛50 F tokitsukaze and Another Protoss and Zerg

tokitsukaze and Another Protoss and Zerg 考虑生成函数&#xff0c;每一场的生成函数为∑j1b[i]Cb[i]j∑j1a[i]Ca[i]jxj\sum\limits_{j 1} ^{b[i]}C_{b[i]} ^ j \sum\limits_{j 1} ^{a[i]}C_{a[i]} ^{j} x ^ jj1∑b[i]​Cb[i]j​j1∑a[i]​Ca[i]j​xj&#xff0c; 进一步…

持续集成之应用k8s自动部署

持续集成之应用k8s自动部署Intro上次我们提到了docker容器化及自动化部署[1]&#xff0c;这仅仅适合个人项目或者开发环境部署&#xff0c;如果要部署到生产环境&#xff0c;必然就需要考虑很多因素&#xff0c;比如访问量大了如何调整部署&#xff0c;如何更好的应对大并发的情…

Fizz Buzz

题目描述 写一个程序&#xff0c;输出从 1 到 n 数字的字符串表示。 如果 n 是3的倍数&#xff0c;输出“Fizz”&#xff1b; 如果 n 是5的倍数&#xff0c;输出“Buzz”&#xff1b; 3.如果 n 同时是3和5的倍数&#xff0c;输出 “FizzBuzz”。 示例&#xff1a; n 15,返…

多项式全家桶(半)

快速傅里叶变换(FFT) 多项式表示 系数表示法&#xff1a; 一个nnn次多项式可以用n1n 1n1个系数表示出来&#xff1a;f(x)a0a1xa2x2⋯an−1xn−1anxnf(x) a_0 a_1 x a_2 x ^ 2 \dots a_{n - 1} x ^{n- 1} a_n x ^nf(x)a0​a1​xa2​x2⋯an−1​xn−1an​xn。 点值表示…

持续集成之应用容器化及自动化部署

通过 Azure Pipelines 实现持续集成之docker容器化及自动化部署IntroAzure DevOps Pipeline 现在对于公开的项目完全免费&#xff0c;这对于开源项目来讲无疑是个巨大的好消息&#xff0c;在 Github 的 Marketplace 里有个 Azure Pipeline&#xff0c;就是微软的 Azure DevOps …

最小栈

题目描述 设计一个支持 push&#xff0c;pop&#xff0c;top 操作&#xff0c;并能在常数时间内检索到最小元素的栈。 push(x) – 将元素 x 推入栈中。 pop() – 删除栈顶的元素。 top() – 获取栈顶元素。 getMin() – 检索栈中的最小元素。 示例: MinStack minStack new …

持续集成之 Nuget 进阶

持续集成之 Nuget 进阶Intro之前介绍了一篇基于 Azure pipeline 的 nuget 包的持续集成配置&#xff0c;但是比较粗糙&#xff0c;这里介绍一下结合 Cake 实现更优雅的 nuget 包发布流程。实现目标&#xff1a;分支(除master/preview)有代码 push 或者 pr 时 自动 buildpreview…

#3771. Triple(生成函数 + 容斥)

#3771. Triple 考虑只有一个损失时&#xff0c;损失值的生成函数为A(x)A(x)A(x)。 如果不考虑无序方案&#xff0c;有两个损失的生成函数为B(x)A(x)A(x)B(x) A(x)A(x)B(x)A(x)A(x)&#xff0c;同理有三个的时候C(x)A(x)A(x)A(x)C(x) A(x)A(x)A(x)C(x)A(x)A(x)A(x)。 考虑如…

计数质数

题目描述 统计所有小于非负整数 n 的质数的数量。 示例: 输入: 10 输出: 4 解释: 小于 10 的质数一共有 4 个, 它们是 2, 3, 5, 7 。解法 思路1&#xff1a;暴力法 /***暴力法* 时间复杂度O(n2)* 空间复杂度(O(1))* param n* return*/ public int countPrimes(int n) {if(n&…

做“是非题”的正确姿势

这里是Z哥的个人公众号每周五11&#xff1a;45 按时送达有时也会有感而发&#xff0c;来加个餐&#xff5e;我的第「107」篇原创敬上大家好&#xff0c;我是Z哥。这两天中国男篮的事&#xff0c;让我有感而发。不知道你有没有留意到&#xff0c;我们身边总有类似下面这样的事情…

3的幂

题目描述 给定一个整数&#xff0c;写一个函数来判断它是否是 3 的幂次方。 示例 1: 输入: 27 输出: true示例 2: 输入: 0 输出: false示例 3: 输入: 9 输出: true示例 4: 输入: 45 输出: false进阶&#xff1a; 你能不使用循环或者递归来完成本题吗&#xff1f; 解法1&a…

E. The Child and Binary Tree(生成函数 + 多项式)

E. The Child and Binary Tree 不难写出一个递推式fn∑i1ngi∑j0n−ifjfn−i−jf_n \sum\limits_{i 1} ^{n}g_i \sum\limits_{j 0} ^{n - i}f_jf_{n - i - j}fn​i1∑n​gi​j0∑n−i​fj​fn−i−j​&#xff0c;其中gig_igi​表示ccc中有没有iii这个数。 设F(x)F(x)F(x)…