Magicodes.IE已支援匯出Word、Pdf和Html
阿新 • • 發佈:2019-11-05
關於Magicodes.IE
匯入匯出通用庫,通過匯入匯出DTO模型來控制匯入和匯出,支援Excel、Word、Pdf和Html。
GitHub地址:https://github.com/xin-lai/Magicodes.IE
特點
- 需配合相關匯入匯出的DTO模型使用,支援通過DTO以及相關特性控制匯入匯出。配置特性即可控制相關邏輯和顯示結果,無需修改邏輯程式碼;
- 匯出支援列頭自定義處理以便支援多語言等場景;
- 匯出支援文字自定義過濾或處理;
- 匯入支援中間空行自動跳過;
- 匯入支援自動根據 DTO 生成匯入模板,針對必填項將自動標註;
- 匯入支援資料下拉選擇,目前僅支援列舉型別;
- 匯入資料支援前後空格以及中間空格處理,允許指定列進行設定;
- 匯入支援模板自動檢查,資料自動校驗,異常統一處理,並提供統一的錯誤封裝,包含異常、模板錯誤和行資料錯誤;
- 支援匯入表頭位置設定,預設為1;
- 支援匯入列亂序,無需按順序一一對應;
- 支援匯入指定列索引,預設自動識別;
- 支援將匯入Excel進行錯誤標註;
- 匯入支援截止列設定,如未設定則預設遇到空格截止;
- 支援匯出HTML、Word、Pdf,支援自定義匯出模板;
- 匯出HTML
-
- 匯出Word
-
- 匯出Pdf
-
- 匯出收據
- 匯入支援重複驗證;
- 支援單個數據模板匯出,常用於匯出收據、憑據等業務
- 支援動態列匯出(基於DataTable),感謝張善友(https://github.com/xin-lai/Magicodes.IE/pull/8)
相關官方Nuget包
聯絡我們
訂閱號
關注“麥扣聊技術”訂閱號可以獲得最新文章、教程、文件:
QQ群
-
程式設計交流群<85318032>
-
產品交流群<897857351>
文件官網&官方部落格
- 文件官網:https://docs.xin-lai.com/
- 部落格:http://www.cnblogs.com/codelove/
其他開源庫
- https://github.com/xin-lai
- https://gitee.com/magicodes
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 = "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
匯入特性(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(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 }
匯入模板
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 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"]
- 如果是使用Pdf匯出,則需安裝相關字型,如:
# 安裝fontconfig庫,用於Pdf匯出 RUN apt-get update && apt-get install -y fontconfig COPY /simsun.ttc /usr/share/fonts/simsun.ttc
&n