本次更新如下:

  • 【重构】重构HTML、PDF导出等逻辑,并修改IExporterByTemplate为:

    • Task ExportListByTemplate(IList dataItems, string htmlTemplate = null) where T : class;

    • Task ExportByTemplate(T data, string htmlTemplate = null) where T : class;

  • 【示例】添加收据导出的单元测试示例

Magicodes.IE简介

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

特点

  • 需配合相关导入导出的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.10.12

  • 【重构】重构HTML、PDF导出等逻辑,并修改IExporterByTemplate为:

    • Task ExportListByTemplate(IList dataItems, string htmlTemplate = null) where T : class;

    • Task ExportByTemplate(T data, string htmlTemplate = null) where T : class;

  • 【示例】添加收据导出的单元测试示例

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已支持通过模板导出票据相关推荐

  1. Magicodes.Pay已支持Volo Abp

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

  2. Magicodes.IE已支持导出Word、Pdf和Html

    关于Magicodes.IE 导入导出通用库,通过导入导出DTO模型来控制导入和导出,支持Excel.Word.Pdf和Html. GitHub地址:https://github.com/xin-la ...

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

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

  4. Excel模板导出之动态导出

    说明 目前Magicodes.IE已支持Excel模板导出时使用JObject.Dictionary和ExpandoObject来进行动态导出,具体使用请看本篇教程. 本功能的想法.部分实现初步源于a ...

  5. Magicodes.IE之Excel模板导出教材订购表

    说明 本教程主要说明如果使用Magicodes.IE.Excel完成教材订购表的Excel模板导出. 要点 本教程使用Magicodes.IE.Excel来完成Excel模板导出 需要通过创建Dto来 ...

  6. ie如何导入html文件类型,Magicodes.IE: 导入导出通用库,支持Dto导入导出以及动态导出,支持Excel、Word、Pdf和Html。...

    Magicodes.IE 导入导出通用库,支持Dto导入导出以及动态导出,支持Excel.Word.Pdf和Html. 疯狂的徽章 GitHub Azure DevOps Build Status: ...

  7. Excel模板导出之导出教材订购表

    说明 本教程主要说明如果使用Magicodes.IE.Excel完成教材订购表的Excel模板导出. 要点 本教程使用Magicodes.IE.Excel来完成Excel模板导出 需要通过创建Dto来 ...

  8. ​WeihanLi.Npoi 根据模板导出Excel

    WeihanLi.Npoi 根据模板导出Excel Intro 原来的导出方式比较适用于比较简单的导出,每一条数据在一行,数据列虽然自定义程度比较高,如果要一条数据对应多行就做不到了,于是就想支持根据 ...

  9. easypoi按模板导出word不支持列循环迭代问题

    使用java按模板导出word,有很多方案,比如freemarker,jacob,openoffice,aspose(非开源收费,需破解版)apache poi等,其中比较常用的是freemarker ...

  10. java 根据已有word模板进行数据下载导出

    将已有word模板转化为freemarker模板进行数据导出 一 将现有wrod模板中的数据进行调整并另存为xml格式文件 java 代码编写 一 将现有wrod模板中的数据进行调整并另存为xml格式 ...

最新文章

  1. Linux中mmap与munmap函数系统调用
  2. mysql不同服务器数据库查询_不同服务器不同数据库两张表连接查询使用经验
  3. 疯狂的java 目录_疯狂创客圈 JAVA 高并发 总目录
  4. 建设网站需要的Bootstrap介绍与操作
  5. python现在时间 命令_Python3 - 时间处理与定时任务
  6. web系统之猜数游戏——项目总结
  7. HAWQ取代传统数仓实践(一)——为什么选择HAWQ
  8. 2.1 软件开发生命周期模型
  9. c语言中特殊符号怎么定义,C语言特殊符号意义
  10. 计算机第四章文字处理软件应用课后答案,计算机应用基础第四章文字处理软件.doc...
  11. 自监督论文阅读笔记 Urban feature analysis from aerial remote sensing imagery using self-supervised and semi-s
  12. 海尔简爱S15电脑使用U盘来重新安装Win10系统教学
  13. 印象笔记Mac版的快捷键有哪些?
  14. PAT 1063 计算谱半径
  15. 初二年级估算要不要用计算机,期中备考:人教版1-6年级上册数学知识要点,抓紧为孩子收藏!...
  16. NOTA-PEG-Lys/CS/HRP/MMPs大环配体-聚乙二醇-溶菌酶/硫酸软骨素/辣根过氧化氢酶/基质金属蛋白酶
  17. 基于GC - MS的代谢组学研究揭示:SD大鼠和Wistar大鼠之间存在系统的代谢差异及乙醇灌胃反应差异
  18. 深入理解pdf.js,PDFObject, iframe 三种方式来打开PDF文件的区别
  19. 树莓派+花生壳+移动硬盘搭建下载机
  20. IIC(2402)实验

热门文章

  1. linux服务器弱密码检查,linux系统弱密码检测
  2. Vue+elementUI下拉框自定义颜色选择器
  3. Maven 使用本地Tomcat9 一键启动和热部署
  4. 使用Kali Linux Metasploit 复现 word宏
  5. 无源滤波器和有源滤波器有什么区别?-道合顺大数据infinigo
  6. 傅里叶分析原理——非常好的一篇讲解文章
  7. SSIM公式:结构相似性计算原理,基于SSIM的图像质量评价
  8. cad2019菜单栏怎么调出来_AutoCAD2019怎么把工具栏放左右两边两侧工具栏调出来
  9. 回归算法--K近邻算法
  10. Dijkstra算法结合时间窗规划无冲突路径