Apache poi edate公式未执行?
我想在生成电子表格时实现几个公式。我已经实现了一个简单的SUM()公式。现在我试图实现一个使用EDATE()。这是式,因为它出现在原始电子表格:Apache poi edate公式未执行?
= EDATE($ AQ $ 1, - (AC4))
// this formula works - summing the previous two cells in each row
var formula = "SUM(AA4:AB4)";
sheet.getRow(3).getCell(28).setCellFormula(formula);
// problem formula
// cell AQ1 is populated by Oracle date
// cell AC4 is populated by a float from the previous formula
formula = "EDATE($AQ$1,-(AC4))";
// throws "Not implemented yet" error
sheet.getRow(3).getCell(29).setCellFormula(formula);
根据POI文档,EDATE应该来实现。我试图获得支持的函数名称,看看我有没有实现它的实现,但在下面的第一行中得到了“Class not found:org.apache.poi.ss.formula.eval.FunctionEval”错误:
var fe = createObject("java","org.apache.poi.ss.formula.eval.FunctionEval");
var fs = fe.getSupportedFunctionNames();
var fu = fe.getNotSupportedFunctionNames();
我在Excel中不是很懂行,任何机会我错误地宣布公式?
编辑:下面
每Leigh的提示,我决定使用其他Excel公式来完成什么EDATE正在做实验。起初,我不认为有可能使用无效的月份(< 1或> 12)创建日期......但是请注意,DATE功能确实接受无效的月份。所以,这就是我想出了:
=DATE(YEAR($AQ$1),SUM(MONTH($AQ$1),-INT(AC4)),DAY($AQ$1))
希望这将让我推迟担心更新POI或等待CF11终于获得批准。
根据POI文件,EDATE应该实施
它,但它是在POI的新版本中实现。由于听起来您正在使用与CF10捆绑在一起的原始POI jar,所以您受到该旧版本支持的任何功能的限制,遗憾的是不包括EDATE
。您将需要使用更新版本的POI。 FWIW,该功能可以在POI3.9附带的CF11下工作(参见示例)。所以你至少需要POI 3.9(最好更新)。
对于CF10 +,最简单的选择是下载较新版本的POI并通过新设置this.javaSettings动态加载到您的Application.cfc中。它基本上是Mark Mandel's JavaLoader.cfc的一个裂口。只要指定您希望各个罐装载,或者整个目录的路径检查罐子,即
// Note - Application must be restarted to apply the settings
THIS.javaSettings = {LoadPaths = [".\folderWithPOIJars\"] };
Runnable EDATE Example (CF11+)
<cfscript>
workBook = CreateObject("java", "org.apache.poi.xssf.usermodel.XSSFWorkbook").Init();
sheet = WorkBook.CreateSheet(JavaCast("string", "my sheetname"));
// For simplicity using cells A1 - A5
// Simulate rows used in AC4 formula
sheet.createRow(0).createCell(0).setCellValue(javacast("float", 5));
sheet.createRow(1).createCell(0).setCellValue(javacast("float", 7));
// Simulate AC4 formula
sheet.createRow(2).createCell(0).setCellFormula("SUM(A1:A2)");
// Simulate cell populated by Oracle date
sheet.createRow(3).createCell(0).setCellValue(now());
// Finally, apply EDATE formula
sheet.createRow(4).createCell(0).setCellFormula("EDATE($A$4,-(A3))");
// Using binary stream because trycf.com does not support files for security reasons
baos = createObject("java", "java.io.ByteArrayOutputStream").init();
workBook.write(baos);
baos.close();
</cfscript>
<!--- CF10 lacks support for script version of cfcontent --->
<cfheader name="Content-Disposition" value="inline; filename=test.xlsx">
<cfcontent type="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
variable="#baos.toByteArray()#">
该类应该存在于所有最近的Apache POI的副本 - 你可能在使用一个非常旧的版本吗?如果是这样,升级时会发生什么? – Gagravarr
@Gagravarr - 他们的确在使用与CF10捆绑在一起的旧版本(3.6-beta1)。升级肯定会解决错误。从下面的评论看来,这听起来像是目前正在等待管理层的批准。 – Leigh