对我来说,它给出了#NUM!电流错误apache poi 4.1.0
,不是NaN
。
问题在于你给定的猜测。在IRR 函数中指出:
猜测 可选。您猜测的数字接近 IRR 的结果。
Microsoft Excel 使用迭代技术来计算 IRR。从猜测开始,IRR 循环计算,直到结果准确在 0.00001% 以内。如果 IRR 在 20 次尝试后找不到有效的结果,#NUM!返回错误值。
在大多数情况下,您不需要为 IRR 计算提供猜测。如果省略guess,则假定为0.1(10%)。
如果 IRR 给出 #NUM!错误值,或者如果结果与您的预期不接近,请使用不同的猜测值重试。
您的结果IRR
将是 -0.050193141 in Excel
。但你的猜测是 0.1。因此,使用该猜测,内部apache poi
IRR
函数在 20 次尝试后找不到准确度在 0.00001% 以内的结果。所以#NUM!返回错误值。
为什么apache poi
的IRR
功能 与 中 的 不 一样Excel
? 好吧,因为那部分Excel
不是开源的。所以没有人真正知道它是如何工作的。
使用 -0.1 的猜测对我有用。
例子:
import java.io.FileOutputStream;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
class ExcelEvaluateIRR {
public static void main(String[] args) throws Exception {
try (Workbook workbook = new XSSFWorkbook();
FileOutputStream fileout = new FileOutputStream("Excel.xlsx") ) {
Double[] values = new Double[] {
-1.0601017230994111E8,
19150.63,
44505.08,
22997.34,
33936.39,
27265.92,
2127.66,
2108.63,
886.53,
2482.27,
4305.12,
3421.58,
65644.12,
1020.51,
2659.57,
3191.49,
20284508.4,
1881279.27,
11675415.09,
7557862.28,
921090.46,
622104.32,
289267.36,
183.41,
886.53
};
Sheet sheet = workbook.createSheet();
Row row = null;
Cell cell = null;
for (int r = 0; r < values.length; r++) {
row = sheet.createRow(r);
cell = row.createCell(0);
cell.setCellValue(values[r]);
}
row = sheet.createRow(values.length);
cell = row.createCell(0);
//cell.setCellFormula("IRR(A1:A" + values.length + ",0.1)"); // will not work
cell.setCellFormula("IRR(A1:A" + values.length + ",-0.1)"); // will work
FormulaEvaluator formulaEvaluator = workbook.getCreationHelper().createFormulaEvaluator();
CellValue cellValue = formulaEvaluator.evaluate(cell);
System.out.println(cellValue);
workbook.write(fileout);
}
}
}