如何在C#中使用 Excel 動態函數生成依賴列表

前言

在Excel 中,依賴列表或級聯下拉列表表示兩個或多個列表,其中一個列表的項根據另一個列表而變化。依賴列表通常用於Excel的業務報告,例如學術記分卡中的【班級-學生】列表、區域銷售報告中的【區域-國家/地區】列表、人口儀表板中的【年份-區域】列表以及生產摘要報告中的【單位-行-產品】列表等等。

在本博客中,小編將爲大家介紹如何藉助葡萄城公司基於 .NET 和 .NET Core 平臺的服務端高性能表格組件組件GrapeCity Documents for Excel (以下簡稱GcExcel)和動態數組函數 UNIQUE、CHOOSECOLS 和 FILTER 以編程方式創建主列表和依賴下拉列表。

背景需求

下圖是一張某公司的客戶訂單表原始數據:

現在爲了將這些數據按照人名分類進行查閱,小編需要製作兩個下拉列表(客戶姓名和訂單ID),同時需要滿足訂單ID的值是與客戶姓名相關的,然後最下面顯示的是根據訂單ID查詢出來的訂單詳細信息,如下圖所示:

使用GcExcel實現的步驟

步驟 1 - 工作簿初始化

使用 GcExcel API,第一步是初始化 Workbook 的實例。然後,您可以根據業務需求選擇打開現有 Excel 文檔或創建新工作簿。在此博客中,我們將使用帶有 IWorkbook 接口的 API 加載包含客戶訂單歷史記錄的現有 Excel 文檔,如下所示:

Workbook workbook = new Workbook();
workbook.Open("E:\\download\\smartdependentlist\\CustomerOrderHistory.xlsx");

步驟 2 - 獲取工作表

接下來,您需要獲取用於創建所需報告的工作表。使用 GcExcel,可以使用 IWorkbook 界面中的 API 獲取工作表。您也可以選擇創建一個新的工作表。但是,爲了簡化報表中使用的公式,我們將在存儲訂單歷史記錄的同一工作表上創建報表,如下所示:

IWorksheet worksheet;
worksheet = workbook.Worksheets["data"]; //OR workbook.Worksheets[0];

步驟 3 - 獲取客戶名稱的唯一列表(用於主下拉列表)

初始化後,需要獲取要添加到報表中“選擇客戶名稱”部分的主下拉列表的唯一客戶名稱列表。爲此,請選擇工作表中底部有空格的任何單元格以垂直溢出數據;我們使用了單元格T3。接下來,對所需的客戶名稱數據範圍使用 UNIQUE 函數。

使用 GcExcel,可以使用帶有 IWorksheet 接口的 API 獲取單元格或單元格區域,並使用 IRange 接口的 API爲其設置動態公式,如下所示:

IRange rngUniqueCustomerNames;
rngUniqueCustomerNames = worksheet.Range["T3"]; //dummy cell to get unique list of customer names
rngUniqueCustomerNames.Formula2 = "=UNIQUE($B$2:$B$2156)";

執行結果如下:

步驟 4 - 創建主下拉列表

獲得客戶名稱列表後,將其用作使用“列表上的數據驗證”創建的主下拉列表的源。在此博客示例中,此主下拉列表在單元格 L3 中創建。

使用 GcExcel,使用 IRange 接口的 API 在某個範圍內配置數據驗證。使用 IValidation 接口的 API 爲區域添加新的驗證規則實例。選擇 ValidationType.List 列表類型數據驗證選項,並使用 UNIQUE 公式將公式設置爲單元格;這裏是 T3,如下圖所示:

IValidation listValidation = worksheet.Range["L3"].Validation;
listValidation.Add(ValidationType.List, ValidationAlertStyle.Stop, ValidationOperator.Equal,"=$T$3#");

請注意,要獲得動態數組函數的結果範圍,單元格引用後跟一個#請注意,要獲得動態數組函數的結果範圍,單元格引用後跟一個#。

步驟 5 - 獲取唯一 OrderID 列表(用於依賴下拉列表)

準備好主下拉列表後,讓我們獲取在主下拉列表中選擇的客戶名稱的唯一 OrderID 列表。爲此,請再次選擇工作表中的任何單元格(在此示例中,此單元格爲 $V$2)。在此單元格中使用以下公式獲取所需的 OrderID 列表。

=CHOOSECOLS(
    FILTER(
        Unique_Cus_Order_combo,
        CHOOSECOLS(Unique_Cus_Order_combo,2)=CustomerName
    ),
    1
)

公式解析如下:

  1. 定義 CustomerName是指包含主下拉列表的單元格的值;在此示例中,它指的是 =$L$3

  2. 定義的Unique_Cus_Order_combo是指訂單 ID 和客戶名稱的唯一組合範圍。它存儲公式 =UNIQUE(data!$A$2:$B$2156),其中範圍 A 和 B 分別包含 OrderID 和 Customer Names。

返回的數據部分如下圖所示:

2.內部 CHOOSECOLS 函數提供由 Unique_Cus_Order_combo 表示的範圍內的 Customer 名稱列表,以便與 FILTER 函數中的 CustomerName 匹配。

3.FILTER函數從所選客戶名稱對應的Unique_Cus_Order_combo中篩選出數據,如下圖所示:

4.最後,外部 CHOOSECOLS 函數從篩選的範圍內返回所需的 OrderID 列表,如下所示:

要使用 GcExcel 設置定義的名稱和動態公式,請按照以下示例代碼進行操作:

 workbook.Names.Add("CustomerName", "=$L$3");
 workbook.Names.Add("Unique_Cus_Order_combo", "=UNIQUE(data!$A$2:$B$2156)");

IRange rngUniqueOrderIds;
rngUniqueOrderIds = worksheet.Range["V2"]; //dummy range to get unique list of customer names
rngUniqueOrderIds.Formula2 = "=CHOOSECOLS(FILTER(Unique_Cus_Order_combo, CHOOSECOLS(Unique_Cus_Order_combo,2)=CustomerName), 1)";

步驟 6 - 填充依賴下拉列表

下一步是使用上一步中提取的列表填充 OrderID 下拉列表(在此示例中,它位於 L6)。爲此,請添加類型列表的數據驗證(與爲主下拉列表添加的數據驗證相同),並將其源值設置爲包含上一步中公式的單元格值(即 =$V$2)前綴爲 #。

IValidation orderIdList = worksheet.Range["L6"].Validation;
orderIdList.Add(ValidationType.List, ValidationAlertStyle.Stop, ValidationOperator.Equal, "=$v$2#");

步驟 7 - 將默認值設置爲下拉列表並保存工作簿

最後,使用 IRange 接口的 API將默認值設置爲下拉列表,並使用 IWorkbook 接口的 API保存工作簿,如下面的代碼片段所示:

worksheet.Range["L3"].Value = "Paul Henriot";
worksheet.Range["L6"].Value = 10248;
workbook.Save("E:\\download\\smartdependentlist\\CustomerOrderHistoryReport.xlsx");

生成的帶有智能依賴列表的 Excel 文件如下圖所示:

總結

以上就是使用C#生成依賴列表的全過程,如果您想了解更多信息,歡迎點擊這裏查看更多資料。

擴展鏈接:

輕鬆構建低代碼工作流程:簡化繁瑣任務的利器

優化預算管理流程:Web端實現預算編制的利器

如何在.NET電子表格應用程序中創建流程圖

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章