【问题标题】:Apache poi edate formula not implemented?Apache poi edate 公式未实现?
【发布时间】:2016-07-29 13:54:07
【问题描述】:

我在生成电子表格时尝试实现几个公式。我已经实现了一个简单的 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 不太了解;有没有可能我错误地声明了公式?

编辑:

根据 Leigh 下面的提示,我决定尝试使用其他 Excel 公式来完成 EDATE 正在做的事情。起初,我认为不可能使用无效月份( 12 )创建日期......但是你瞧, DATE 函数确实接受无效月份。所以,这就是我想出的:

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

希望这能让我不必担心更新 POI 或等待 CF11 最终获得批准。

【问题讨论】:

  • 该类应该出现在所有最新的 Apache POI 副本中 - 您可能使用的是真正的旧版本吗?如果是这样,升级时会发生什么?
  • @Gagravarr - 他们确实使用的是与 CF10 捆绑在一起的旧版本(3.6-beta1)。升级肯定会解决该错误。从下面的 cmets 看来,目前正在等待管理层批准。

标签: coldfusion excel-formula apache-poi coldfusion-10


【解决方案1】:

根据 poi 文档,应该实现 EDATE

是的,但它是在更新版本的 POI 中实现的。由于听起来您使用的是与 CF10 捆绑在一起的原始 POI jar,因此您会受到该更旧版本支持的任何功能的限制,不幸的是不包括 EDATE。您将需要使用更新版本的 POI。 FWIW,该功能在 POI 3.9 附带的 CF11 下工作(参见示例)。所以你至少需要 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()#">

【讨论】:

  • 好的,试一试。不幸的是,我们需要跳过障碍才能在此处安装新的/更新的软件。
  • 我知道这是怎么回事。不幸的是,如果您想使用该功能,动态加载更新版本可能是最好的选择。除此之外,您是否研究过是否可以使用不同的 Excel 公式复制 EDATE 结果?
  • 我把你的评论当作提示。查看我更新的问题;-)
  • 干得好。您应该将其发布为官方“答案”,以便更明显。此外,这样人们就可以对它以及问题进行投票:-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-24
相关资源
最近更新 更多