1. 程式人生 > >Magicodes.IE已支援匯出Word、Pdf和Html

Magicodes.IE已支援匯出Word、Pdf和Html

關於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