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

前言

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

在本博客中,小編將爲大家介紹如何藉助葡萄城公司的Java API 組件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.getWorksheets().get(0);

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

初始化工作簿後,需要獲取添加到報表中“選擇客戶名稱”部分的主下拉列表的唯一客戶名稱列表,並對所需的客戶名稱數據範圍使用 UNIQUE 函數。使用 GcExcel,可以使用帶有 IWorksheet 接口的 API 獲取單元格或單元格區域,並使用 IRange 接口的 API 爲其設置動態公式,如下所示:

IWorksheet worksheet;
worksheet = workbook.getWorksheets().get(0);

顯示效果如下所示:

步驟 4 - 創建主下拉列表

獲得客戶名稱列表後,將其用作爲客戶姓名下拉列表的數據源。在此博客示例中,此主下拉列表在單元格 L3 中創建。 小編使用GcExcel的IRange 接口的 API 在某個範圍內配置數據驗證。使用 IValidation 接口的 API 爲區域添加新的驗證規則實例。選擇 ValidationType.List 列表類型數據驗證選項,並使用 UNIQUE 公式將公式設置爲單元格,如下圖所示:

IValidation customerNameList = worksheet.getRange("L3").getValidation();
customerNameList.add(ValidationType.List, ValidationAlertStyle.Stop, ValidationOperator.Equal, "=$T$3#", null);

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

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

設置完主下拉列表後,需要獲取在主下拉列表中客戶名稱的唯一 OrderID 列表。爲此,需要再次選擇工作表中的單元格(在此示例中,此單元格爲 $V$2)。在此單元格中使用以下公式獲取所需的 OrderID 列表。

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

公式解析如下:

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

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

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

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

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

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

使用 GcExcel 設置定義的名稱和動態公式的代碼如下:

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

IRange rngUniqueOrderIds;
rngUniqueOrderIds = worksheet.getRange("V2"); //dummy rnage to get unique list of customer names
rngUniqueOrderIds.setFormula2("=CHOOSECOLS(FILTER(Unique_Cus_Order_combo, CHOOSECOLS(Unique_Cus_Order_combo,2)=CustomerName), 1)");

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

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

IValidation orderIdList = worksheet.getRange("L6").getValidation();
orderIdList.add(ValidationType.List, ValidationAlertStyle.Stop, ValidationOperator.Equal, "=$v$2#", null);

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

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

worksheet.getRange("L3").setValue("Paul Henriot");
worksheet.getRange("L6").setValue(10248);
workbook.save("E:\\download\\smartdependentlist\\CustomerOrderHistoryReport.xlsx");

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

附上完整的代碼工程文件:https://gitee.com/GrapeCity/gc-excel_-dynamic_functions

總結

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

擴展鏈接:

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

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

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

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