如何使用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版 | 服务端高性能表格组件 - 葡萄城
扩展链接:
如何使用Java在Excel中添加动态数组公式?的更多相关文章
- Java 在Excel中添加分离型饼图、环形图
一.概述 Excel中可支持多种不同类型的图表,本文介绍如何绘制分离型饼图和环形图.其中,分离型饼图的绘制可分为整体分离型(即设置饼图分离程度)和局部分离(即设置点爆炸型值)两种情况.下面将以Java ...
- java 在Excel中插入图片 POI实现
一.POI简介 Jakarta POI 是apache的子项目,目标是处理ole2对象.它提供了一组操纵Windows文档的Java API 目前比较成熟的是HSSF接口,处理MS Excel(97- ...
- Excel中添加并使用宏实现批量更新数据
一.状况描述 当我们需要后台更新大量数据的时候,可以使用该功能.二.解決方案 (1)新建一个Excel文件,并另存为启用宏的Excel工作簿,扩展名为.xlsm. (2)在Excel ...
- JAVA将Excel中的报表导出为图片格式(一)问题背景
如题所示,先抛出一个问题,如何使用JAVA将Excel中的报表导出为图片格式? 首先说一下这个问题的背景,也就是为什么博主会碰到这个问题 随着微信,易信之流大行其道,企业内部的办公交流.绩效考评甚至考 ...
- Java处理Excel中的日期格式
Java处理Excel中的日期格式 2011-12-23 17:34:03| 分类: java |举报 |字号 订阅 下载LOFTER 我的照片书 | 在Excel中的日期格式,其数值为距离1 ...
- C与Java中的动态数组
1. 引言 在实际的编程中,往往会发生这种情况,即所需的内存空间取决于实际输入的数据,而无法预先确定.对于这种问题,用静态数组的办法很难解决. 动态数组,是相对于静态数组而言.静态数组的长度是预先定义 ...
- (待续)C#语言中的动态数组(ArrayList)模拟常用页面置换算法(FIFO、LRU、Optimal)
目录 00 简介 01 算法概述 02 公用方法与变量解释 03 先进先出置换算法(FIFO) 04 最近最久未使用(LRU)算法 05 最佳置换算法(OPT) 00 简介 页面置换算法主要是记录内存 ...
- Eclipse中java向数据库中添加数据,更新数据,删除数据
前面详细写过如何连接数据库的具体操作,下面介绍向数据库中添加数据. 注意事项:如果参考下面代码,需要 改包名,数据库名,数据库账号,密码,和数据表(数据表里面的信息) package com.ning ...
- JAVA将Excel中的报表导出为图片格式(三)换一种实现
上一篇介绍了使用Java的Robot机器人实现截图,然后将剪贴板上的数据流生成PNG图片 但是经过博主的不断测试,在完全依赖远程桌面的没有终端显示器的服务器上 使用截图方式是不可行的,因为一旦使用了远 ...
- Java 在Excel中添加水印(单一水印、平铺水印)
在Excel中没有直接添加水印的功能,但依旧可以通过一定方式来实现类似水印效果.本文通过Java程序代码介绍具体实现方法.可添加单一水印效果,即水印是以单个文本字样来呈现:也可添加多个平铺水印效果,即 ...
随机推荐
- 2023 PolarD&N靶场通关笔记 Crypto
简单类: keyboard2.0 21 31 41 53 63 73 62 72 82 81 91 01 51 61 71 提示:解出来的内容转换为md5值后加上flag{} 数字被分成五组,每组包含 ...
- [ABC261A] Intersection
Problem Statement We have a number line. Takahashi painted some parts of this line, as follows: Firs ...
- 8 HTTP 的请求方法
目录 标准请求方法 GET/HEAD GET 方法 HEAD方法 POST/PUT POST PUT 非常用方法 DELETE 方法 CONNECT 方法 OPTIONS 方法 TRACE 方法 拓展 ...
- 后端程序员必会的前端知识-04:Vue3
Vue 3 1. TypeScript 1) 动态类型的问题 前面我们讲过 js 属于动态类型语言,例如 function test(obj) { } obj 可能只是个字符串 test('hello ...
- lower_bound() upper_bound()函数
转自http://blog.csdn.net/niushuai666/article/details/6734403 函数lower_bound()在first和last中的前闭后开区间进行二分查找, ...
- 【C#】【DateTime】获取当前时间的前一天或者后一天方法学习
假期懈怠了一阵子,因为工作环境没有网络,随即记录下当时的问题: 1.关于DateTime.Now(2023/10/07)的前一天的时间(2023/10/06),想要通过ToString转换成字符串后除 ...
- 混合专家模型 (MoE) 详解
随着 Mixtral 8x7B (announcement, model card) 的推出,一种称为混合专家模型 (Mixed Expert Models,简称 MoEs) 的 Transforme ...
- mysql的CRUD操作实现
插入语句(INSERT):一旦我们选择了要插入的字段, 我们就必须保证要插入的数值和选择的字段的个数,顺序,类型一致. 1:怎么插入一条数据: INSERT INTO 插入的表名称(列名1,列 ...
- JavaFx之SceneBuilder添加其他依赖库(十六)
JavaFx之SceneBuilder添加其他依赖库(十六) Could not open 'xxxxx.jar' Open operation has failed. Make sure that ...
- MySQL优化:12种提升SQL执行效率的有效方法
在数据库管理和优化的世界里,MySQL作为一个流行的关系型数据库管理系统,其性能优化是任何数据密集型应用成功的关键.优化MySQL数据库不仅可以显著提高SQL查询的效率,还能确保数据的稳定性和可靠性. ...