如何使用Java在Excel中添加动态数组公式?

本文由葡萄城技术团队发布。转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具、解决方案和服务,赋能开发者。

前言

动态数组公式是 Excel 引入的一项重要功能,它将 Excel 分为两种风格:Excel 365 和传统 Excel(2019 或更早版本)。动态数组功能允许用户从单个单元格中的公式返回多个结果值,并将这些值自动填充到与公式单元格相邻的单元格中。由于结果会溢出到多个单元格中,这也被称为溢出范围功能。在传统 Excel 中,用户必须使用 Ctrl + Shift + Enter 来将公式识别为数组公式,否则公式结果将仅返回单个值。因此,动态数组为用户提供了更加便利的使用体验。现在我们将这样的返回多个值的公式称为动态数组公式。

今天小编就为大家介绍如何使用葡萄城公司的Java API 组件GrapeCity Documents for Excel(以下简称GcExcel)实现在Excel中添加动态数组。

动态数组公式

下表总结了GcExcel所有支持的公式及其语法、说明和代码示例:

功能代码片段图像
FILTER **:**FILTER 公式根据您指定的条件筛选范围或数组。 FILTER(array,include,[if_empty])sheet.getRange(“I4”).setFormula2(“=FILTER(D4:E12,E4:E12>G4,\”\“)”);
**RANDARRAY:**RANDARRAY 公式允许您在数组中生成从 0 到 1 的随机 numbers 列表。 RANDARRAY ([rows],[columns])sheet.getRange(“$D$3”).setFormula2(“=RANDARRAY(4,5)”);
**SEQUENCE :**SEQUENCE 公式允许您在数组中生成序列号列表。 SEQUENCE(rows,[columns],[start],[step])sheet.getRange(“$D$4”).setFormula2(“=SEQUENCE(10,100,-10)”);
**SORTBY :**SORTBY 公式允许您根据相应范围或数组中的值对范围或数组进行排序。 SORTBY(array, by_array1, [sort_order1], [[by_array2], [sort_order2]],…)sheet.getRange(“$G$5”).setFormula2(“=SORTBY($D$5:$E$12,$E$5:$E$12)”);
**SORT:**SORT 公式用于按升序或降序对范围或数组进行排序。 SORT(array, [sort_index], [sort_order], [by_col])sheet.getRange(“$I$5”).setFormula2(“=SORT(D5: G13,4,1, FALSE)”);
**UNIQUE:**UNIQUE 公式允许您从项目范围或数组中返回唯一列表。UNIQUE(array, [by_col], occurs_once])sheet.getRange(“$G$4:$I$4”).setFormula2(“=UNIQUE(B4: B12)”);

详细代码请点击这里。

@ 运算符

@ 运算符(也称为隐式**交集运算符)**实现一种称为隐式交集的公式行为,该行为将一组值减少为单个值。这适用于返回多个值的数组公式,在这种情况下,将根据单元格位置(即行和列)返回单个值。在老版本 Excel 中,这是默认行为,因此不需要显式运算符。但是,在 Excel 365 中,所有公式都是数组公式,因此,如果您不希望数组公式溢出,则可以在公式前面加上 @ 运算符,它只会返回一个值。

实现代码:

public void ImplicitIntersection() {Workbook wb = new Workbook();//初始化工作表IWorksheet sheet = wb.getWorksheets().get(0);sheet.setName("IMPLICIT INTERSECTION");//添加样例数据sheet.getRange("$D$3:$D12").setValue(new Object[]{"Products", "Apple", "Grape", "Pear", "Banana","Apple", "Grape", "Pear", "Banana", "Banana"});sheet.getRange("$E$3").setValue("Unique Products");//添加含有隐式运算符的动态数组公式sheet.getRange("$E$4").setFormula2("=@UNIQUE(D4:D12)");wb.save("output/ImplicitIntersection.xlsx");
}

实现效果:

溢出范围参考 (#)

动态数组公式将其多值结果溢出到的单元格范围称为**溢出范围。**每当单击溢出范围中的任何单元格时,溢出范围都会以蓝色边框突出显示,表示该范围中的所有值都是通过该范围左上角单元格中的公式计算得出的。

溢出范围参考运算符用于引用此溢出范围。要引用溢出范围,请在溢出范围中左上角单元格的地址后放置一个主题标签或井号 (#)。

例如,若要查找单元格 E4 中应用的 UNIQUE 公式提取了多少个唯一值,请提供对 COUNTA 公式的溢出范围引用,如下面的代码所示:

public void SpillReference() {Workbook wb = new Workbook();//初始化工作表IWorksheet sheet = wb.getWorksheets().get(0);sheet.setName("SPILL REFERENCE");//添加样例数据sheet.getRange("$D$3:$D12").setValue(new Object[]{"Products", "Apple", "Grape", "Pear", "Banana","Apple", "Grape", "Pear", "Banana", "Banana"});sheet.getRange("$E$3").setValue("Unique Products");sheet.getRange("F3").setValue("Unique Products Count");//设置动态数组公式sheet.getRange("$E$4").setFormula2("=UNIQUE(D4:D12)");//设置带有溢出范围引用的公式sheet.getRange("$F$4").setFormula2("=COUNTA(E4#)");wb.save("output/SpillReference.xlsx");
}

实现效果:

现在,我们已经了解了 GcExcel 如何在 Java 中为动态数组公式提供支持,下面小编将用一个简单的例子展示动态数组公式的用途。

用例:使用动态数组在 Excel 中创建交互式图表

考虑这样一个场景:我们有一些表格数据,想用柱状图来展示。通常情况下,表格数据有很多行和列,但在制作图表时,我们需要按照某些条件来选择部分数据。为了提取所需数据,我们需要根据一些条件来进行筛选,这就是动态数组公式的应用场景。我们使用FILTER函数根据定义的条件来筛选表格数据,一旦获取到筛选后的数据,我们就可以用它来创建柱状图。

柱状图绘制来自预定义单元格范围的数据,该范围绑定到图表系列。因此,如果过滤后的行数发生变化,例如用户更改了“Show”列中的值,就会导致FILTER公式重新计算,从而筛选后的数据单元格范围也会发生变化。但是,图表系列始终引用相同的单元格范围,因此任何新的筛选数据行如果不在系列单元格范围内,则不会在图表上绘制。但是,我们希望所有经过筛选的数据都能在图表上显示,这就需要将简单静态图表转换为交互式图表,以便刷新其绘图区域来绘制所有筛选数据的值。

因此,请继续了解实现上述定义方案的详细步骤。

步骤 1:加载数据文件

我们将首先在 GcExcel 工作簿中加载源数据,该数据将用于绘制图表。

源数据文件下载(源文件文章系统的附件中)

将 Excel 文件加载到Workbook 中:

//创建一个工作簿,并打开数据文件
Workbook workbook = new GrapeCity.Documents.Excel.Workbook();
workbook.Open("xlsx\\SalesReport_sourcedata.xlsx");

加载效果:

步骤 2:使用动态数组公式提取图表数据

现在将开始提取相关数据,以便在图表中进行绘制。我们将根据产品的销售额绘制图表。因此,图表数据应包含来自产品列和金额列的数值。从这两列中提取特定数值的标准是基于展示列。我们将从展示列的值为1的每一行中提取产品和金额数值,并在图表上绘制这些筛选后的数据。

使用FILTER函数从产品列中过滤数据,然后使用SORTBY函数按照金额列的值进行降序排序。因此,我们将通过连接FILTER和SORTBY这两个动态数组函数来创建一个动态数组公式。

将使用VLOOKUP函数提取金额列中的数值,并将FILTER函数的溢出范围作为参数传递,以便获取与每个筛选产品对应的金额值。

以下是相应的代码片段:

IWorksheet worksheet = workbook.getWorksheets().get(0);
worksheet.getRange("G3").setValue("Product");
worksheet.getRange("H3").setValue("Sales");
worksheet.getRange("G3").getFont().setBold(true);
worksheet.getRange("H3").getFont().setBold(true);
//使用动态数组公式来获取产品列的值
worksheet.getRange("G4").setFormula2("=SORTBY(FILTER(B4:B13,E4:E13=1),FILTER(D4:D13,E4:E13=1),-1)");
//引用溢出区域来获取金额列的值
worksheet.getRange("H4").setFormula2("=VLOOKUP(G4#,B4:D13,3,FALSE)");

以下是对工作表的快速浏览,其中包含 G 列和 H 列中经过筛选和排序的数据,并突出显示了溢出范围:

步骤 3:使用筛选后的数据添加简单图表

上述步骤已生成要在图表中绘制的数据。在这里,我们通过向工作表添加两个命名范围来添加一个简单的图表来展示销售额,其中一个引用筛选出的数据中的“产品”列,另一个引用“销售”列。然后,这些命名区域将用于创建图表系列。代码如下所示:

//添加数据引用
wb.getNames().add("Product", "=Sheet1!$G$4:$G$8");
wb.getNames().add("Sales", "=Sheet1!$H$4:$H$8");//添加图表
IShape chartShape = sheet.getShapes().addChart(ChartType.ColumnClustered, 600, 170, 500, 300);
IChart chart = chartShape.getChart();
//添加系列
ISeries series = chart.getSeriesCollection().newSeries();
series.setFormula("=SERIES(\"Sales\", Product, Sales, 1)");

生成的图表如下所示:

步骤 4:使图表具有交互性

让我们首先了解使用此图表具有交互性的需求。观察下面的 GIF,会发现更改“Show”列中的值会重新计算动态数组公式并更新过滤后的数据单元格范围。但是,仅当新筛选的数据位于单元格区域 G3:H8(即系列单元格区域)时,此更改才会在图表中可见。如果过滤后的数据不在单元格范围 G3:H8 中,则它不会显示在图表中,如本示例中过滤后的数据范围扩展到 G3:H10,但图表仅呈现来自 G3:H8 的数据:

此图表应绘制所有过滤掉的数据。为此,我们必须使用溢出范围参考更新序列单元格范围,这将确保序列单元格范围始终包含包含过滤数据的完整单元格范围。下面是示例代码片段,该代码片段更新命名区域以使用溢出范围引用,从而根据动态数组公式的结果使引用的单元格区域动态化。然后,这些动态命名区域用于创建图表系列,使图表具有交互性。

代码如下所示:

//添加命名引用,用于图表数据
wb.getNames().add("Product", "=Sheet1!$G$4#");
wb.getNames().add("Sales", "=Sheet1!$H$4#");//添加图表
IShape chartShape = sheet.getShapes().addChart(ChartType.ColumnClustered, 600, 170, 500, 300);
IChart chart = chartShape.getChart();//添加系列
ISeries series = chart.getSeriesCollection().newSeries();
series.setFormula("=SERIES(\"Sales\", Product, Sales, 1)");

实现效果:

总结

以上就是如何使用Java在Excel中添加动态数组公式的全过程,如果您想要了解更多的资料,可以点击下方链接查看:

GcExcel Java 在线Demo | 动态数组的用例

GcExcel Java 在线Demo | 动态数组

动态数组 - GcExcel 中文文档Java版 | 服务端高性能表格组件 - 葡萄城

扩展链接:

Redis从入门到实践

一节课带你搞懂数据库事务!

Chrome开发者工具使用教程

从表单驱动到模型驱动,解读低代码开发平台的发展趋势

低代码开发平台是什么?

基于分支的版本管理,帮助低代码从项目交付走向定制化产品开发

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/215043.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

虹科技术 | IO-Link Wireless如何赋能工厂车间迈向无线自动化?

大规模定制、卓越运营和商业智能正在从根本上改变制造业,为了在竞争中立于不败之地,制造商需要更加灵活、通用、可扩展和具有成本效益的机器和生产线。随着制造商向工业 4.0 迈进,更好的适应性、更高的吞吐量和更短的停机时间是他们的共同要求…

打包CSS

接上一个打包HTML继续进行CSS的打包 1.在之前的文件夹里的src文件夹创建一个css文件 2.在浏览器打开webpack——>中文文档——>指南——>管理资源——>加载CSS 3.复制第一句代码到终端 4.复制下图代码到webpack.config.js脚本的plugins:[.....]内容下…

【docker】Hello World

搜索hello-world镜像 docker search hello-world拉去镜像 docker pull hello-world查看本地镜像 docker images 运行镜像 docker run hello-world查看所有的容器 docker ps -a查询start状态容器 docker ps 输出介绍 CONTAINER ID: 容器 ID。IMAGE: 使用的镜像。COMMAN…

分布式搜索引擎02

分布式搜索引擎02 在昨天的学习中,我们已经导入了大量数据到elasticsearch中,实现了elasticsearch的数据存储功能。但elasticsearch最擅长的还是搜索和数据分析。 所以今天,我们研究下elasticsearch的数据搜索功能。我们会分别使用DSL和Res…

ElasticSearch应用场景以及技术选型[ES系列] - 第496篇

历史文章(文章累计490) 《国内最全的Spring Boot系列之一》 《国内最全的Spring Boot系列之二》 《国内最全的Spring Boot系列之三》 《国内最全的Spring Boot系列之四》 《国内最全的Spring Boot系列之五》 《国内最全的Spring Boot系列之六》 M…

PDF控件Spire.PDF for .NET【转换】演示:将 PDF 转换为 Excel

PDF是一种通用的文件格式,但它很难编辑。如果您想修改和计算PDF数据,将PDF转换为Excel将是一个理想的解决方案。在本文中,您将了解如何使用Spire.PDF for .NET在 C# 和 VB.NET 中将 PDF 转换为 Excel。 Spire.Doc 是一款专门对 Word 文档进行…

【华为数据之道学习笔记】3-10元数据管理架构及策略

元数据管理架构包括产生元数据、采集元数据、注册元数据和运 维元数据。 产生元数据: 制定元数据管理相关流程与规范的落地方案,在IT产品开发过程中实现业务元数据与技术元数据的连接。 采集元数据: 通过统一的元模型从各类IT系统中自动采集元…

多线程(初阶九:线程池)

目录 一、线程池的由来 二、线程池的简单介绍 1、ThreadPoolExecutor类 (1)核心线程数和最大线程数: (2)保持存活时间和存活时间的单位 (3)放任务的队列 (4)线程工…

Axure的安装以及简单使用

目录 Axure简介 是什么 有什么用 Axure的优缺点 优点: 缺点: 安装 汉化 Axure的使用 工具栏 页面 ​编辑 添加子页面 ​编辑 Axure简介 是什么 Axure是一款著名的原型设计工具。它允许用户创建交互式线框图、流程图、原型和其他设计文档&…

「Verilog学习笔记」脉冲同步电路

专栏前言 本专栏的内容主要是记录本人学习Verilog过程中的一些知识点,刷题网站用的是牛客网 timescale 1ns/1nsmodule pulse_detect(input clk_fast , input clk_slow , input rst_n ,input data_in ,output dataout );reg data_level, dat…

第十一章 React 封装自定义组件

一、专栏介绍 🌍🌍 欢迎加入本专栏!本专栏将引领您快速上手React,让我们一起放弃放弃的念头,开始学习之旅吧!我们将从搭建React项目开始,逐步深入讲解最核心的hooks,以及React路由、…

【NLP】RAG 应用中的调优策略

​ 检索增强生成应用程序的调优策略 没有一种放之四海而皆准的算法能够最好地解决所有问题。 本文通过数据科学家的视角审视检索增强生成(RAG)管道。它讨论了您可以尝试提高 RAG 管道性能的潜在“超参数”。与深度学习中的实验类似,例如&am…

axios 基础的 一次封装 二次封装

一、平常axios的请求发送方式 修改起来麻烦的一批 代码一大串 二、axios的一次封装 我们会在src/utils创建一个request.js的文件来存放我们的基地址与拦截器 /* 封装axios用于发送请求 */ import axios from axios/* (1)request 相当于 Axios 的实例对象 (2)为什么要有reque…

VSCode使用Remote-SSH连接服务器时报错:无法与“***”建立连接: XHR failed.

关于VSCode的报错问题:无法与“***”建立连接: XHR failed 问题描述问题理解解决方法手动在本地下载安装包,然后手动传到服务器端 问题描述 是的,我又踩坑了,而且这个弄了好久,也重新装了VSCode软件,好像结…

前端框架(Front-end Framework)和库(Library)的区别

聚沙成塔每天进步一点点 ⭐ 专栏简介 前端入门之旅:探索Web开发的奇妙世界 欢迎来到前端入门之旅!感兴趣的可以订阅本专栏哦!这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是完全的新手还是有一些基础的开发…

阿里云国际版CDN加速,如何判断网站IP已加速?

将源站接入阿里云CDN服务后,您可以通过IP检测功能,检测客户端请求实际访问的IP是否为CDN加速节点IP,判断加速是否生效。 应用场景 IP检测的应用场景如下: 场景一:成功配置CDN后,您可以检测客户端请求实际…

Postman高级应用——变量、流程控制、调试、公共函数、外部数据文件

Postman 提供了四种类型的变量 环境变量(Environment Variable) 不同的环境,使用不同的环境变量,例如:测试过程中经常会用到 测试环境,外网环境等 全局变量(Global Variable) 所有的…

【计算机网络】序列化,反序列化和初识协议

目录 ​编辑 一、概念 二、 序列化过程: 选择序列化格式: 实现序列化代码: JSON示例: Protocol Buffers示例: JSON编码示例: 传输或存储: 三、反序列化过程: 下面是反序列…

(企业 / 公司项目) 企业项目如何使用jwt?

按照企业的项目然后写的小demo, 自己搞一个登录接口然后调用jwtUtil工具类 后端实现 创建一个通用模块common来实现jwt生成token 登录注册的基本实现逻辑思路 面试| ProcessOn免费在线作图,在线流程图,在线思维导图 注释挺详细的jwtUtil工具类, 封装的…

WPF仿网易云搭建笔记(5):信息流控制之IOC容器

文章目录 专栏和Gitee仓库前言IOC容器Prism IOC使用声明两个测试的服务类MainWindow IOC 注入[单例]MainWindow里面获取UserController无法使用官方解决方案 使用自定义IOC容器,完美解决既然Prism不好用,直接上微软的IOC解决方案App.xaml.csViewModel里面…