2016-07-29 99 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