Coldfusion Apache poi edate公式未实现?

Coldfusion Apache poi edate公式未实现?,coldfusion,excel-formula,apache-poi,coldfusion-10,Coldfusion,Excel Formula,Apache Poi,Coldfusion 10,我试图在生成电子表格时实现几个公式。我已经实现了一个简单的SUM()公式。现在我尝试实现一个使用EDATE()的。这是原始电子表格中显示的公式: =EDATE($AQ$1,-(AC4)) 根据poi文件,应实施EDATE。我试图获取支持的函数名,以查看我的实现是否没有实现它,但在下面的第一行出现了“未找到类:org.apache.poi.ss.formula.eval.FunctionEval”错误: var fe = createObject("java","org.apache.poi.ss

我试图在生成电子表格时实现几个公式。我已经实现了一个简单的SUM()公式。现在我尝试实现一个使用EDATE()的。这是原始电子表格中显示的公式:

=EDATE($AQ$1,-(AC4))

根据poi文件,应实施EDATE。我试图获取支持的函数名,以查看我的实现是否没有实现它,但在下面的第一行出现了“未找到类: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,该函数在随POI 3.9一起发布的CF11下工作(参见示例)。因此,您至少需要POI 3.9(最好更新)

对于CF10+,最简单的选择是下载较新版本的POI,并通过新设置将其动态加载到Application.cfc中。这基本上是一个扯皮。只需指定要加载的各个JAR的路径,或者指定检查JAR的整个目录,即

      // Note - Application must be restarted to apply the settings
      THIS.javaSettings = {LoadPaths = [".\folderWithPOIJars\"] };

<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()#">

工作簿=CreateObject(“java”,“org.apache.poi.xssf.usermodel.XSSFWorkbook”).Init();
sheet=WorkBook.CreateSheet(JavaCast(“字符串”、“我的sheetname”);
//为了简单起见,请使用单元格A1-A5
//模拟AC4公式中使用的行
createRow(0).createCell(0).setCellValue(javacast(“float”,5));
sheet.createRow(1).createCell(0).setCellValue(javacast(“float”,7));
//模拟AC4公式
sheet.createRow(2.createCell(0.setCellFormula)(“和(A1:A2)”);
//模拟由Oracle日期填充的单元格
sheet.createRow(3.createCell(0.setCellValue)(now());
//最后,应用EDATE公式
sheet.createRow(4.createCell(0.setCellFormula)(“EDATE($A$4,-(A3))”);
//使用二进制流,因为trycf.com出于安全原因不支持文件
baos=createObject(“java”,“java.io.ByteArrayOutputStream”).init();
练习册。书写(BAS);
baos.close();

该类应该出现在Apache POI的所有最新副本中-您可能使用的是非常旧的版本吗?如果是这样,升级时会发生什么?@Gagravarr-他们确实使用了与CF10捆绑在一起的旧版本(3.6-beta1)。升级肯定会解决这个错误。从下面的评论来看,这听起来像是目前正在等待管理层的批准。好的,我们将尝试一下。不幸的是,我们需要在这里安装新的/更新的软件。我知道这是怎么回事。不幸的是,如果您想使用该函数,动态加载较新版本可能是最好的选择。除此之外,您是否研究过是否可以使用不同的Excel公式复制EDATE结果?我将您的评论作为一个提示。请参阅我更新的问题;-)干得好。你应该把它作为一个官方的“答案”发布,这样它就更明显了。而且,人们可以通过这种方式对它和问题进行投票:——)
<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()#">