开源导入导出通用库Magicodes.ExporterAndImporter发布
导入导出通用库
Magicodes.ExporterAndImporter为心莱团队封装的导入导出通用库,并且仍在跟随项目不断地打磨。
GitHub地址:
https://github.com/xin-lai/Magicodes.ExporterAndImporter
目录
特点
相关官方Nuget包
导出 Demo
普通导出
特性导出
列头处理或者多语言支持
导入Demo
普通模板
多数据类型
数据验证
Docker中使用
Dockerfile Demo
特点
封装导入导出业务,目前仅支持 Excel,有兴趣的小伙伴可以考虑支持 CSV 以及PDF或其他格式的导出
配置特性即可控制相关逻辑和显示结果,无需修改逻辑代码
推荐配合 导入导出DTO 使用
导出支持列头自定义处理以便支持多语言等场景
导出支持文本自定义过滤或处理
导入支持自动根据导入DTO生成导入模板及模板验证
导入支持数据验证逻辑
导入支持数据下拉选择
导入支持注释添加
相关官方Nuget包

导出 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
导入特性(ImporterHeader):
Name:string 表头显示名称(不可为空)。
Description:string 表头添加注释。
Author:string 注释作者,默认值为X.M。
导入结果(ImportModel<T>):
Data:IList<T> 导入的数据集合。
ValidationResults:IList<ValidationResultModel> 数据验证结果。
HasValidTemplate:bool 模板验证是否通过。
数据验证结果(ValidationResultModel):
Index:int 错误数据所在行。
Errors:IDictionary<string, string> 整个Excel错误集合。目前仅支持数据验证错误。
FieldErrors:IDictionary<string, string> 数据验证错误。
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中使用
# 安装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"]
开源导入导出通用库Magicodes.ExporterAndImporter发布的更多相关文章
- ASP.NET 开源导入导出库Magicodes.IE 完成Excel图片导入导出
Magicodes.IE Excel图片导入导出 为了更好的根据实际功能来迭代,从2.2的里程碑规划开始,我们将结合社区的建议和意见来进行迭代,您可以点此链接来提交您的意见和建议: https://g ...
- ASP.NET 开源导入导出库Magicodes.IE 完成Csv导入导出
Magicodes.IE Csv导入导出 说明 本章主要说明如何使用Magicodes.IE.Csv进行Csv导入导出. 主要步骤 1.安装包Magicodes.IE.Csv Install-Pack ...
- ASP.NET 开源导入导出库Magicodes.IE 多Sheet导入教程
多Sheet导入教程 说明 本教程主要说明如何使用Magicodes.IE.Excel完成多个Sheet数据的Excel导入. 要点 多个相同格式的Sheet数据导入 多个不同格式的Sheet数据导入 ...
- 开源导入导出库Magicodes.IE 多sheet导入教程
原文作者:tanyongzheng 多Sheet导入教程 说明 本教程主要说明如何使用Magicodes.IE.Excel完成多个Sheet数据的Excel导入. 要点 多个相同格式的Sheet数据导 ...
- .NET 开源导入导出库 Magicodes.IE 2.5发布
今天我们发布了2.5版本,这当然也离不开大家对Magicodes.IE的支持,今天我也是跟往常一样列举了该版本一些重要的更新内容. 当然也要说一下,在这个版本中我们设计了全新的LOGO Excel导出 ...
- Magicodes.IE 2.3重磅发布——.NET Core开源导入导出库
在2.3这一版本的更新中,我们迎来了众多的使用者.贡献者,在这个里程碑中我们也添加并修复了一些功能.对于新特点的功能我将在下面进行详细的描述,当然也欢迎更多的人可以加入进来,再或者也很期待大家来提is ...
- .NET Core开源导入导出库 Magicodes.IE 2.3发布
在2.3这一版本的更新中,我们迎来了众多的使用者.贡献者,在这个里程碑中我们也添加并修复了一些功能.对于新特点的功能我将在下面进行详细的描述,当然也欢迎更多的人可以加入进来,再或者也很期待大家来提is ...
- 开源导入导出库Magicodes.IE 导出教程
要点 导出特性 如何导出Excel表头 如何导出数据.如何进行数据的切割.如何使用筛选器 导出特性 ExporterAttribute Name: 名称(当前Sheet 名称) HeaderFontS ...
- ASP.NET 开源导入导出库Magicodes.IE 导出Pdf教程
基础教程之导出Pdf收据 说明 本教程主要说明如何使用Magicodes.IE.Pdf完成Pdf收据导出 要点 导出PDF数据 自定义PDF模板 导出单据 如何批量导出单据 导出特性 PdfExpor ...
随机推荐
- 吉特日化MES-电子批记录普通样本
在实施吉特日化配料系统的时候,客户希望一键式生成生产过程电子批记录,由于功能的缺失以及部分设备的数据暂时还无法完全采集到,先做一个普通样本的电子批记录格式打印. 电子批记录包含如下几个部分: 1. ...
- springcloud(九):熔断器Hystrix和Feign的全套应用案例(二)
一.. 创建Eureka-Server 服务中心项目 1. 创建Eureka-Server 服务中心项目架构如下 2. pom.xml <dependencies> <depende ...
- GIT和SVN教程
各种版本控制工具的简单比较 特性 CVS SVN GIT 并发修改 支持 支持 支持 并发提交 不支持 支持 支持 历史轨迹 不支持更名 支持更名 支持更名 分布式 不支持 不支持 支持 SVN SV ...
- Visual Studio 中 Build、Rebuild 、 Clean 之间的区别是什么?
今天翻看c-sharpcorner技术网站看到了这样一篇小记,标题为:What Is The Difference Between Build, Rebuild And Clean In Visual ...
- HDU 6319
题意略. 思路:倒着使用单调队列,大的放在前,小的放在后. 详见代码: #include<bits/stdc++.h> using namespace std; typedef long ...
- Leetcode之二分法专题-240. 搜索二维矩阵 II(Search a 2D Matrix II)
Leetcode之二分法专题-240. 搜索二维矩阵 II(Search a 2D Matrix II) 编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target.该矩阵 ...
- [Python] 通过采集两万条数据,对《无名之辈》影评分析
一.说明 本文主要讲述采集猫眼电影用户评论进行分析,相关爬虫采集程序可以爬取多个电影评论. 运行环境:Win10/Python3.5. 分析工具:jieba.wordcloud.pyecharts.m ...
- [Python] 数据结构--实现顺序表、链表、栈和队列
说明: 本文主要展示Python实现的几种常用数据结构:顺序表.链表.栈和队列. 附有实现代码. 来源主要参考网络文章. 一.顺序表 1.顺序表的结构 一个顺序表的完整信息包括两部分,一部分是表中元素 ...
- css3的@media
都知道bootstrap响应式布局很酷,但是是怎么实现的呢?其官网首页有提到这一切的功劳都是来自于CSS 媒体查询(Media Query). 使用 @media 查询,你可以针对不同的媒体类型定义不 ...
- 原型工具介绍———墨刀以及Axure RP比较
原型工具——墨刀以及Axure的比较 1759233 目录 一.了解背景... 1 二.下面分开介绍一下这两款工具... 1 2.1 Axure RP. 1 2.2墨刀... 6 三.比较... 8 ...
