如何使用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.pswp.cn/news/215043.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/215043.shtml
英文地址,請注明出處:http://en.pswp.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…

面試經典150題(14)

leetcode 150道題 計劃花兩個月時候刷完,今天(第五天)完成了1道(14)150: 14. (134. 加油站)題目描述: 在一條環路上有 n 個加油站,其中第 i 個加油站有汽油 gas[i] 升。 你有一輛油…

<JavaEE> 鎖進階 -- synchronized 的鎖優化

目錄 一、如何形容 synchronized 鎖 二、鎖升級 2.1 偏向鎖 2.2 輕量級鎖 2.3 重量級鎖 三、鎖消除 四、鎖粗化 一、如何形容 synchronized 鎖 synchronized 鎖是一個內部優化非常好的鎖,大部分情況下這個鎖都是適用的。在初始階段 synchronized 是一個樂觀…

分布式搜索引擎02

分布式搜索引擎02 在昨天的學習中,我們已經導入了大量數據到elasticsearch中,實現了elasticsearch的數據存儲功能。但elasticsearch最擅長的還是搜索和數據分析。 所以今天,我們研究下elasticsearch的數據搜索功能。我們會分別使用DSL和Res…

react面試總結2

redux中sages和thunk中間件的區別,優缺點 Redux 中的 redux-saga 和 redux-thunk 都是中間件,用于處理異步操作,但它們有一些區別。 Redux Thunk: 簡單易用:redux-thunk 是比較簡單直觀的中間件,它允許 …

手撕分布式緩存---HTTP Server搭建

經過了前兩個章節的學習,分布式緩存的存儲與新增我們已經實現了,并且對其做了高可用處理。本章節我們剝離和緩存強相關的邏輯,開始搭建一個HTTP服務器,畢竟緩存數據庫搭建完之后別人沒法訪問也是沒有用處的。這一章節我們重點學習…

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…

關于jinja2高版本api變化導致notebook導出html失敗的問題

最新jinja2版本已經到了3.1.2,但是nbconvert引用的應該是老版本,具體代碼報錯如下 Type "help", "copyright", "credits" or "license" for more information. >>> import nbconvert Traceback (most…

spark從表中采樣(隨機選取)一定數量的行

在Spark SQL中,你可以使用TABLESAMPLE來按行數對表進行采樣。以下是使用TABLESAMPLE的示例: SELECT * FROM table_name TABLESAMPLE (1000 ROWS);在這個示例中,table_name是你要查詢的表名。TABLESAMPLE子句后面的(1000 ROWS)表示采樣的行數…

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軟件,好像結…