关于Magicodes.IE

导入导出通用库,通过导入导出DTO模型来控制导入和导出,支持Excel、Word、Pdf和Html。

GitHub地址:https://github.com/xin-lai/Magicodes.IE

特点

  • 需配合相关导入导出的DTO模型使用,支持通过DTO以及相关特性控制导入导出。配置特性即可控制相关逻辑和显示结果,无需修改逻辑代码;

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

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

  • 导入支持中间空行自动跳过;

  • 导入支持自动根据 DTO 生成导入模板,针对必填项将自动标注;

  • 导入支持数据下拉选择,目前仅支持枚举类型;

  • 导入数据支持前后空格以及中间空格处理,允许指定列进行设置;

  • 导入支持模板自动检查,数据自动校验,异常统一处理,并提供统一的错误封装,包含异常、模板错误和行数据错误;

  • 支持导入表头位置设置,默认为1;

  • 支持导入列乱序,无需按顺序一一对应;

  • 支持导入指定列索引,默认自动识别;

  • 支持将导入Excel进行错误标注;

  • 导入支持截止列设置,如未设置则默认遇到空格截止;

  • 支持导出HTML、Word、Pdf,支持自定义导出模板;

    • 导出HTML

  • 导出Word

  • 导出Pdf

  • 导入支持重复验证;

相关官方Nuget包

联系我们

订阅号

关注“麦扣聊技术”订阅号可以获得最新文章、教程、文档:

QQ群
  • 编程交流群<85318032>

  • 产品交流群<897857351>

文档官网&官方博客
  • 文档官网:https://docs.xin-lai.com/

  • 博客:http://www.cnblogs.com/codelove/

其他开源库
  • https://github.com/xin-lai

  • https://gitee.com/magicodes

VNext

  • 生成导入模板时必填项支持自定义样式配置

  • CSV支持

  • 导入结果支持生成HTML输出

更新历史

2019.9.28

  • 【导出】修改默认的导出HTML、Word、Pdf模板

  • 【导入】添加截断行的单元测试,以测试中间空格和结尾空格

  • 【导入】将【数据错误检测】和【导入】单元测试的Dto分开,确保全部单元测试通过

  • 【文档】更新文档

2019.9.26

  • 【导出】支持导出Word、Pdf、HTML,支持自定义导出模板

  • 【导出】添加相关导出的单元测试

  • 【导入】支持重复验证,需设置ImporterHeader特性的IsAllowRepeat为false

2019.9.19

  • 【导入】支持截止列设置,如未设置则默认遇到空格截止

  • 【导入】导入支持通过特性设置Sheet名称

2019.9.18

  • 【导入】重构导入模块

  • 【导入】统一导入错误消息

    • Exception :导入异常信息

    • RowErrors :数据错误信息

    • TemplateErrors :模板错误信息,支持错误分级

    • HasError : 是否存在错误(仅当出现异常并且错误等级为Error时返回true)

  • 【导入】基础类型必填自动识别,比如int、double等不可为空类型自动识别,无需额外设置Required

  • 【导入】修改Excel模板的Sheet名称

  • 【导入】支持导入表头位置设置,默认为1

  • 【导入】支持列乱序(导入模板的列序号不再需要固定)

  • 【导入】支持列索引设置

  • 【导入】支持将导入的Excel进行错误标注,支持多个错误

  • 【导入】加强对基础类型和可为空类型的支持

  • 【EPPlus】由于EPPlus.Core已经不维护,将EPPlus的包从EPPlus.Core改为EPPlus,

2019.9.11

  • 【导入】导入支持自动去除前后空格,默认启用,可以针对列进行关闭,具体见AutoTrim设置

  • 【导入】导入Dto的字段允许不设置ImporterHeader,支持通过DisplayAttribute特性获取列名

  • 【导入】导入的Excel移除对Sheet名称的约束,默认获取第一个Sheet

  • 【导入】导入增加对中间空格的处理支持,需设置FixAllSpace

  • 【导入】导入完善对日期类型的支持

  • 【导入】完善导入的单元测试

导出 Demo

Demo1-1

普通导出

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

特性导出

[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打发打发士大夫的"},});

Demo1-3

列头处理或者多语言支持

[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打发打发士大夫的"},});

导入 Demo

导入特性(ImporterAttribute):

  • HeaderRowIndex:表头位置

导入列头特性(ImporterHeader):

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

  • Description:表头添加注释。

  • Author:注释作者,默认值为“麦扣”。

  • AutoTrim:自动过滤空格,默认启用。

  • FixAllSpace:处理掉所有的空格,包括中间空格。默认false。

  • ColumnIndex:列索引,一般不建议设置。

导入结果(ImportResult):

  • Data:IList<T> 导入的数据集合。

  • RowErrors:IList 数据行错误。

  • HasError:bool 是否存在导入错误。

  • Exception:异常信息

  • TemplateErrors:模板错误信息


Demo2-1 普通模板

生成模板

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; }}    
导入模板

Demo2-2 多数据类型

生成模板

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
}
导入模板


Demo2-3 数据验证

生成模板

必填项表头文本为红色

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
}
导入模板

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

Magicodes.IE已支持导出Word、Pdf和Html相关推荐

  1. Magicodes.Pay已支持Volo Abp

    Magicodes.Pay已支持Volo Abp 简介 Magicodes.Pay希望打造一个统一支付库,相关库均使用.NET标准库编写,支持.NET Framework以及.NET Core.目前已 ...

  2. Magicodes.SwaggerUI 已支持.NET Core 3.1

    Magicodes.SwaggerUI  通过配置文件简单配置即可快速完成SwaggerUI的配置,包括: SwaggerUI的文档信息 API分组 API隐藏 API JSON生成(枚举.API架构 ...

  3. FreeMarker导出WORD/PDF,特殊字符处理

    需要读取内容中,含有特殊字符,如:< > @ ! $ & 等等,可直接在模板中使用 <![CDATA[  ]]> 和 ?html 处理.即,word: <w:p ...

  4. POI-TL导出Word文档(支持WPS查看)

    需求:公司原来已有导出word,实现方式是poi:实现复杂且不支持wps,现要求支持wps查看. poi导出excel比较方便 导出word文档使用POI-TL poi-tl是一种 "log ...

  5. python xmind转excel 知乎_XMind: ZEN 重磅更新!新增导出Word/Excel,自定义快捷键和其他...

    重磅! XMind: ZEN 升级了! 自 XMind: ZEN 上线以来,我们收到了很多很棒的建议.在过去几个月里,我们不断优化和升级,终于迎来了这次大版本更新: 1.更多导入导出选项,优化工作流 ...

  6. mac如何把html转成word,Mac ---- markdown 转 html\word\pdf

    在Mac上,有一个软件,叫iA writer,是一个文字编辑器,可以进行md到word的转换,但它是收费的,RMB68元. 如果只是临时用一下,不想购买,你可以使用pandoc. 在mac下,使用方法 ...

  7. 基于公司需求的探索vue导出word、xls、pdf

    技术的应用而生都是基于需求!崇尚技术积累经验! 如何运用开源js库来实现需求,是快速开发的目的!结合自己开发功能的经历来说!使用插件能更好的的解决解决交互的平滑顺畅!由于项目时间限制,只能采用开源的j ...

  8. 通过swagger2markup来实现swagger2 Word/PDF/HTML的导出

    1.前言 通过前面的两篇博客 Spring Boot Security Swagger2整合生成安全的在线REST API文档 SpringMVC也可参考 spring boot REST 通过Swa ...

  9. POI根据模板导出word文件,以及word转PDF,PDF转图片再插入PDF中(防止PDF被修改)

    POI操作word和PDF POI根据模板导出word文件 word转PDF PDF转图片再插入PDF中(防止PDF被修改) POI根据模板导出word文件 一.制作word模版,${xxxx}是一会 ...

最新文章

  1. Android报错:java.lang.IllegalArgumentException: Surface was abandoned
  2. 《Python 学习手册4th》 第四章 介绍Python对象类型
  3. Spring4.X系列之AOP-@AspectJ
  4. SAP LIST 画框的FORM
  5. Android构建流程——篇六
  6. 性能测试: 编写一个 Locust 文件
  7. Party(HDU-3062)
  8. mysql io瓶颈,(续)为什么当磁盘IO成瓶颈之后数据库的性能急剧下降—性能更悲剧篇...
  9. 从盒子到“云”——让用户享受更轻松的应用交付
  10. 如何成为一名合格的算法工程师?我们做了一次技能拆分…
  11. 通过图书编号查询python_基于Python的图书ISBN查询接口调用代码实例
  12. 想转行学IT,到底要不要去培训机构?
  13. C语言学习笔记——(三)静态开辟内存和动态开辟内存
  14. 【API】开源免费接口管理
  15. 基于C语言的8深度灰度BMP文件读写
  16. hive2.3.2+mysql5.7.21驱动包_2018-08-30期 Hive外部元数据库配置
  17. 蒸妙熏蒸,让脚部保养通经络
  18. 总结几个查找论文网址
  19. 解决document.form.submit()对象不支持此属性或方法
  20. ITX-3568JQ四核ITX工业级主板

热门文章

  1. java input回车,用java怎样编写加减乘除,从键盘输入,例如:1+2按回车得到
  2. 美味奇缘_轻松访问和管理您的美味书签
  3. web 后台返回json格式数据的方式(status 406)
  4. Vim的新一代补全插件:coc.nvim
  5. 神经网络- receptive field
  6. 2018年SIAF 广州国际工业自动化技术及装备展览会下周隆重开幕
  7. Oracle常用sql语句(一)
  8. “威胁情报”在手,反黑客终于有地图了!
  9. RabbitMQ 处理过慢,原来是一个 SQL 缓存框架导致的 GC 频繁触发
  10. WPF DataGrid 通过自定义表头模拟首行固定