Excel模板匯出之動態匯出

雪雁發表於2021-03-26

說明

目前Magicodes.IE已支援Excel模板匯出時使用JObjectDictionaryExpandoObject來進行動態匯出,具體使用請看本篇教程。

本功能的想法、部分實現初步源於arik的貢獻,這裡再次感謝arik

在開始本篇教程之前,我們重溫一下模板匯出的語法:

  {{Company}}  //單元格渲染
  {{Table>>BookInfos|RowNo}} //表格渲染開始語法
  {{Remark|>>Table}}//表格渲染結束語法
  {{Image::ImageUrl?Width=50&Height=120&Alt=404}} //圖片渲染
  {{Image::ImageUrl?w=50&h=120&Alt=404}} //圖片渲染
  {{Image::ImageUrl?Alt=404}} //圖片渲染
  {{Formula::AVERAGE?params=G4:G6}}  //公式渲染
  {{Formula::SUM?params=G4:G6&G4}}   //公式渲染

如果您對Magicodes.IE的模板匯出不太瞭解,請閱讀以下教程:

Excel模板匯出之匯出教材訂購表

接下來,我們開始本篇教程:

1.安裝包Magicodes.IE.Excel

Install-Package Magicodes.IE.Excel

2.準備Excel模板檔案

參考如圖:

模板檔案

該檔案可以在測試工程中找到,檔名為【DynamicExportTpl.xlsx】。

3.使用JObject完成動態匯出

程式碼比較簡單,如下所示:

    string json = @"{
      'Company': '雪雁',
      'Address': '湖南長沙',
      'Contact': '雪雁',
      'Tel': '136xxx',
      'BookInfos': [
        {'No':'a1','RowNo':1,'Name':'Docker+Kubernetes應用開發與快速上雲','EditorInChief':'李文強','PublishingHouse':'機械工業出版社','Price':65,'PurchaseQuantity':10000,'Cover':'https://img9.doubanio.com/view/ark_article_cover/retina/public/135025435.jpg?v=1585121965','Remark':'備註'},
        {'No':'a1','RowNo':1,'Name':'Docker+Kubernetes應用開發與快速上雲','EditorInChief':'李文強','PublishingHouse':'機械工業出版社','Price':65,'PurchaseQuantity':10000,'Cover':'https://img9.doubanio.com/view/ark_article_cover/retina/public/135025435.jpg?v=1585121965','Remark':'備註'}
      ]
    }";
    var jobj = JObject.Parse(json);
    //模板路徑
    var tplPath = Path.Combine(Directory.GetCurrentDirectory(), "TestFiles", "ExportTemplates",
        "DynamicExportTpl.xlsx");
    //建立Excel匯出物件
    IExportFileByTemplate exporter = new ExcelExporter();
    //匯出路徑
    var filePath = Path.Combine(Directory.GetCurrentDirectory(), nameof(DynamicExportByTemplate_Test) + ".xlsx");
    if (File.Exists(filePath)) File.Delete(filePath);

    //根據模板匯出
    await exporter.ExportByTemplate(filePath, jobj, tplPath);

上述程式碼大家可以在單元測試DynamicExportWithJObjectByTemplate_Test中找到。

值得注意的是,由於此處使用了JObject物件,因此在使用時需要按裝包Newtonsoft.Json。但是,Magicodes.IE.Excel本身並不依賴Newtonsoft.Json

目前Excel模板動態匯出僅支援通過JObject物件,在後續將支援更多動態方式。

執行後可以看到如下圖所示的結果:

動態匯出結果

4.使用Dictionary<string, object>完成動態匯出

匯出的程式碼和上面是一樣的,只是資料結構使用了Dictionary

var data = new Dictionary<string, object>()
{
    { "Company","雪雁" },
    { "Address", "湖南長沙" },
    { "Contact", "雪雁" },
    { "Tel", "136xxx" },
    { "BookInfos",new List<Dictionary<string,object>>()
        {
            new Dictionary<string, object>()
            {
                {"No","A1" },
                {"RowNo",1 },
                {"Name","Docker+Kubernetes應用開發與快速上雲" },
                {"EditorInChief","李文強" },
                {"PublishingHouse","機械工業出版社" },
                {"Price",65 },
                {"PurchaseQuantity",50000 },
                {"Cover","https://img9.doubanio.com/view/ark_article_cover/retina/public/135025435.jpg?v=1585121965" },
                {"Remark","買起" }
            },
            new Dictionary<string, object>()
            {
                {"No","A2" },
                {"RowNo",2 },
                {"Name","Docker+Kubernetes應用開發與快速上雲" },
                {"EditorInChief","李文強" },
                {"PublishingHouse","機械工業出版社" },
                {"Price",65 },
                {"PurchaseQuantity",50000 },
                {"Cover","https://img9.doubanio.com/view/ark_article_cover/retina/public/135025435.jpg?v=1585121965" },
                {"Remark","k8s真香" }
            }
        }
    }
};
//模板路徑
var tplPath = Path.Combine(Directory.GetCurrentDirectory(), "TestFiles", "ExportTemplates",
    "DynamicExportTpl.xlsx");
//建立Excel匯出物件
IExportFileByTemplate exporter = new ExcelExporter();
//匯出路徑
var filePath = Path.Combine(Directory.GetCurrentDirectory(), nameof(DynamicExportWithDictionaryByTemplate_Test) + ".xlsx");
if (File.Exists(filePath)) File.Delete(filePath);

//根據模板匯出
await exporter.ExportByTemplate(filePath, data, tplPath);

具體程式碼見DynamicExportWithDictionaryByTemplate_Test

5.使用ExpandoObject完成動態匯出

同上,程式碼如下所示:

dynamic data = new ExpandoObject();
data.Company = "雪雁";
data.Address = "湖南長沙";
data.Contact = "雪雁";
data.Tel = "136xxx";
data.BookInfos = new List<ExpandoObject>() { };

dynamic book1 = new ExpandoObject();
book1.No = "A1";
book1.RowNo = 1;
book1.Name = "Docker+Kubernetes應用開發與快速上雲";
book1.EditorInChief = "李文強";
book1.PublishingHouse = "機械工業出版社";
book1.Price = 65;
book1.PurchaseQuantity = 50000;
book1.Cover = "https://img9.doubanio.com/view/ark_article_cover/retina/public/135025435.jpg?v=1585121965";
book1.Remark = "買買買";
data.BookInfos.Add(book1);

dynamic book2 = new ExpandoObject();
book2.No = "A2";
book2.RowNo = 2;
book2.Name = "Docker+Kubernetes應用開發與快速上雲";
book2.EditorInChief = "李文強";
book2.PublishingHouse = "機械工業出版社";
book2.Price = 65;
book2.PurchaseQuantity = 50000;
book2.Cover = "https://img9.doubanio.com/view/ark_article_cover/retina/public/135025435.jpg?v=1585121965";
book2.Remark = "買買買";
data.BookInfos.Add(book2);

//模板路徑
var tplPath = Path.Combine(Directory.GetCurrentDirectory(), "TestFiles", "ExportTemplates",
    "DynamicExportTpl.xlsx");
//建立Excel匯出物件
IExportFileByTemplate exporter = new ExcelExporter();
//匯出路徑
var filePath = Path.Combine(Directory.GetCurrentDirectory(), nameof(DynamicExportWithExpandoObjectByTemplate_Test) + ".xlsx");
if (File.Exists(filePath)) File.Delete(filePath);

//根據模板匯出
await exporter.ExportByTemplate(filePath, data, tplPath);

具體程式碼參考DynamicExportWithExpandoObjectByTemplate_Test

最後

本教程至此就結束了,如有疑問,麻煩大家多多提交Issue。

Magicodes.IE:匯入匯出通用庫,支援Dto匯入匯出、模板匯出、花式匯出以及動態匯出,支援Excel、Csv、Word、Pdf和Html。

相關庫會一直更新,在功能體驗上有可能會和本文教程有細微的出入,請以相關具體程式碼、版本日誌、單元測試示例為準。

相關文章