Java编程之道:巧妙解决Excel公式迭代计算难题
本文由葡萄城技术团队原创并首发。转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具、解决方案和服务,赋能开发者。
什么是迭代计算
迭代计算其实是在 Excel 中,一种公式的循环引用,对于了解编程概念的同学,很容易会想到另一个词“递归”。
简单的说,就是一段程序调用自己,反复执行的逻辑。递归在编程中,属于中高级用法,因为递归需要一个中断的条件,对于初级的逻辑,递归很容易造成程序无限递归,出现 Stack Overflow(堆栈溢出)。
在 Excel 里,也是一样的,迭代计算指的是,公式引用中出现了循环引用。
举个例子:
A1 = A1 + 1;
A1 的结果是多少?如下图所示,通常 Excel 会通过提示,禁止循环引用的出现。

但是当小编开启迭代计算后,Excel 则允许循环引用。

此时,再看看刚才的公式,结果为 100。

所以,什么是迭代计算?
在 Excel 中,当出现循环引用时,反复循环递归的计算,即为迭代计算。迭代次数及迭代误差,可以在 Excel 的设置中配置。默认为 100 次。
迭代计算的使用场景
在很多数学模型的计算中,没有特定的公式进行求解,而是需要不停的计算,反复逼近一个期望的结果。
同时,迭代计算也适用于水利工程,地质工程的设计时的相关数据计算。
Java 中如何使用迭代计算
1. A1 = A1 + 1场景
接下来小编将以葡萄城公司的 Java API组件——GrapeCity Documents for Excel(以下简称为GcExcel)为例,为大家介绍如何在Java中实现迭代计算。
以上述提到过的A1 = A1 + 1 场景为例,下面是具体的代码:
// Create a new workbook
Workbook workbook = new Workbook();
// Enable iterative calculation
workbook.getOptions().getFormulas().setEnableIterativeCalculation(true);
workbook.getOptions().getFormulas().setMaximumIterations(10);
IWorksheet worksheet = workbook.getWorksheets().get(0);
worksheet.getRange("A1").setFormula("=B1 + 1");
worksheet.getRange("B1").setFormula("=A1 + 1");
System.out.println("A1:" + worksheet.getRange("A1").getValue().toString());
System.out.println("B1:" + worksheet.getRange("B1").getValue().toString());
// Save to an excel file
workbook.save("IterativeCalculation.xlsx");
运行程序,可以看到实现的效果:

结果值和使用Excel中使用公式的效果是一样的,都是100。
2. IRR场景
接下来以 IRR 为例用 Excel 做一次计算。
IRR 的概念是,当 N 年的净利润为 0 时,内部的收益率。
假设投资本金为 1 万,每年收益如下,在 Excel 中,分别用迭代计算和 IRR 公式进行计算。

IRR 是复利计算,假定 E7 和 E8 两个格子分别是 IRR。那么通过 IRR,在 F8 中可以根据复利公式进行计算。
其中 E7 为 IRR,IRR 需要使得上述的公式近似为 0。因此可以使用迭代计算来反推 IRR,E7 公式如下:
可以看到,小编一开始给 E7 定了一个初始值 0.3 (30%)。然后判断 F7 (NPV)的值,净值会随着 IRR 变小,逐渐变大,而 - 0.000001,则是每一次计算,对于 IRR 的调整。假定当 NPV 大于 0 时,IRR 计算停止,只要每一次对 IRR 的调整足够小,就可以近似的认为当 NPV 大于 0 的那一次结果趋近于 0。
经过反复计算,其结果如下:

那么在 Java 中,如何通过迭代计算来计算 IRR 呢?
通过借助GcExcel, 可以很方便的把刚才的公式直接放在代码里即可进行计算,代码如下:
public void IRR() {
// Create a new workbook
Workbook workbook = new Workbook();
// Enable iterative calculation
workbook.getOptions().getFormulas().setEnableIterativeCalculation(true);
workbook.getOptions().getFormulas().setMaximumIterations(1000000);
IWorksheet worksheet = workbook.getActiveSheet();
worksheet.getRange("B1").setValue(-10000);
worksheet.getRange("B2").setValue(1000);
worksheet.getRange("B3").setValue(1500);
worksheet.getRange("B4").setValue(2300);
worksheet.getRange("B5").setValue(3200);
worksheet.getRange("B6").setValue(4600);
worksheet.getRange("B7").setValue(6800);
worksheet.getRange("E7").setFormula("=IF(E7 = 0,E7+1,IF(F7 < 0,E7-0.000001,E7))");
worksheet.getRange("F7").setFormula("=B1+B2/(1+E7)+B3/(1+E7)^2+B4/(1+E7)^3+B5/(1+E7)^4+B6/(1+E7)^5+B7/(1+E7)^6");
System.out.println("E7 IRR:" + worksheet.getRange("E7").getValue().toString());
}
计算结果:和 Excel 里计算的值基本一致。

总结
以上就是在Java中对Excel数据进行迭代的方法,如果您想了解更多有关于数据迭代的玩法和技巧,可以参考这篇帮助手册,无论是初学者还是有经验的专业人士,该帮助手册都将为您提供有价值的指导和帮助。
扩展链接:
Java编程之道:巧妙解决Excel公式迭代计算难题的更多相关文章
- Python灰帽子:黑客与逆向工程师的Python编程之道PDF高清完整版免费下载|百度云盘
百度云盘免费下载:Python灰帽子:黑客与逆向工程师的Python编程之道PDF高清完整版免费下载 提取码:8nki 目录 · · · · · · 第1章 搭建开发环境 11.1 操作系统要求 1 ...
- java编程之POI读取excel表格的内容
07版本的excel需要另外加一个jar包.xbean.jar的jar包 读取代码模板.利用模板介绍读取excel的一些poi的api这是重点 /** * 读取excel文件 * @Title: re ...
- 读书笔记 ~ Python黑帽子 黑客与渗透测试编程之道
Python黑帽子 黑客与渗透测试编程之道 <<< 持续更新中>>> 第一章: 设置python 环境 1.python软件包管理工具安装 root@star ...
- java编程之:Unsafe类
Unsafe类在jdk 源码的多个类中用到,这个类的提供了一些绕开JVM的更底层功能,基于它的实现可以提高效率.但是,它是一把双刃剑:正如它的名字所预示的那样,它是 Unsafe的,它所分配的内存需要 ...
- [置顶] Objective-C编程之道iOS设计模式单例解析(2)
上一篇文章,提到了单例子类化的问题.正好最近,我在Stack Overflow看见一位国外高人,也谈及了单例子类化的一些内容.思考之后,总结了一些内容.其大意是利用NSDirectory存储不同子类的 ...
- Java编程之Map中分拣思想。
题目:给定一个字符串,求出字符串中每一个单词在字符串中出现的次数 旨意:map的分拣思想. 每一个key的包装类,存放出现的次数 /** * 作为包装类,用来存放英文单词,和该英文单词出现的次数 * ...
- 2017-2018-2 20179204 PYTHON黑帽子 黑客与渗透测试编程之道
python代码见码云:20179204_gege 参考博客Python黑帽子--黑客与渗透测试编程之道.关于<Python黑帽子:黑客与渗透测试编程之道>的学习笔记 第2章 网络基础 t ...
- java编程之JDBC
JDBC的常用类和接口 1. DriverManager类 管理数据库中的所有驱动程序,其所有的方法都是静态方法,调用时无需实例化,通过类名就可以直接调用. 2. Connec ...
- java编程之:生成rsa密钥
通过openssl工具生成RSA的公钥和私钥(opnssl工具可在互联网中下载到,也可以点此下载无线接口包,里面包含此工具) 打开openssl文件夹下的bin文件夹,执行openssl.exe文件: ...
- java编程之:org.apache.commons.lang3.text.StrTokenizer
第一个api测试:按特殊符号进行分词,并遍历每一个分词部分 public static void main(String[] args) { String aString="AB-CD-EF ...
随机推荐
- Lord Of The Root: 1.0.1实战
前言 Description:我创建这台机器是为了帮助其他人学习一些基本的CTF黑客策略和一些工具.我瞄准了这台机器,使其在难度上与我在OSCP上破解的机器非常相似. 这是一个引导到根计算机将不需要任 ...
- 一键搞定发布自己Jar到Maven中央仓库
做java 开发那当然离不开jar包管理, 不知何时一直想想封装一个自己的jar包 然后发布到maven中央仓库给别人使用. hhh 我感觉自己写一个jar包工具然后,被很多人使用是一件很牛,很快乐事 ...
- Centos 7安装Docker镜像仓库-Harbor
下载安装包并导入镜像 # 进入文件下载目录 cd /root/software/ # 下载安装文件 # 如果下载失败可以本地下载,下载后上传至服务器,https://github.com/goharb ...
- Code Generate 代码生成器 V1.0
Code Generate V1.0 代码生成器 根据配置的模板,根据建表语句,生成Code. 例如java代码.vue代码.jsp代码以及html代码等等,均可根据自己的代码写作习惯进行配置. 缺点 ...
- 【Dotnet 工具箱】推荐一个使用 C# 开发的轻量级压测工具
你好,这里是 Dotnet 工具箱,定期分享 Dotnet 有趣,实用的工具和组件,希望对您有用! 轻量级压测工具 LoadTestToolbox 是一个使用 C# 开发的轻量级压测工具,基于 .NE ...
- iframe与主窗口通信
1. 引言 <iframe> 元素是 HTML 中的一个标签,用于在当前页面中嵌入另一个页面 使用 <iframe> 可以实现以下功能: 嵌入其他网页:可以将其他网页嵌入到当前 ...
- Python工具箱系列(三十九)
使用zlib对数据进行压缩 现实世界中,大量存在着对数据压缩的需求.为此,python内置了zlib压缩库,可以方便的对任意对象进行压缩. 下述代码演示了对字符串进行压缩: import zlib # ...
- python下的jstack - pystack
背景 python 多进程任务,卡在某个地方没有继续执行也没有报出异常,进程被hang住 日志没有捕获到相关信息,需要知道进程阻塞在哪里,为什么阻塞 jvm提供了jstack.jmap类工具进行性能分 ...
- 基于python tornado实现的简易图床
基于python tornado实现的简易图床 项目地址 因为买了阿里/腾讯的云服务器,但是使用云存储还需要收费,又加上家里正好有一台nas,又加上闲的没事,所以搞了一个小脚本 这个项目主要功能是为t ...
- 《深入理解Java虚拟机》笔记:垃圾收集算法和HotSpot的算法实现
一.垃圾收集算法 由于垃圾收集算法的实现涉及大量的程序细节,而且各个平台的虚拟机操作内存的方法又各不相同,因此本节不打算过多地讨论算法的实现,只是介绍几种算法的思想及其发展过程. 垃圾收集算法概要 1 ...