首页 > 编程语言 >如何在C#中使用 Excel 动态函数生成依赖列表

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

时间:2024-02-22 10:14:15浏览次数:27  
标签:C# 单元格 Excel 列表 API 使用 Unique

前言

在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电子表格应用程序中创建流程图

标签:C#,单元格,Excel,列表,API,使用,Unique
From: https://www.cnblogs.com/powertoolsteam/p/18025792

相关文章

  • SciTech-BigDataAIML-OpenAI的Sora视频生成 + 档案管理
    如何基于three.js(webgl)引擎架构,实现3D密集架库房,3D档案室(3d机器人取档、机器人盘点、人工查档、设备巡检)https://www.cnblogs.com/yeyunfei/p/18023685前言:这是最好的时代,也是最坏的时代;是充满挑战的时代,也是充满机遇的时代。是科技飞速的时代,也是无限可能的时代。......
  • .net core 读取appsetting.json 封装
    /*需要引入的包Microsoft.Extensions.Configuration-提供配置的核心功能。Microsoft.Extensions.Configuration.Json-支持从JSON文件加载配置。Microsoft.Extensions.Configuration.FileExtensions-支持文件相关的配置,如设置基路径。Microsoft.Extensions.Configura......
  • AutoCAD2024画圆或矩形实时预览消失了如何解决?
    最近有小伙伴问这个问题,他在使用AutoCAD绘制图形时,发现画圆或矩形实时预览没有了,如下,画图不容易定位,非常影响画图效率,十分苦恼不知道如何恢复? 正常CAD画圆(或矩形)会显示实时预览,如下:操作步骤:AutoCAD20241、打开AutoCAD2024软件,然后在命令栏输入:DRAGMODE,然后按Enter键......
  • 软件无线电处理平台设计方案:330-基于FMC接口的Kintex-7 XC7K325T PCIeX4 3U PXIe接口
    一、板卡概述     本板卡基于Xilinx公司的FPGAXC7K325T-2FFG900 芯片,pin_to_pin兼容FPGAXC7K410T-2FFG900 ,支持PCIeX8、64bit DDR3容量2GByte,HPC的FMC连接器,板卡支持PXIE标准协议,其中XJ3标准高速差分接口,支持PCIeX 2。软件具有windows,Linux驱动。二、功能和技术......
  • pve 将硬盘挂载到ct容器
    1.配置文件方法vi/etc/pve/lxc/101.conf#101是ct容器编号mp0:/mnt/pve/hdd4,mp=/mnt/hdd4tmp1:/mnt/pve/hdd6,mp=/mnt/hdd6tmp2:/mnt/pve/sdd,mp=/mnt/sdd1t配置信息如图:配置完成后,可在容器资源里看到挂载信息:然后重启容器即可。......
  • Linux-Source Insight添加系统库路径
    1、在BASE项目下添加Project->OpenProject,打开Base项目2、打开PreferencesProject->Preferences,选择SymbolLookups选项卡3、打开ImportSymbolsforAllProjects4、打开右侧Add按钮,弹出AddExternalSymbols对话框5、打开ImportfromanINCLUDEpath6、将需要添加的......
  • 实现多个csv文件导出
    publicR<Boolean>exportCsv(HttpServletResponseresponse,@RequestBodyDrQueryDtoqueryDto)throwsException{IntegercountyId=queryDto.getCountyId();StringyearAnnual=queryDto.getYearAnnual();Stringurl="E:\\......
  • 解密prompt系列24. RLHF新方案之训练策略:SLiC-HF & DPO & RRHF & RSO
    去年我们梳理过OpenAI,Anthropic和DeepMind出品的经典RLHF论文。今年我们会针对经典RLHF算法存在的不稳定,成本高,效率低等问题讨论一些新的方案。不熟悉RLHF的同学建议先看这里哦解密Prompt7.偏好对齐RLHF-OpenAI·DeepMind·Anthropic对比分析RLHF算法当前存在的一些问题有RL的......
  • Blocks(单调栈)
    题干中说每次选择一个大于k的数,还要选他左右两个数其中之一加上一,最后问你最长的每个数不小于K的子序列。这些都是障眼法,其实就是问你最长的平均值大于或等于K的最长子序列,这样就明朗了。接下来就是找子序列的问题,因为要求的是区间最大平均值,所以不能再以单个数的值为依据来决......
  • 洛谷 P6610 [Code+#7] 同余方程
    题目描述给出若干组正整数\(p\)和\(x\),求方程\(a^2+b^2\equivx\pmodp\)关于\(a\)和\(b\)在模\(p\)意义下解的组数,其中\(p\)是奇数,且不包含平方因子题解来整一个更注重于观察结构而不是计算的题解(首先使用CRT将问题转化为模奇质数的结果相乘是显然的......