Magicodes.IE已支持通过模板导出票据

本次更新如下:

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

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

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

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

640?wx_fmt=png

Magicodes.IE简介

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

特点

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

640?wx_fmt=png

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

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

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

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

640?wx_fmt=png 

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

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

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

640?wx_fmt=png

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

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

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

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

640?wx_fmt=png

640?wx_fmt=png

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

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

    • 导出HTML 

640?wx_fmt=png

  • 导出Word

640?wx_fmt=png

  • 导出Pdf 

640?wx_fmt=png

  • 导出收据 

640?wx_fmt=png

导入支持重复验证; 

640?wx_fmt=png

  • 支持单个数据模板导出,常用于导出收据、凭据等业务

相关官方Nuget包

640?wx_fmt=png

联系我们

订阅号

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

640?wx_fmt=jpeg

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

普通导出 

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

Demo1-3

列头处理或者多语言支持 

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

导入 Demo

导入特性(ImporterAttribute):

  • HeaderRowIndex:表头位置

导入列头特性(ImporterHeader):

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

  • Description:表头添加注释。

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

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

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

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

导入结果(ImportResult):

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

  • RowErrors:IList 数据行错误。

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

  • Exception:异常信息

  • TemplateErrors:模板错误信息


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

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

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

相关文章

complementary prior

Complementary Prior 解决了多层网络中层间参数W无法计算的问题。 多层有向网络如下图&#xff0c;如果计算 W&#xff0c;我们需要知道第一个隐层的后验概率&#xff0c;那么会遇到几个问题&#xff1a;多层sigmoid网络1&#xff09;后验概率几乎不可计算&#xff0c;因为所谓…

Memcached

本文来自 58沈剑&#xff1a;https://mp.weixin.qq.com/s/zh9fq_e2BgdIeR8RKtY6Sg memcache是互联网分层架构中&#xff0c;使用最多的的KV缓存。面试的过程中&#xff0c;memcache相关的问题几乎是必问的&#xff0c;关于memcache的面试提问&#xff0c;你能回答到哪一个层次…

使用FastReport报表工具生成报表PDF文档

在我们开发某个系统的时候&#xff0c;客户总会提出一些特定的报表需求&#xff0c;固定的报表格式符合他们的业务处理需要&#xff0c;也贴合他们的工作场景&#xff0c;因此我们尽可能做出符合他们实际需要的报表&#xff0c;这样我们的系统会得到更好的认同感。本篇随笔介绍…

DXSDK_June10安装错误

今天安装DXSDK_Jun10时&#xff08;下载地址&#xff1a;http://download.microsoft.com/download/A/E/7/AE743F1F-632B-4809-87A9-AA1BB3458E31/DXSDK_Jun10.exe&#xff09;&#xff0c;出现错误Error Code:s1023 错误原因&#xff1a; 计算机上有安装过更新版的Microsoft Vi…

相交链表

1、题目描述 编写一个程序&#xff0c;找到两个单链表相交的起始节点。 如下面的两个链表&#xff1a; 在节点 c1 开始相交。 示例 1&#xff1a; 输入&#xff1a;intersectVal 8, listA [4,1,8,4,5], listB [5,0,1,8,4,5], skipA 2, skipB 3 输出&#xff1a;Refe…

Kullback-Leibler Divergence

本文转自&#xff1a;http://www.cnblogs.com/ywl925/p/3554502.html KL距离&#xff0c;是Kullback-Leibler差异&#xff08;Kullback-Leibler Divergence&#xff09;的简称&#xff0c;也叫做相对熵&#xff08;Relative Entropy&#xff09;。它衡量的是相同事件空间里的两…

Shader 坐标转换

转自&#xff1a;http://www.ownself.org/blog/2010/kong-jian-zuo-biao-zhuan-huan.html 这个比较基础了&#xff0c;不过基础最重要&#xff0c;往往应该理解透彻&#xff0c;并且反复复习。 我们知道在3D画面渲染过程中对于模型的计算的一部分被称为Transforming and Ligh…

致所有.Net者和有梦想的朋友们 - 共勉

这篇文章很早就想写的了&#xff0c;主要是人到了一定的年纪&#xff0c;就想唠叨一些看法&#xff0c;认不认可不重要&#xff0c;重要的是生活给予你的酸甜苦辣&#xff0c;你都想一吐为快。 这里主要基于多年来自己的一个行业感受和以及生活感想&#xff0c;唠叨一下工作以及…

ReLU的起源

论文参考&#xff1a;Deep Sparse Rectifier Neural Networks 网页参考&#xff1a;http://www.mamicode.com/info-detail-873243.html 起源&#xff1a;传统激活函数、脑神经元激活频率研究、稀疏激活性 传统Sigmoid系激活函数 传统神经网络中最常用的两个激活函数&…

Asp.NET Core 轻松学-项目目录和文件作用介绍

前言上一章介绍了 Asp.Net Core 的前世今生&#xff0c;并创建了一个控制台项目编译并运行成功&#xff0c;本章的内容介绍 .NETCore 的各种常用命令、Asp.Net Core MVC 项目文件目录等信息&#xff0c;通过对命令的学习和操作&#xff0c;对项目结构的认识&#xff0c;进一步理…

Dubbo 常见服务治理策略

1、Dubbo体系结构 2、Dubbo容错机制 Dubbo集群容错架构图 各节点关系&#xff1a; 这里的Invoker是Provider的一个可调用Service的抽象&#xff0c;Invoker封装了Provider地址及Service接口信息。Directory代表多个Invoker&#xff0c;可以把它看成List&#xff0c;但与Lis…

IT技术人员的35个特点,你占几个?

作者&#xff1a;zollty&#xff0c;资深程序员和架构师&#xff0c;私底下是个爱折腾的技术极客&#xff0c;架构师社区合伙人&#xff01;1、价值观对生活的一般看法&#xff1a;追求简单&#xff0c;安定&#xff0c;可控制的生活&#xff0c;但对家庭生活的责任持消极态度草…

asp.net core 腾讯验证码的接入

asp.net core 腾讯验证码的接入Intro之前使用的验证码服务是用的极验验证&#xff0c;而且是比较旧的&#xff0c;好久之前接入的&#xff0c;而且验证码服务依赖 Session&#xff0c;有点不太灵活&#xff0c;后来发现腾讯也有验证码服务&#xff0c;而且支持小程序&#xff0…

ffmpeg加环境变量

转自&#xff1a;http://blog.csdn.net/leixiaohua1020/article/details/19016469 FFMPEG是命令行工具&#xff0c;因此使用起来多少还是会有些不方便。在这记录两点方便使用FFMPEG的方法&#xff1a; 1.任何目录下都可以使用FFMPEG 问题描述&#xff1a;需要转码&#xff08;播…

.NET Core 微信公众号小程序6种获取UnionID方法,你知道哪几种?

前言获取UnionID是开发微信公众号/小程序中很有必要的一个环节&#xff0c;特别是针对一个公司拥有多个公众号小程序而推出的机制&#xff0c;实现打通账户一体化&#xff0c;用UnionID来区分多平台的唯一性。官方的解释&#xff1a;如果开发者拥有多个移动应用、网站应用、和公…

.NET LINQ分析AWS ELB日志避免996

前言小明是个单纯的 .NET开发&#xff0c;一天大哥叫住他&#xff0c;安排了一项任务&#xff1a;“小明&#xff0c;分析一下我们 超牛逼网站上个月的所有 AWS ELB流量日志&#xff0c;这些日志保存在 AWS S3上&#xff0c;你分析下&#xff0c;看哪个 API的响应时间中位数最长…

网络摄像头实时获取信息

转自&#xff1a;http://blog.csdn.net/yong_hen/article/details/42460387#quote 转自&#xff1a;http://blog.csdn.net/leo2007608/article/details/9885219 代码&#xff1a; openCV版本&#xff1a;2.4.10. 平台&#xff1a;win7 [cpp] view plaincopy #include <op…

[ASP.NET Core 3框架揭秘] 依赖注入:依赖注入模式

IoC主要体现了这样一种设计思想&#xff1a;通过将一组通用流程的控制权从应用转移到框架之中以实现对流程的复用&#xff0c;并按照“好莱坞法则”实现应用程序的代码与框架之间的交互。我们可以采用若干设计模式以不同的方式实现IoC&#xff0c;比如我们在前面介绍的模板方法…

微软100题第5题

转载自&#xff1a;http://blog.csdn.net/littlestream9527/article/details/8104731 http://blog.csdn.net/v_july_v/article/details/6370650 http://blog.csdn.net/insistgogo/article/details/7689297 下面&#xff0c;我试图用最清晰易懂&#xff0c;最易令人理解的思维…

北京Dotnet分享会 || 精英论坛第三期

编者按&#xff1a;没有一成不变的定律&#xff0c;没有长久不衰的流行&#xff0c;更没有一劳永逸的侥幸&#xff0c;只有自己刻苦努力、脚踏实地、兢兢业业的学习和工作&#xff0c;才会成为这个社会永远不会被淘汰的中流砥柱。一、昨夜西风凋碧树昨夜西风凋碧树&#xff0c;…