首页 文章

Apache poi edate公式没有实现?

提问于
浏览
3

我正在尝试在生成电子表格时实现几个公式 . 我已经实现了一个简单的SUM()公式 . 现在我正在尝试实现一个使用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应该被实现 . 我试图获取支持的函数名称,以查看我的实现是否没有实现它,但在下面的第一行有一个“未找到类: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不是很了解;我有没有机会宣布这个公式不正确?

EDIT:

Per Leigh的提示如下,我决定尝试使用其他Excel公式来完成EDATE正在做的事情 . 起初,我认为使用无效月份(<1或> 12)创建日期是不可能的......但是,请注意,DATE函数确实接受无效月份 . 所以,这就是我提出的:

=DATE(YEAR($AQ$1),SUM(MONTH($AQ$1),-INT(AC4)),DAY($AQ$1))

希望这会让我不用担心更新POI或等待CF11最终获得批准 .

1 回答

  • 3

    根据poi文档,EDATE应该被实现

    它是,但它是在较新版本的POI中实现的 . 由于听起来您使用的是与CF10捆绑在一起的原始POI jar,因此您受到旧版本支持的任何功能的限制,遗憾的是不包括 EDATE . 您需要使用更新版本的POI . FWIW,该功能在CF11下运行,后者附带POI 3.9(参见示例) . 所以你至少需要POI 3.9(最好是新的) .

    对于CF10,最简单的选择是下载更新版本的POI并通过新设置this.javaSettings在Application.cfc中动态加载它 . 它基本上是Mark Mandel's JavaLoader.cfc的一小部分 . 只需指定要加载的各个 jar 的路径,或指定要检查 jar 的整个目录,即

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

相关问题