Magicodes.ExporterAndImporter爲心萊團隊封裝的導入導出通用庫,而且仍在跟隨項目不斷地打磨。git
GitHub地址:
github
https://github.com/xin-lai/Magicodes.ExporterAndImporterweb
特色app
相關官方Nuget包
測試
導出 Demo
ui
普通導出
spa
特性導出3d
列頭處理或者多語言支持rest
導入Democode
普通模板
多數據類型
數據驗證
Docker中使用
Dockerfile Demo
封裝導入導出業務,目前僅支持 Excel,有興趣的小夥伴能夠考慮支持 CSV 以及PDF或其餘格式的導出
配置特性便可控制相關邏輯和顯示結果,無需修改邏輯代碼
推薦配合 導入導出DTO 使用
導出支持列頭自定義處理以便支持多語言等場景
導出支持文本自定義過濾或處理
導入支持自動根據導入DTO生成導入模板及模板驗證
導入支持數據驗證邏輯
導入支持數據下拉選擇
導入支持註釋添加
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", } });
[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打發打發士大夫的" }, });
[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打發打發士大夫的" }, });
導入特性(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> 數據驗證錯誤。
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; } }
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 }
必填項表頭文本爲紅色
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 }
# 安裝libgdiplus庫,用於Excel導出 RUN apt-get update && apt-get install -y libgdiplus libc6-dev RUN ln -s /usr/lib/libgdiplus.so /usr/lib/gdiplus.dll
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 80 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"]