当前位置: 首页 > news >正文

JAVA POI Excel 使用数组公式 FREQUENCY

平台及依赖

  1. JAVA 17
  2. POI版本
<dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>5.2.5</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>5.2.5</version></dependency>

正文

说明

有时候我们希望导出的excel能够包含一些基本公式,普通的单个公式如 SUM, COUNT等直接在cell单元格设置即可,如下代码

XSSFCell cell3 = row.createCell(0);
cell3.setCellFormula("SUM($A$2:$A$1000)");

但对于一些特殊公式如FREQUENCY这样需要一组公式共同完成结果集的,需要额外设置才能获取对应结果。
看下面的例子:

源码

package org.lionzhou.example.excel.formula.array;import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;import java.io.File;
import java.io.FileOutputStream;
import java.util.Arrays;
import java.util.List;/*** @author liangcheng.zhou@microtechmd.com* @version 1.0* @date 2024/4/8*/
public class EvaluateFormulaFrequency {// test datastatic final List<String> TEST_DATA = Arrays.asList("6.364", "6.44", "6.693", "6.508", "6.895", "6.41", "6.758", "6.364", "6.39", "6.663", "6.538", "6.431", "6.658", "6.51", "6.164", "6.613", "6.475", "6.121", "0", "5.884", "6.721", "6.345", "6.346", "6.504", "6.406", "6.993", "6.909", "7.071", "6.255", "6.938", "6.831", "7.058", "6.708", "0", "6.17", "6.716", "6.624", "7.113", "6.913", "6.769", "6.297", "6.554", "6.756", "7.073", "6.518", "7.725", "6.599", "6.795", "7.208", "6.349", "6.069", "6.391", "7.108", "6.888", "6.589", "6.7", "6.964", "7.061", "6.408", "6.864", "6.01", "6.441", "6.633", "6.18", "6.245", "6.589", "6.266", "6.865", "6.481", "7.06", "7.118", "6.516", "7.136", "6.672", "6.635", "6.796", "6.355", "7.356", "6.385", "6.693", "6.354", "6.515", "6.581", "7.248", "8.03", "6.836", "6.926", "6.311", "6.155", "6.656", "6.318", "6.938", "6.07", "6.331", "6.348", "6.538", "6.773", "6.203", "6.21", "6.344");public void export(File file) throws Exception {// 声明一个工作薄XSSFWorkbook workbook = new XSSFWorkbook();XSSFSheet sheet = workbook.createSheet("sheet-1");// column title startXSSFRow headerRow = sheet.createRow(0);XSSFCell cell = headerRow.createCell(0);cell.setCellValue("data");// cell width, 一个字符默认情况下是256个单位sheet.setColumnWidth(0, 256 * 8);XSSFCell cell1 = headerRow.createCell(2);cell1.setCellValue("scale");sheet.setColumnWidth(2, 256 * 6);XSSFCell cell2 = headerRow.createCell(3);cell2.setCellValue("数量");sheet.setColumnWidth(3, 256 * 6);// column title end// set test datafor (int i = 0; i < TEST_DATA.size(); i++) {XSSFRow row = sheet.createRow(i + 1);XSSFCell rowCell = row.createCell(0);// warning 类型会影响数据公式结果rowCell.setCellValue(Double.parseDouble(TEST_DATA.get(i)));}// set scalefor (int i = 0; i < 11; i++) {XSSFRow row = sheet.getRow(i + 1);XSSFCell rowCell = row.createCell(2);rowCell.setCellValue(i);}// 关键 start// a array formula  前面是数据公式,后面是参与公式的一组单元格范围sheet.setArrayFormula("FREQUENCY($A$2:$A$10000,$C$2:$C$12)", new CellRangeAddress(1, 11, 3, 3));// execute formulaworkbook.setForceFormulaRecalculation(true);workbook.getCreationHelper().createFormulaEvaluator().evaluateAll();// 关键 endworkbook.write(new FileOutputStream(file));}public static void main(String[] args) throws Exception {EvaluateFormulaFrequency evaluateFormula = new EvaluateFormulaFrequency();File file = new File(String.format("%s/data/%s.xls", System.getProperty("user.dir"), evaluateFormula.getClass().getSimpleName()));if (file.exists()) {file.delete();} else {file.getParentFile().mkdirs();}evaluateFormula.export(file);}
}

上面的例子可以直接下载
源码链接

效果

在这里插入图片描述

相关文章:

  • 2024.4.2力扣每日一题——所有可能的真二叉树
  • Word文档如何设置单选框、复选框、下拉框
  • python selenium向html中写入内容
  • Spring、SpringMVC、Springboot三者的区别和联系
  • 深入理解JVM后端优化技术-逃逸分析(Escape Analysis)
  • 【牛客SQL快速入门】SQL基础(一)
  • 蓝桥杯-网络安全比赛(5)基础学习-JavaScript原型链的prototype、constructor、object.create()、__proto__
  • go语言学习--2.函数
  • 为什么 MySQL 采用 B+ 树作为索引?
  • 网络协议——HTTP协议
  • ObjectiveC-10-OOP面向对象程序设计-分类/类别
  • 宁波中墙建材对于蒸压加气混凝土砌块2024年前景预测
  • go 搭建api后台笔记
  • 算法刷题day40
  • 【element】常用 El-Form 自定义表单校验规则实战
  • IE9 : DOM Exception: INVALID_CHARACTER_ERR (5)
  • android 一些 utils
  • Angular 响应式表单之下拉框
  • github从入门到放弃(1)
  • Gradle 5.0 正式版发布
  • Java基本数据类型之Number
  • JS专题之继承
  • Linux编程学习笔记 | Linux多线程学习[2] - 线程的同步
  • Stream流与Lambda表达式(三) 静态工厂类Collectors
  • 干货 | 以太坊Mist负责人教你建立无服务器应用
  • 蓝海存储开关机注意事项总结
  • 聊聊redis的数据结构的应用
  • 浅谈web中前端模板引擎的使用
  • 如何在GitHub上创建个人博客
  • 字符串匹配基础上
  • Nginx实现动静分离
  • 翻译 | The Principles of OOD 面向对象设计原则
  • # Apache SeaTunnel 究竟是什么?
  • #include到底该写在哪
  • #中的引用型是什么意识_Java中四种引用有什么区别以及应用场景
  • (51单片机)第五章-A/D和D/A工作原理-A/D
  • (C#)Windows Shell 外壳编程系列4 - 上下文菜单(iContextMenu)(二)嵌入菜单和执行命令...
  • (分布式缓存)Redis分片集群
  • (附源码)流浪动物保护平台的设计与实现 毕业设计 161154
  • (十七)devops持续集成开发——使用jenkins流水线pipeline方式发布一个微服务项目
  • (转)创业的注意事项
  • (转载)CentOS查看系统信息|CentOS查看命令
  • ***测试-HTTP方法
  • .net core 6 redis操作类
  • .NET 使用 ILRepack 合并多个程序集(替代 ILMerge),避免引入额外的依赖
  • .NET8.0 AOT 经验分享 FreeSql/FreeRedis/FreeScheduler 均已通过测试
  • .Net程序帮助文档制作
  • .net经典笔试题
  • .net与java建立WebService再互相调用
  • .Net中wcf服务生成及调用
  • .vimrc php,修改home目录下的.vimrc文件,vim配置php高亮显示
  • @LoadBalanced 和 @RefreshScope 同时使用,负载均衡失效分析
  • [ C++ ] STL_list 使用及其模拟实现
  • [AutoSAR 存储] 汽车智能座舱的存储需求
  • [C++]指针与结构体