如何在java中使用 Excel 动态函数生成依赖列表

news/2024/7/21 5:20:03 标签: 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
    在这里插入图片描述

  2. 定义的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 匹配。
    在这里插入图片描述

  2. FILTER函数从所选客户名称对应的Unique_Cus_Order_combo中筛选出数据,如下图所示:
    在这里插入图片描述

  3. 最后,外部 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电子表格应用程序中创建流程图


http://www.niftyadmin.cn/n/5388082.html

相关文章

力扣随笔之通过删除字母匹配到字典里最长单词(中等524)

思路:根据题意有两个问题待解决 1、s字符串中是否可以通过删减得到该英语词语 2、如何找到长度最长且字母序最小的字符串 针对第二个问题可以对词典dictionary进行预处理:根据长度降序和字母序升序来排序 针对第一个问题可以初始化两个指针i,…

C#之WPF学习之路(2)

目录 控件的父类 DispatcherObject类 DependencyObject类 DependencyObject 类的关键成员和方法 Visual类 Visual 类的主要成员和方法 UIElement类 UIElement 类的主要成员和功能 FrameworkElement类 FrameworkElement 类的主要成员和功能 控件的父类 在 WPF (Windo…

Outlook邮箱登录如何操作?操作流程步骤?

Outlook邮箱登录入口在哪里找?Outlook邮箱怎么登陆? Outlook邮箱作为微软公司推出的一款功能强大的电子邮件服务工具,受到了广大用户的青睐。那么,Outlook邮箱登录的操作流程究竟是怎样的呢?接下来,就让蜂…

24-2-22学习总结

练习题 P8637 [蓝桥杯 2016 省 B] 交换瓶子 # [蓝桥杯 2016 省 B] 交换瓶子 ## 题目描述 有 $N$ 个瓶子,编号 $1 \sim N$,放在架子上。 比如有 $5$ 个瓶子: $$2,1,3,5,4$$ 要求每次拿起 $2$ 个瓶子,交换它们的位置。 经过…

华清远见嵌入式学习——驱动开发——DAY8

作业要求&#xff1a; 1.使用GPIO子系统编写LED灯驱动&#xff0c;应用程序测试 2.注册三个按键的中断&#xff0c;只需要写内核代码 需要发布到CSDN 作业答案&#xff1a; GPIO子系统&#xff1a; 代码效果&#xff1a; 应用程序&#xff1a; #include<stdlib.h> …

【扩散模型】【网络结构探索】神经网络扩散:Neural Network Diffusion(论文解读)

项目地址&#xff1a;https://github.com/NUS-HPC-AI-Lab/Neural-Network-Diffusion 文章目录 摘要一、前言二、Nerual Network Diffusion &#xff08;神经网络扩散&#xff09;2.1扩散模型&#xff08;预备知识&#xff09;2.2 总览2.3 参数自动编码器2.4 参数生成 三、实验3…

【人脸朝向识别与分类预测】基于GRNN神经网络

课题名称&#xff1a;基于GRNN神经网络的人脸朝向识别分类 版本日期&#xff1a;2024-02-20 运行方式&#xff1a;直接运行GRNN0503.m文件 代码获取方式&#xff1a;私信博主或 企鹅号:491052175 模型描述&#xff1a; 采集到一组人脸朝向不同角度时的图像&#xff0c;图像…

NLP 使用Word2vec实现文本分类

&#x1f368; 本文为[&#x1f517;365天深度学习训练营学习记录博客 &#x1f366; 参考文章&#xff1a;365天深度学习训练营 &#x1f356; 原作者&#xff1a;[K同学啊 | 接辅导、项目定制]\n&#x1f680; 文章来源&#xff1a;[K同学的学习圈子](https://www.yuque.com/…