Magicodes.IE已支持导出Word、Pdf和Html
关于Magicodes.IE
导入导出通用库,通过导入导出DTO模型来控制导入和导出,支持Excel、Word、Pdf和Html。
GitHub地址:https://github.com/xin-lai/Magicodes.IE
特点
- 需配合相关导入导出的DTO模型使用,支持通过DTO以及相关特性控制导入导出。配置特性即可控制相关逻辑和显示结果,无需修改逻辑代码;
- 导出支持列头自定义处理以便支持多语言等场景;
- 导出支持文本自定义过滤或处理;
- 导入支持中间空行自动跳过;
- 导入支持自动根据 DTO 生成导入模板,针对必填项将自动标注;
- 导入支持数据下拉选择,目前仅支持枚举类型;
- 导入数据支持前后空格以及中间空格处理,允许指定列进行设置;
- 导入支持模板自动检查,数据自动校验,异常统一处理,并提供统一的错误封装,包含异常、模板错误和行数据错误;
- 支持导入表头位置设置,默认为1;
- 支持导入列乱序,无需按顺序一一对应;
- 支持导入指定列索引,默认自动识别;
- 支持将导入Excel进行错误标注;
- 导入支持截止列设置,如未设置则默认遇到空格截止;
- 支持导出HTML、Word、Pdf,支持自定义导出模板;
- 导出HTML
- 导出HTML
- 导出Word
- 导出Word
- 导出Pdf
- 导出Pdf
- 导出收据
- 导出收据
- 导入支持重复验证;
- 支持单个数据模板导出,常用于导出收据、凭据等业务
- 支持动态列导出(基于DataTable),感谢张善友(https://github.com/xin-lai/Magicodes.IE/pull/8)
相关官方Nuget包
联系我们
订阅号
关注“麦扣聊技术”订阅号可以获得最新文章、教程、文档:
QQ群
编程交流群<85318032>
产品交流群<897857351>
文档官网&官方博客
其他开源库
VNext
- 生成导入模板时必填项支持自定义样式配置
- CSV支持
- 导入结果支持生成HTML输出
更新历史
2019.10.30
- 【Nuget】版本更新到1.4.0
- 【导出】Excel导出支持动态列导出(基于DataTable),感谢张善友(https://github.com/xin-lai/Magicodes.IE/pull/8)
2019.10.22
- 【Nuget】版本更新到1.3.7
- 【导入】修复忽略列的验证问题
- 【导入】修正验证错误信息,一行仅允许存在一条数据
- 【导入】修复忽略列在某些情况下可能引发的异常
- 【导入】添加存在忽略列的导入情形下的单元测试
2019.10.21
- 【Nuget】版本更新到1.3.4
- 【导入】支持设置忽略列,以便于在Dto定义数据列做处理或映射
2019.10.18
- 【优化】优化.NET标准库2.1下集合转DataTable的性能
- 【重构】多处IList修改为ICollection
- 【完善】补充部分单元测试
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 = "",
Name2 = "test",
Name3 = "",
Name4 = "",
},
new ExportTestData()
{
Name1 = "",
Name2 = "test",
Name3 = "",
Name4 = "",
}
});
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 =,
Text2 = "w萨达萨达萨达撒",
Text3 = "sadsad打发打发士大夫的"
},
new ExportTestDataWithAttrs()
{
Text = "啊实打实大苏打撒",
Name="啊实打实大苏打撒",
Number =,
Text2 = "w萨达萨达萨达撒",
Text3 = "sadsad打发打发士大夫的"
},
new ExportTestDataWithAttrs()
{
Text = "啊实打实速度大苏打撒",
Name="萨达萨达",
Number =,
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 =,
Text2 = "w萨达萨达萨达撒",
Text3 = "sadsad打发打发士大夫的"
},
new AttrsLocalizationTestData()
{
Text = "啊实打实大苏打撒",
Name="啊实打实大苏打撒",
Number =,
Text2 = "w萨达萨达萨达撒",
Text3 = "sadsad打发打发士大夫的"
},
new AttrsLocalizationTestData()
{
Text = "啊实打实速度大苏打撒",
Name="萨达萨达",
Number =,
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(,ErrorMessage = "产品代码最大长度为8")]
public string Code { get; set; }
/// <summary>
/// 产品条码
/// </summary>
[ImporterHeader(Name = "产品条码")]
[MaxLength(, 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中使用
- 如果是使用Excel导出,则需安装libgdiplus库
# 安装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 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"]
- 如果是使用Pdf导出,则需安装相关字体,如:
# 安装fontconfig库,用于Pdf导出
RUN apt-get update && apt-get install -y fontconfig
COPY /simsun.ttc /usr/share/fonts/simsun.ttc
Magicodes.IE已支持导出Word、Pdf和Html的更多相关文章
- Magicodes.Pay已支持Volo Abp
Magicodes.Pay已支持Volo Abp 简介 Magicodes.Pay希望打造一个统一支付库,相关库均使用.NET标准库编写,支持.NET Framework以及.NET Core.目前已 ...
- Magicodes.SwaggerUI 已支持.NET Core 3.1
Magicodes.SwaggerUI 通过配置文件简单配置即可快速完成SwaggerUI的配置,包括: SwaggerUI的文档信息 API分组 API隐藏 API JSON生成(枚举.API架构I ...
- swagger2 导出离线Word/PDF/HTML文档
swagger2离线导出Word/PDF/HTML文档 1.前言 通过前面的两篇博客 我们已经介绍了如何使用spring boot整合swagger2 生成在线的API文档. 但是某些情况下,我们需要 ...
- 简单介绍aspose-words-18.10-jdk16做导出word
今天在搞那个用aspose words for java做导出word的功能,顺便简单介绍这个怎么用,我有两个版本的破解版,就都做简单介绍怎么用 警告:请勿用于商业用途,仅供学习研究使用,如有任何版权 ...
- Studio for Winforms FlexGrid:导出到 PDF 文件
本篇文章主要介绍如何导出 FlexGrid 到 PDF 格式文件.本文源于论坛用户,有多个用户提出如何把 FlexGrid 导出到 PDF 文件的需求.在这里共享给大家. 当前,ComponentOn ...
- C#通过模板导出Word的两种方法(超简单)
方法一:使用Office的组件 使用该方法必须要安装Office 1.制作Word模板 在需要填充内容的地方增加标识符号,方便之后替换使用,例如 [项目名称],其中[]符号和中间的文字可根据个人情况进 ...
- 通用的web系统数据导出功能设计实现(导出excel2003/2007 word pdf zip等)
前言 我们在做web系统中,导出也是很常用的一个功能,如果每一个数据列表都要对应写一个导出的方法不太现实.现在就想设计一个共通的功能来实现这个导出. 需求分析 在开始之前我们先要明白我们要实现怎样一个 ...
- web系统数据导出功能设计实现(导出excel2003/2007 word pdf zip等)
web系统数据导出功能设计实现(导出excel2003/2007 word pdf zip等) 前言 我们在做web系统中,导出也是很常用的一个功能,如果每一个数据列表都要对应写一个导出的方法不太现实 ...
- Java使用IText(VM模版)导出PDF,IText导出word(二)
===============action=========================== //退款导出word public void exportWordTk() throws IOE ...
随机推荐
- for for in 给已有的li绑定click事件生成新的li也有click事件
想要给已有的li元素绑定一个click事件,点击生成新的li元素,并且新的li元素也要有click事件 //不能用for循环给每个li绑定click事件 因为这样的话 后面新生成的li就没有click ...
- RecyclerView实现Gallery画廊效果
使用RecyclerView实现一个画廊效果,主要是使用support库中最新加入的PagerSnapHelper类,通过计算滑动偏移来计算scale的值. 基本实现 首先需要为RecyclerVie ...
- 国庆佳节第四天,谈谈我月收入增加 4K 的故事
01.起承 在我下定决心改变的这将近 1 年的时间里,遇到了很多很多有故事的人,以及有趣的事.自我的认知改变特别大!尤其是收入,比去年同时期增加了 4K. 4K,可能也就买 100 斤猪肉.但是对于身 ...
- 杭州蓝松科技---短视频SDK介绍
蓝松短视频的口号和 更新周期: 我们的口号是: 蓝松短视频 任意个性化. 我们是杭州蓝松科技, 专业做视频短视频SDK的技术团队. 我们提供 Android/IOS平台上的 短视频编辑SDK, ...
- .netcore+vue+elementUI 前后端分离---支持前端、后台业务代码扩展的快速开发框架
框架采用.NetCore + Vue前后端分离,并且支持前端.后台代码业务动态扩展,框架内置了一套有着20多种属性配置的代码生成器,可灵活配置生成的代码,代码生成器界面配置完成即可生成单表(主表)的增 ...
- 品Spring:对@PostConstruct和@PreDestroy注解的处理方法
在bean的实例化过程中,也会用到一系列的相关注解. 如@PostConstruct和@PreDestroy用来标记初始化和销毁方法. 平常更多的是侧重于应用,很少会有人去了解它背后发生的事情. 今天 ...
- Ng项目安装到指定盘符
全局安装 1.node.js 2.cnpm 3.typeScript 4.ng-cli 指定安装: 1.首先在想要的盘符内新建一个名字 例: D盘中新建一个angualr的文件夹 2.在开始菜单中输入 ...
- mysql基础操作 增删改查
如何使用终端操作数据库 如何登录数据库 mysql -u用户名 -p密码 比如: mysql -uroot -p123456 如何查询数据库服务器中所有的数据库 show databases; 如何选 ...
- 究竟是.NET淹没在汪洋大海,还是人心的浮躁、见识的短浅?
这些年来有相当多的.net开发者转了其他语言,也有一部分是迫不得已因为公司的转型而转,其中也有一大部分觉得.net没前途性能不好比某些语言性能差.还有一部分会说出一些名词去指责.net说他做不到,其实 ...
- [Swoole] 在Ubuntu下安装、快速开始
本文主要讲述在 Ubuntu 下编译安装 Swoole,并根据官方文档给出的demo进行了测试和搬运,包括:TCP服务器.UDP服务器.HTTP服务器.WebSocket服务器.异步客户端.定时器和协 ...