开源导入导出通用库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 ...
 
随机推荐
- Oracle 主键、联合主键的查询与创建
			
--查询某个表是否有唯一主键 select cu.* from user_cons_columns cu, user_constraints au where cu.constraint_name = ...
 - SQL Server检索存储过程的结果集
			
目的:检索过滤执行存储过程的结果集 如下介绍两个常用的方法,但是都需要申明表结构:不知道是否有更简便的方法,如有更好的方法,请不吝赐教. 以系统存储过程sp_who2为例: 方法1:使用临时表 --1 ...
 - $('div','li') 和 $('div , li') 和 $('div  li') 区别
			
$('div','li')是$(子,父),是从父节点里找子,而不是找li外面的div $('div , li')才是找所有的div和li,之间不存在父子关系 $('div li') 是找div里面所有 ...
 - js-DOM中基础选择器的整理
			
DOM中基础选择器的整理 注意:DOM中选择器返回是数组类型的都是伪数组,只能拥有数组的索引以及length,数组的其他方法是不可以使用的! 一:DOM中的选择器 1.getElementById(i ...
 - Hive的安装及配置
			
title: Hive的安装及配置 summary: 关键词:Hive ubuntu 安装和配置 Derby MySQL PostgreSQL 数据库连接 date: 2019-5-19 13:25 ...
 - python 17  内置模块
			
目录 1. 序列化模块 1.1 json 模块 1.2 pickle 模块 2. os 模块 3. sys 模块 4. hashlib 加密.摘要 4.1 加密 4.2 加盐 4.3 文件一致性校验 ...
 - Leetcode之回溯法专题-79. 单词搜索(Word Search)
			
Leetcode之回溯法专题-79. 单词搜索(Word Search) 给定一个二维网格和一个单词,找出该单词是否存在于网格中. 单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元 ...
 - nvm的安装与配置和基本使用(学习总结)
			
nvm是来管理node的一个工具,为了方便使用不同版本的node.js运行环境,我们应该学习如何使用他 nvm安装方式 1.下载nvm,大家可以去github上下载,但因为github的CDN被墙,访 ...
 - Jedis操作Redis--Key操作
			
/** * Key(键) * DEL,DUMP,EXISTS,EXPIRE,EXPIREAT,KEYS,MIGRATE,MOVE,OBJECT,PERSIST,PEXPIRE,PEXPIREAT,PT ...
 - JDK中的Proxy技术实现AOP功能
			
1.需求,用户在执行某个业务方法时我们需要对这个用户进行判断是否具有权限(或者说用户是否登录了)? 例如修改用户信息,我们在update()方法前判断当前用户user是否为null(表示没有权限或者没 ...
 
			
		