导入导出通用库,支持Dto导入导出以及动态导出,支持Excel、Word、Pdf、Csv和Html。已加入NCC开源组织。
- Github:https://github.com/dotnetcore/Magicodes.IE
- 码云(手动同步,不维护):https://gitee.com/magicodes/Magicodes.IE
- 特点、详细说明、教程、Nuget、注意事项、里程碑、FAQ、更新历史见下文
一旦成为贡献者,我们将会邀请您加入Magicodes.IE管理委员会的微信群,并拥有相关的投票权。
最新版本:2.2.0-beta9
- Build Status:
- Azure DevOps coverage (master):
- Azure DevOps coverage (develop):
- Azure DevOps tests (master):
- Azure DevOps tests (develop):
具体见:https://dev.azure.com/xinlaiopencode/Magicodes.IE/_build?definitionId=4&_a=summary
# | 状态 | 完成时间 | 里程碑情况 |
---|---|---|---|
3.0 | 🚢规划中 | 2020-12-31 | 待办 |
2.2 | ☕进行中#46 | 2020-04-31 | 待办 已完成 |
2.1 | 🚩已完成 | 2020-03-15 | 已完成 |
名称 | Nuget |
---|---|
Magicodes.IE.Core | |
Magicodes.IE.Excel | |
Magicodes.IE.Pdf | |
Magicodes.IE.Word | |
Magicodes.IE.Html | |
Magicodes.IE.Csv |
名称 | 说明 | Nuget | GitHUb |
---|---|---|---|
Magicodes.WeChat.MiniProgram | 小程序SDK | Magicodes.WxMiniProgram.Sdk | |
Magicodes.Sms.Aliyun | 阿里云短信 | xin-lai/Magicodes.Sms | |
Magicodes.Sms.Core | 短信核心库 | xin-lai/Magicodes.Sms | |
Magicodes.Sms.Aliyun.Abp | 阿里云短信Abp模块 | xin-lai/Magicodes.Sms | |
Magicodes.Storage.Core | 通用存储核心库 | xin-lai/Magicodes.Storage | |
Magicodes.Storage.AliyunOss.Core | 阿里云OSS存储 | xin-lai/Magicodes.Storage | |
Magicodes.Storage.Local.Core | 本地存储 | xin-lai/Magicodes.Storage | |
Magicodes.Storage.Tencent.Core | 腾讯云存储 | xin-lai/Magicodes.Storage | |
Magicodes.Storage.Abp.Core | 通用存储ABP模块集成 | xin-lai/Magicodes.Storage | |
Magicodes.WeChat.SDK.Core | 微信SDK | xin-lai/Magicodes.WeChat.SDK | |
Magicodes.SwaggerUI | SwaggerUI API快速配置和分组 | xin-lai/Magicodes.SwaggerUI | |
Magicodes.Pay.Alipay | 支付宝支付库 | xin-lai/Magicodes.Pay | |
Magicodes.Pay.Notify | 支付通用回调库 | xin-lai/Magicodes.Pay | |
Magicodes.Pay.Wxpay | 微信支付库 | xin-lai/Magicodes.Pay | |
Magicodes.Pay.Alipay.Global | 国际支付宝支付库 | xin-lai/Magicodes.Pay | |
Magicodes.Pay.Allinpay | 通联支付库 | xin-lai/Magicodes.Pay | |
Magicodes.Pay.Abp | ABP 支付通用封装库 | xin-lai/Magicodes.Pay | |
Magicodes.Pay.Abp.Allinpay | ABP 通联支付模块 | xin-lai/Magicodes.Pay | |
Magicodes.Pay.Abp.Wxpay | ABP 微信支付模块 | xin-lai/Magicodes.Pay | |
Magicodes.Pay.Alipay.Global | ABP 国际支付宝模块 | xin-lai/Magicodes.Pay | |
Magicodes.Pay.Alipay | ABP 支付宝模块 | xin-lai/Magicodes.Pay | |
Magicodes.Abp.Castle.NLog | ABP Nlog支持模块 | xin-lai/Abp.Castle.NLog | |
Magicodes.WxMiniProgram.Sdk | 微信小程序SDK | xin-lai/Magicodes.WxMiniProgram.Sdk | |
Magicodes.WxMiniProgram.Sdk.Abp | 微信小程序SDK Abp模块 | xin-lai/Magicodes.WxMiniProgram.Sdk | |
Magicodes.Dingtalk.SDK | 钉钉SDK | xin-lai/Magicodes.Dingtalk.SDK | |
Magicodes.DynamicSqlApi.Core | 根据SQL自动解析生成动态API | Magicodes.DynamicSqlApi | |
Magicodes.DynamicSqlApi.All | 根据SQL自动解析生成动态API | Magicodes.DynamicSqlApi | |
Magicodes.DynamicSqlApi.CsScript | 根据SQL自动解析生成动态API | Magicodes.DynamicSqlApi | |
Magicodes.DynamicSqlApi.Dapper | 根据SQL自动解析生成动态API | Magicodes.DynamicSqlApi | |
Magicodes.DynamicSqlApi.SqlServer | 根据SQL自动解析生成动态API | Magicodes.DynamicSqlApi |
- Excel导入不支持“.xls”文件,即不支持Excel97-2003。
- 如需在Docker中使用,请参阅文档中的《Docker中使用》一节。
- 相关功能均已编写单元测试,在使用的过程中可以参考单元测试。
-
动态导出(待补充)
-
多Sheet导入(待补充)
-
Csv导入导出(待补充)
-
进阶篇之导入导出筛选器(待补充)
-
Excel导出多个实体(待补充)
其他教程见下文或单元测试
更新历史见下文。
- 需配合相关导入导出的DTO模型使用,支持通过DTO以及相关特性控制导入导出。配置特性即可控制相关逻辑和显示结果,无需修改逻辑代码;
- 支持各种筛选器,以便支持多语言、动态控制列展示等场景,具体使用见单元测试:
- 导入列头筛选器(可动态指定导入列、导入的值映射关系)
- 导出列头筛选器(可动态控制导出列,支持动态导出(DataTable))
- 导入结果筛选器(可修改标注文件)
- 导出支持文本自定义过滤或处理;
- 导入支持中间空行自动跳过;
- 导入支持自动根据 DTO 生成导入模板,针对必填项将自动标注;
- 导入支持数据下拉选择,目前仅支持枚举类型;
- 导入数据支持前后空格以及中间空格处理,允许指定列进行设置;
- 导入支持模板自动检查,数据自动校验,异常统一处理,并提供统一的错误封装,包含异常、模板错误和行数据错误;
- 支持导入表头位置设置,默认为1;
- 支持导入列乱序,无需按顺序一一对应;
- 支持导入指定列索引,默认自动识别;
- 导出Excel支持拆分Sheet,仅需设置特性【ExporterAttribute】的【MaxRowNumberOnASheet】的值,为0则不拆分。具体见单元测试;
- 支持将导入Excel进行错误标注;
- 导入支持截止列设置,如未设置则默认遇到空格截止;
- 支持导出HTML、Word、Pdf,支持自定义导出模板;
- 导入支持重复验证;
- 支持单个数据模板导出,常用于导出收据、凭据等业务
- 支持动态列导出(基于DataTable),并且超过100W将自动拆分Sheet。(感谢张善友老师(dotnetcore#8 ))
- 支持值映射,支持通过“ValueMappingAttribute”特性设置值映射关系。用于生成导入模板的数据验证约束以及进行数据转换。
/// <summary>
/// 性别
/// </summary>
[ImporterHeader(Name = "性别")]
[Required(ErrorMessage = "性别不能为空")]
[ValueMapping(text: "男", 0)]
[ValueMapping(text: "女", 1)]
public Genders Gender { get; set; }
-
支持枚举和Bool类型的导入数据验证项的生成,以及相关数据转换
-
枚举默认情况下会自动获取枚举的描述、显示名、名称和值生成数据项
/// <summary> /// 学生状态 正常、流失、休学、勤工俭学、顶岗实习、毕业、参军 /// </summary> public enum StudentStatus { /// <summary> /// 正常 /// </summary> [Display(Name = "正常")] Normal = 0, /// <summary> /// 流失 /// </summary> [Description("流水")] PupilsAway = 1, /// <summary> /// 休学 /// </summary> [Display(Name = "休学")] Suspension = 2, /// <summary> /// 勤工俭学 /// </summary> [Display(Name = "勤工俭学")] WorkStudy = 3, /// <summary> /// 顶岗实习 /// </summary> [Display(Name = "顶岗实习")] PostPractice = 4, /// <summary> /// 毕业 /// </summary> [Display(Name = "毕业")] Graduation = 5, /// <summary> /// 参军 /// </summary> [Display(Name = "参军")] JoinTheArmy = 6, }
-
bool类型默认会生成“是”和“否”的数据项
-
如果已设置自定义值映射,则不会生成默认选项
-
-
渲染语法如下所示:
{{Company}} //单元格渲染 {{Table>>BookInfos|RowNo}} //表格渲染开始语法 {{Remark|>>Table}}//表格渲染结束语法 {{Image::ImageUrl?Width=50&Height=120&Alt=404}} //图片渲染 {{Image::ImageUrl?w=50&h=120&Alt=404}} //图片渲染 {{Image::ImageUrl?Alt=404}} //图片渲染
后续将支持自定义管道。
-
支持Excel图片导入导出
- 图片导入
- 导入为Base64
- 导入到临时目录
- 导入到指定目录
- 图片导出
- 将文件路径导出为图片
- 将网络路径导出为图片
- 图片导入
-
支持多个实体导出多个Sheet
关注“麦扣聊技术”订阅号可以获得最新文章、教程、文档:
-
编程交流群<85318032>
-
产品交流群<897857351>
- 【Nuget】版本更新到2.2.0-beta9
- 【Excel模板导出】修复只存在一列时的导出 #73
- 【Excel导入】支持返回表头和索引 #76
- 【Excel导入导入】#63
- 支持使用System.ComponentModel.DataAnnotations命名空间下的部分特性来控制导入导出,比如
- DisplayAttribute
- DisplayFormatAttribute
- DescriptionAttribute
- 封装简单的易于使用的单一特性,例如
- IEIgnoreAttribute(可作用于属性、枚举成员,可影响导入和导出)
- 支持使用System.ComponentModel.DataAnnotations命名空间下的部分特性来控制导入导出,比如
-
【Nuget】版本更新到2.2.0-beta8
-
【Excel模板导出】支持图片 #62,渲染语法如下所示:
{{Image::ImageUrl?Width=50&Height=120&Alt=404}}
{{Image::ImageUrl?w=50&h=120&Alt=404}}
{{Image::ImageUrl?Alt=404}}
- 【Nuget】版本更新到2.2.0-beta7
- 【Excel模板导出】修复渲染问题 #51
- 【Nuget】版本更新到2.2.0-beta6
- 【Excel导入导出】修复.NET Core 2.2的包引用问题 #68
- 【Nuget】版本更新到2.2.0-beta4
- 【Excel多Sheet导出】修复#66,并添加单元测试
- 【Nuget】版本更新到2.2.0-beta2
- 【Excel导入】修复日期格式的导入Bug,支持DateTime和DateTimeOffset以及可为空类型,默认支持本地化时间格式(默认根据地区自动使用本地日期时间格式)
- 【Excel导入导出】添加单元测试ExportAndImportUseOneDto_Test,对使用同一个Dto导出并导入进行测试。Issue见 #53
- 【Nuget】版本更新到2.2.0-beta1
- 【Excel导出】添加以下API:
/// <summary>
/// 追加集合到当前导出程序
/// append the collection to context
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="dataItems"></param>
/// <returns></returns>
ExcelExporter Append<T>(ICollection<T> dataItems) where T : class;
/// <summary>
/// 导出所有的追加数据
/// export excel after append all collectioins
/// </summary>
/// <param name="fileName"></param>
/// <returns></returns>
Task<ExportFileInfo> ExportAppendData(string fileName);
/// <summary>
/// 导出所有的追加数据
/// export excel after append all collectioins
/// </summary>
/// <param name="fileName"></param>
/// <returns></returns>
Task<byte[]> ExportAppendDataAsByteArray();
- 【Excel导出】支持多个实体导出多个Sheet,感谢@ccccccmd 的贡献 #pr52 ,Issue见 #50。使用代码参考,具体见单元测试(ExportMutiCollection_Test):
var exporter = new ExcelExporter();
var list1 = GenFu.GenFu.ListOf<ExportTestDataWithAttrs>();
var list2 = GenFu.GenFu.ListOf<ExportTestDataWithSplitSheet>(30);
var result = exporter.Append(list1).Append(list2).ExportAppendData(filePath);
- 【Nuget】版本更新到2.1.4
- 【Excel导入】支持图片导入,见特性ImportImageFieldAttribute
- 导入为Base64
- 导入到临时目录
- 导入到指定目录
- 【Excel导出】支持图片导出,见特性ExportImageFieldAttribute
- 将文件路径导出为图片
- 将网络路径导出为图片
- 【Nuget】版本更新到2.1.3
- 【Excel导入】修复GUID类型的问题。问题见(dotnetcore#44)。
- 【Nuget】版本更新到2.1.2
- 【导入导出】已支持CSV
- 【文档】完善Pdf导出文档
- 【Nuget】版本更新到2.1.1-beta
- 【导入】Excel导入支持导入标注,仅需设置ExcelImporterAttribute的ImportDescription属性,即会在顶部生成Excel导入说明
- 【重构】添加两个接口
- IExcelExporter:继承自IExporter, IExportFileByTemplate,Excel特有的API将在此补充
- IExcelImporter:继承自IImporter,Excel特有的API在此补充,例如“ImportMultipleSheet”、“ImportSameSheets”
- 【重构】增加实例依赖注入
- 【构建】完成代码覆盖率的DevOps的配置
- 【Nuget】版本更新到2.1.0
- 【导出】PDF导出支持.NET 4.6.1,具体见单元测试
- 【Nuget】版本更新到2.0.2
- 【导入】修复单列导入的Bug,单元测试“OneColumnImporter_Test”。问题见(dotnetcore#35)。
- 【导出】修复导出HTML、Pdf、Word时,模板在某些情况下编译报错的问题。
- 【导入】重写空行检查。
- 【Nuget】版本更新到2.0.0
- 【导出】Excel模板导出修复多个Table渲染以及合并单元格渲染的问题,具体见单元测试“ExportByTemplate_Test1”。问题见(dotnetcore#34)。
- 【导出】完善模板导出的单元测试,针对导出结果添加渲染检查,确保所有单元格均已渲染。
- 【Nuget】版本更新到2.0.0-beta4
- 【导入】支持列筛选器(需实现接口【IImportHeaderFilter】),可用于兼容多语言导入等场景,具体见单元测试【ImportHeaderFilter_Test】
- 【导入】支持传入标注文件路径,不传参则默认同目录"_"后缀保存
- 【导入】完善单元测试【ImportResultFilter_Test】
- 【其他】修改【ValueMappingAttribute】的命名空间为Magicodes.ExporterAndImporter.Core
- 【Nuget】版本更新到2.0.0-beta2
- 【导入】支持导入结果筛选器——IImportResultFilter,可用于多语言场景的错误标注,具体使用见单元测试【ImportResultFilter_Test】
- 【其他】修改IExporterHeaderFilter的命名空间为Magicodes.ExporterAndImporter.Core.Filters
- 【Nuget】版本更新到2.0.0-beta1
- 【导出】完全重构整个导出Excel模块并且重写大部分接口
- 【导出】支持列头筛选器——IExporterHeaderFilter,具体使用见单元测试
- 【导出】修复转换DataTable时支持为空类型
- 【导出】导出Excel支持拆分Sheet,仅需设置特性【ExporterAttribute】的【MaxRowNumberOnASheet】的值,为0则不拆分。具体见单元测试
- 【导出】修复导出结果无法筛选的问题。目前导出即为数据表
- 【导出】添加扩展方法ToExcelExportFileInfo
- 【导出】IExporter再添加两个动态DataTable导出方法,无需定义Dto即可动态导出数据,并且支持表头筛选器、Sheet拆分
/// <summary>
/// 导出Excel
/// </summary>
/// <param name="fileName">文件名称</param>
/// <param name="dataItems">数据</param>
/// <param name="exporterHeaderFilter">表头筛选器</param>
/// <param name="maxRowNumberOnASheet">一个Sheet最大允许的行数,设置了之后将输出多个Sheet</param>
/// <returns>文件</returns>
Task<ExportFileInfo> Export(string fileName, DataTable dataItems, IExporterHeaderFilter exporterHeaderFilter = null, int maxRowNumberOnASheet = 1000000);
/// <summary>
/// 导出Excel
/// </summary>
/// <param name="dataItems">数据</param>
/// <param name="exporterHeaderFilter">表头筛选器</param>
/// <param name="maxRowNumberOnASheet">一个Sheet最大允许的行数,设置了之后将输出多个Sheet</param>
/// <returns>文件二进制数组</returns>
Task<byte[]> ExportAsByteArray(DataTable dataItems, IExporterHeaderFilter exporterHeaderFilter = null, int maxRowNumberOnASheet = 1000000);
- 【Nuget】版本更新到1.4.25
- 【导出】修复没有定义导出特性会报错的情形,具体见单元测试“ExportTestDataWithoutExcelExporter_Test”。问题见(dotnetcore#21)。
- 【Nuget】版本更新到1.4.24
- 【导出】修复日期格式默认导出数字的Bug,默认输出“yyyy-MM-dd”,可以通过设置“[ExporterHeader(DisplayName = "日期2", Format = "yyyy-MM-dd HH:mm:ss")]”来修改。问题见(dotnetcore#22)。
- 【Nuget】版本更新到1.4.21
- 【导出】Excel模板导出修复数据项为Null报错的Bug。
- 【Nuget】版本更新到1.4.20
- 【导出】Excel模板导出性能优化。5000条表格数据1秒内完成,具体见单元测试ExportByTemplate_Large_Test。
- 【Nuget】版本更新到1.4.18
- 【导入】支持导入最大数量限制
- ImporterAttribute支持MaxCount设置,默认为50000
- 完成相关单元测试
- 【Nuget】版本更新到1.4.17
- 【重构】重构IExportFileByTemplate中的ExportByTemplate,将参数htmlTemplate改为template。以便支持Excel模板导出。
- 【导出】支持Excel模板导出并填写相关单元测试,如何使用见教程《Excel模板导出之导出教材订购表》
- 支持单元格单个绑定
- 支持列表
- 【Nuget】版本更新到1.4.16
- 【导入】Excel导入支持多sheet导入,感谢tanyongzheng(dotnetcore#18)
- 【Nuget】版本更新到1.4.15
- 【测试】单元测试添加多框架版本支持 (https://docs.xin-lai.com/2019/12/10/%E6%8A%80%E6%9C%AF%E6%96%87%E6%A1%A3/Magicodes.IE%E7%BC%96%E5%86%99%E5%A4%9A%E6%A1%86%E6%9E%B6%E7%89%88%E6%9C%AC%E6%94%AF%E6%8C%81%E5%92%8C%E6%89%A7%E8%A1%8C%E5%8D%95%E5%85%83%E6%B5%8B%E8%AF%95/)
- 【修复】修复部分.NET Framework 461下的问题
- 【Nuget】版本更新到1.4.14
- 【重构】大量重构
- 移除部分未使用的代码
- 将TemplateFileInfo重命名为ExportFileInfo
- 将IExporterByTemplate接口拆分为4个接口:IExportListFileByTemplate, IExportListStringByTemplate, IExportStringByTemplate, IExportFileByTemplate,并修改相关实现
- 重构ImportHelper部分代码
- 【导入】修复导入Excel时表头设置的问题,已对此编写单元测试,见【产品信息导入】
- 【完善】编写ExportAsByteArray对于DataTable的单元测试,ExportWordFileByTemplate_Test
- 【Nuget】版本更新到1.4.13
- 【导出】Pdf导出支持特性配置,详见单元测试【导出竖向排版收据】。目前主要支持以下设置:
- Orientation:排版方向(横排、竖排)
- PaperKind:纸张类型,默认A4
- IsEnablePagesCount:是否启用分页数
- Encoding:编码设置,默认UTF8
- IsWriteHtml:是否输出HTML模板,如果启用,则会输出.html后缀的对应的HTML文件,方便调错
- HeaderSettings:头部设置,通常可以设置头部的分页内容和信息
- FooterSettings:底部设置
- 【Nuget】版本更新到1.4.12
- 【导出】导出动态类支持超过100W数据时自动拆分Sheet(具体见PR:dotnetcore#14)
- 【Nuget】版本更新到1.4.11
- 【导出】修复Datatable列的顺序和DTO的顺序不一致,导致数据放错列(具体见PR:dotnetcore#13)
- 【Nuget】版本更新到1.4.10
- 【导出】修复Pdf导出在多线程下的问题
- 【Nuget】版本更新到1.4.5
- 【导出】修复导出Pdf在某些情况下可能会导致内存报错的问题
- 【导出】添加批量导出收据单元测试示例,并添加大量数据样本进行测试
- 【Nuget】版本更新到1.4.4
- 【导入】修复枚举类型的问题,并编写单元测试
- 【导入】增加值映射,支持通过“ValueMappingAttribute”特性设置值映射关系。用于生成导入模板的数据验证约束以及进行数据转换。
- 【导入】优化枚举和Bool类型的导入数据验证项的生成,以便于模板生成和数据转换
- 枚举默认情况下会自动获取枚举的描述、显示名、名称和值生成数据项
- bool类型默认会生成“是”和“否”的数据项
- 如果已设置自定义值映射,则不会生成默认选项
- 【导入】支持枚举可为空类型
- 【Nuget】版本更新到1.4.0
- 【导出】Excel导出支持动态列导出(基于DataTable),感谢张善友(dotnetcore#8 )
- 【Nuget】版本更新到1.3.7
- 【导入】修复忽略列的验证问题
- 【导入】修正验证错误信息,一行仅允许存在一条数据
- 【导入】修复忽略列在某些情况下可能引发的异常
- 【导入】添加存在忽略列的导入情形下的单元测试
- 【Nuget】版本更新到1.3.4
- 【导入】支持设置忽略列,以便于在Dto定义数据列做处理或映射
- 【优化】优化.NET标准库2.1下集合转DataTable的性能
- 【重构】多处IList修改为ICollection
- 【完善】补充部分单元测试
- 【重构】重构HTML、PDF导出等逻辑,并修改IExporterByTemplate为:
- Task ExportListByTemplate(IList dataItems, string htmlTemplate = null) where T : class;
- Task ExportByTemplate(T data, string htmlTemplate = null) where T : class;
- 【示例】添加收据导出的单元测试示例
- 【导出】修改默认的导出HTML、Word、Pdf模板
- 【导入】添加截断行的单元测试,以测试中间空格和结尾空格
- 【导入】将【数据错误检测】和【导入】单元测试的Dto分开,确保全部单元测试通过
- 【文档】更新文档
- 【导出】支持导出Word、Pdf、HTML,支持自定义导出模板
- 【导出】添加相关导出的单元测试
- 【导入】支持重复验证,需设置ImporterHeader特性的IsAllowRepeat为false
- 【导入】支持截止列设置,如未设置则默认遇到空格截止
- 【导入】导入支持通过特性设置Sheet名称
- 【导入】重构导入模块
- 【导入】统一导入错误消息
- Exception :导入异常信息
- RowErrors : 数据错误信息
- TemplateErrors :模板错误信息,支持错误分级
- HasError : 是否存在错误(仅当出现异常并且错误等级为Error时返回true)
- 【导入】基础类型必填自动识别,比如int、double等不可为空类型自动识别,无需额外设置Required
- 【导入】修改Excel模板的Sheet名称
- 【导入】支持导入表头位置设置,默认为1
- 【导入】支持列乱序(导入模板的列序号不再需要固定)
- 【导入】支持列索引设置
- 【导入】支持将导入的Excel进行错误标注,支持多个错误
- 【导入】加强对基础类型和可为空类型的支持
- 【EPPlus】由于EPPlus.Core已经不维护,将EPPlus的包从EPPlus.Core改为EPPlus,
- 【导入】导入支持自动去除前后空格,默认启用,可以针对列进行关闭,具体见AutoTrim设置
- 【导入】导入Dto的字段允许不设置ImporterHeader,支持通过DisplayAttribute特性获取列名
- 【导入】导入的Excel移除对Sheet名称的约束,默认获取第一个Sheet
- 【导入】导入增加对中间空格的处理支持,需设置FixAllSpace
- 【导入】导入完善对日期类型的支持
- 【导入】完善导入的单元测试
This project exists thanks to all the people who contribute. [Contribute].
Become a financial contributor and help us sustain our community. [Contribute]
Support this project with your organization. Your logo will show up here with a link to your website. [Contribute]