开源导入导出通用库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,一经查实,立即删除!

相关文章

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

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

[翻译] .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;我…

谈谈“学习”这件事儿

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

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

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

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

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

持续集成之 Nuget 进阶

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

做“是非题”的正确姿势

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

依赖倒置原则(DIP)、控制反转(IoC)、依赖注入(DI)(C#)

象的控制权交由配置文件控制&#xff0c;然后根据配置文件中的信息&#xff08;程序集类型&#xff09;&#xff0c;通过反射来获取对象&#xff0c;而不是直接new对象&#xff0c;这也是控制反转的一种体现。IoC容器会连接程序中的所有模块&#xff0c;模块将所需对象的控制权…

四种为HttpClient添加默认请求报头的解决方案

HttpClient在Web调用中具有广泛的应用&#xff0c;而为它添加默认请求头是我们经常遇到的需求&#xff0c;本文介绍4种为HttpClient添加默认请求头的方式。直接在创建的HttpClient对象的DefaultRequestHeaders集合中添加报头。class Program{static Task Main()> SendAsync…

【盛派内部分享资料】本期主题:使用JavaScript HTML CSS构建跨平台桌面应用

先上录制视频友情提示&#xff1a;如果公众号内视频无法显示高清视频&#xff0c;您也可以在小程序内观看高清视频&#xff0c;点击下方按钮观看&#xff1a;【盛派内部分享资料】本期主题&#xff1a;使用JavaScript HTML CSS构建跨平台桌面应用本次活动由盛派技术人员伏允坤主…

负载均衡及负载均衡器

负载均衡在分布式系统中&#xff0c;负载均衡&#xff08;load balancing&#xff09;是一种有效的将网络请求分配到多个服务器的过程。通过将负载进行负载均衡&#xff0c;可以有效地改进系统响应时间&#xff0c;提高系统的可用性。随着系统变的愈发复杂&#xff0c;用户增多…

VS Code 摸鱼插件开发小记

插件地址&#xff1a;https://marketplace.visualstudio.com/items?itemNamebugbreeder.vscode-readhub原文链接&#xff1a;https://github.com/alex-yh99/vscode-readhub/blob/master/docs/develop-note.md一、关于插件在 VSCode 中快捷查阅科技动态、开发者资讯等 Readhub …

9月数据库排行:Microsoft SQL Server分数罕见下滑

DB-Engines 数据库流行度排行榜 9 月更新已发布&#xff0c;排名前二十如下&#xff1a;明显能看出来&#xff0c;整体排名和上个月的保持一致。而上个月出现分数下跌的 PostgreSQL 和 MongoDB 终于“回归正道”&#xff0c;分数有了稍微的上升。与上个月相比&#xff0c;Postg…

Exceptionless使用介绍

一.Exceptionless介绍Exceptionless专注于.net平台提供实时错误和日志报告。主要包括&#xff1a;错误通知、智能分组异常、详细错误报告堆栈跟踪、支持离线、UI查看重要错误和确定优先级、仪表板上的统计信息和趋势、对异常标记为已修复&#xff0c;监视回归、将事件标记为关键…

Net Core DocXCore 实现word模板导出

实际工作中&#xff0c;往往有这样的需求&#xff0c;需要导出word&#xff0c;还有各种各样的样式&#xff0c;于是有了word模板导出。实现以下几个需求&#xff1a;1、表单导出2、表格导出3、表单表格混合导出4、实际用例测试解决方案&#xff1a;实现是基于NET Core 2.1 &am…

密钥分离,.Net程序猿不再背锅

引言互联网每隔一段时间就会爆出 【某程序猿在代码托管平台上传了公司机密配置信息&#xff0c;导致公司核心数据被黑客获取或修改】&#xff0c; 一茬又一茬背锅侠层出不穷。拯救自我软件工程理论早以加粗字体给出 经典原则&#xff1a;Never store production passwords or o…

Chrome让人失望,是时候转到Firefox或Edge?

我们曾报道过谷歌正在移除 Chrome 的关闭其他选项卡&#xff0c;这引起很多用户的讨论&#xff0c;很多用户表现出对 Chrome 浏览器的失望。而在国外&#xff0c;也有很多人认为谷歌这项修改使 Chrome 变得越来越臃肿。还有前段时间&#xff0c;谷歌在 Chrome 76 中隐藏了 “ht…

我认真写下9段如翔一般的代码,只为等你来品鉴

溪源 | 长沙.NET技术社区开篇我们总是很容易就能写出满足某个特定功能的代码&#xff0c;却很难写出优雅代码。又最欣赏那些优雅的代码&#xff0c;因为优雅代码更能体现一个开发者的积累。就像写一篇散文&#xff0c;有的就像初学者不得其门而入&#xff0c;遣词造句都非常困难…

「标签管理」用数据管理思维去管理你的日常电子化资料、文件、笔记等

最近一时兴起&#xff0c;研究了一些文件管理的方法论和笔记管理类的知识&#xff0c;自己想到一些不错的方法及落地方案&#xff0c;可能对一部分朋友来说&#xff0c;这些方法和工具的落地会有一些共鸣&#xff0c;故简单给大家做一下分享。跨界应用&#xff1a;数据表结构应…

Java之JMS

一&#xff1a;JMS简介   JMS即Java消息服务&#xff08;Java Message Service&#xff09;&#xff0c;是一个Java平台定义的关于面向消息中间件的API&#xff0c;用于在两个应用程序之间&#xff0c;或分布式系统中发送消息&#xff0c;进行异步通信。JMS是一个与具体平台无…