2016-07-29 82 views
3

我想在生成电子表格时实现几个公式。我已经实现了一个简单的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终于获得批准。

+0

该类应该存在于所有最近的Apache POI的副本 - 你可能在使用一个非常旧的版本吗?如果是这样,升级时会发生什么? – Gagravarr

+0

@Gagravarr - 他们的确在使用与CF10捆绑在一起的旧版本(3.6-beta1)。升级肯定会解决错误。从下面的评论看来,这听起来像是目前正在等待管理层的批准。 – Leigh

回答

3

根据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()#"> 
+1

对于其他选项,另请参阅http://stackoverflow.com/a/25571824/104223 – Leigh

+0

好吧,会试试看。不幸的是,我们需要在这里安装新的/更新的软件。 – earachefl

+0

我知道那是怎么回事。不幸的是,如果你想使用该功能,动态加载更新的版本可能是最好的选择。除此之外,您是否考虑过是否可以用不同的Excel公式复制EDATE结果? – Leigh