導入導出通用庫
Magicodes.ExporterAndImporter為心萊團隊封裝的導入導出通用庫,并且仍在跟随項目不斷地打磨。
GitHub位址:https://github.com/xin-lai/Magicodes.ExporterAndImporter
目錄
特點
相關官方Nuget包
導出 Demo
- 普通導出
- 特性導出
- 列頭處理或者多語言支援
導入Demo
- 普通模闆
- 多資料類型
- 資料驗證
Docker中使用
Dockerfile Demo
- 封裝導入導出業務,目前僅支援 Excel,有興趣的小夥伴可以考慮支援 CSV 以及PDF或其他格式的導出
- 配置特性即可控制相關邏輯和顯示結果,無需修改邏輯代碼
- 推薦配合 導入導出DTO 使用
- 導出支援列頭自定義處理以便支援多語言等場景
- 導出支援文本自定義過濾或處理
- 導入支援自動根據導入DTO生成導入模闆及模闆驗證
- 導入支援資料驗證邏輯
- 導入支援資料下拉選擇
- 導入支援注釋添加
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 = "1",
Name2 = "test",
Name3 = "12",
Name4 = "11",
},
new ExportTestData()
{
Name1 = "1",
Name2 = "test",
Name3 = "12",
Name4 = "11",
}
});
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 =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
[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
導入特性(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(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"]
作者:雪雁
出處:http://www.cnblogs.com/codelove/
溝通管道:程式設計交流群<85318032> 産品交流群<897857351>
如果喜歡作者的文章,請關注【麥扣聊技術】訂閱号以便第一時間獲得最新内容。本文版權歸作者和湖南心萊資訊科技有限公司共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接配接,否則保留追究法律責任的權利。
靜聽鳥語花香,漫賞雲卷雲舒。