2016-05-24 104 views
3

我有一個來自客戶端的請求,用於從查詢生成Excel電子表格。我有查詢踢出的領域,我可以生成Excel文件沒有順利。當客戶端接受該Excel文件並嘗試操作時,問題就出現了。無法使用ColdFusion創建適當的Excel電子表格

大部分麻煩來自於應標記爲貨幣或日期字段。我有一些掙扎,能夠產生一個「真正的」日期字段。在這個Excel沒有正確排序日期之前。我可以使用下面的代碼來調用Excel公式。 DateValue強制Excel將其確認爲真實的日期字段。但是,這個文件通過Excel進行操作時失敗。

<cfset SpreadsheetSetCellFormula(s 
      ,"DATEVALUE(#Chr(34)##Replacement_ETD##Chr(34)#)" 
      , therow 
      , 9)> 

接下來的問題是貨幣字段。我無法讓Excel將價值確認爲貨幣。它總是出現習慣。設置此項時,SUM函數在Excel中不起作用。您可以單獨添加字段,如A1+B1+C1 = TOTAL。但是,如果有200行,這將不會有幫助。

我能夠從另一個CF程序員誰也有類似的情況得到的建議。他首先用正確的標題生成Excel文件,並將列設置爲適當的字段,如日期和貨幣等。

下一步將是逐行填寫字段,並且它們應該被正確格式化。

代碼:

<cfset filename = expandPath("./reports/arrivals.xlsx")> 
<cfspreadsheet action="read" src = "#filename#" name = "s" > 
<cfset therow = 0> 
<cfoutput query="myExcel" startrow="1"> 
    <cfset therow = myExcel.currentrow + 1> 
    <cfset SpreadsheetSetCellValue(s, Incumbent, therow, 1)> 
    <cfset SpreadsheetSetCellValue(s, Section, therow, 2)> 
    <cfset SpreadsheetSetCellValue(s, Position_Number, therow, 3)> 
    <cfset SpreadsheetSetCellValue(s, Position_Title, therow, 4)> 
    <cfset SpreadsheetSetCellValue(s, Incumbent_Emplyment_Type, therow, 5)> 
    <cfset SpreadsheetSetCellValue(s, Incumbent_ETD, therow, 6)> 
    <cfset SpreadsheetSetCellValue(s, Tour_Comments, therow, 7)> 
    <cfset SpreadsheetSetCellValue(s, Replacement, therow, 8)> 
    <cfset SpreadsheetSetCellValue(s, Replacement_ETA, therow, 9)> 
</cfoutput>  
<cfheader name="content-disposition" value="attachment; filename=Departures_(#DateFormat(now(),'mmddyy')#).xls"> 
<cfcontent type="application/msexcel" variable="#spreadsheetReadBinary(s)#" reset="true"> 

的數據在細胞已經被正確格式化。當此文件生成並流式傳輸給用戶時,列未按預期格式化。

沒有任何人知道,如果這個方法將工作或在得到CF產生一個適當的日期和貨幣領域爲Excel承認一個更好的建議?這裏RHEL 5

每請求

Adob​​e ColdFusion,請V10跑是使用queryNe瓦特將生成代碼日期和貨幣的一些代碼。

步驟一:我創建了第一排凍結Excel文件,它有列標題。第一列已被指定爲格式爲長日期的日期 - mm/dd/yyy;第二列是已設定爲貨幣的美元。

我讀文件,然後填寫行和文件流給用戶下載。

<cfset filename = expandPath("./reports/Test.xlsx")> 

<cfspreadsheet action="read" src = "#filename#" name = "s" > 

<cfset myQuery = QueryNew("MyDate, Dollar", "Date, Decimal")> 

<cfset newRow = QueryAddRow(MyQuery, 5)> 

<cfset temp = QuerySetCell(myQuery, "MyDate", "03-11-2000", 1)> 
<cfset temp = QuerySetCell(myQuery, "Dollar", "403.45", 1)> 

<cfset temp = QuerySetCell(myQuery, "MyDate", "01-01-2009", 2)> 
<cfset temp = QuerySetCell(myQuery, "Dollar", "603.22", 2)> 

<cfset temp = QuerySetCell(myQuery, "MyDate", "09-21-2013", 3)> 
<cfset temp = QuerySetCell(myQuery, "Dollar", "103.55", 3)> 

<cfset temp = QuerySetCell(myQuery, "MyDate", "01-15-2005", 4)> 
<cfset temp = QuerySetCell(myQuery, "Dollar", "3.33", 4)> 

<cfset temp = QuerySetCell(myQuery, "MyDate", "07-22-2003", 5)> 
<cfset temp = QuerySetCell(myQuery, "Dollar", "13.75", 5)> 

<cfset therow = 0> 
<cfoutput query="myQuery" startrow="1"> 
    <cfset therow = myQuery.currentrow + 1> 

    <cfset SpreadsheetSetCellValue(s, DateFormat(MyDate, 'mm/dd/yyyy'), therow, 1)> 
    <cfset SpreadsheetSetCellValue(s, Dollar, therow, 2)> 
    #myQuery.currentrow# <br> 
    #myQuery.MyDate# <br> 
    #myQuery.Dollar# <br> 
</cfoutput>   

<cfheader name="content-disposition" value="attachment; 
        filename=Departures_(#DateFormat(now(),'mmddyy')#).xls"> 
<cfcontent type="application/msexcel" variable="#spreadsheetReadBinary(s)#" reset="true"> 

您可以在MS Excel或Google表格中打開該文件。測試一個,第一行凍結,我們應該能夠在日期字段上排序。我的結果是:日期未正確排序。在貨幣列2上,如果我們試着去做一個可以工作的SUM!這以前並沒有奏效,但現在它已經完成。

此外,當我嘗試打開我給出的警告,這文件已損壞,Excel將嘗試打開該文件。 Google表格中沒有這樣的警告。

+0

像「失敗」測試工作示例和「行不通」是很曖昧。你可以請提供一個我們可以測試的小型[* stand-alone * example](http://stackoverflow.com/help/mcve),它能證明這個問題?提示,你可以使用'QueryNew()'生成一個手動查詢,所以這個例子不需要數據庫查詢。 – Leigh

+0

@好的東西。我將鞭打起來,舉例並編輯帖子。 – weggie

+0

@Leigh代碼更新了一個例子和我的測試結果。謝謝。 – weggie

回答

0

使用日期單元格時,CF可能有點古怪。當手動輸入值時,Excel很適合猜測正確的單元格類型。但是,這對CF來說有點棘手。由於CF相對無類型,它並不總是正確匹配值和單元格類型。使用利用查詢對象而不是SpreadsheetSetCellValue()的函數通常會產生更好的結果。很可能是因爲查詢對象包含兩個值和數據類型。雖然從CF11開始,SpreadsheetSetCellValue支持新的數據參數,它允許您指定值和單元格數據類型。由於您使用的是CF10,因此請嘗試使用SpreadsheetAddRows來填充值。

關於文件損壞的警告,是由於下載代碼中的實際文件內容和文件擴展名不匹配造成的。該代碼正在讀取.xlsx文件,但下載聲稱它是。 xls(application/msexcel)文件。爲了擺脫這個錯誤,確保兩個匹配。

這裏是CF11

<!--- 
    Test.xlsx contains two columns, with headers on row 1 
    - Column A format: *m/d/yyyy 
    - Column B format: number with 2 decimal places 
---> 
<cfspreadsheet action="read" src="c:/temp/Test.xlsx" name="sheet" > 

<cfset myQuery = QueryNew("")> 
<cfset QueryAddColumn(MyQuery, "Dollar", "Decimal", [ 403.45, 703.22, 103.55, 3.33, 13.75] )> 
<cfset QueryAddColumn(MyQuery, "MyDate", "date", [ parseDateTime("2000-03-11", "yyyy-mm-dd") 
               , parseDateTime("2009-01-01", "yyyy-mm-dd") 
               , parseDateTime("2013-09-21", "yyyy-mm-dd") 
               , parseDateTime("2005-01-15", "yyyy-mm-dd") 
               , parseDateTime("2003-07-22", "yyyy-mm-dd")]) > 

<cfset spreadsheetAddRows(sheet, myQuery)> 
<cfset spreadsheetFormatColumn(sheet, {dataFormat="m/d/yy"}, 1)> 
<cfset spreadsheetFormatColumn(sheet, {dataFormat="##,####0.00"}, 2)> 

<cfheader name="content-disposition" value="attachment; filename=Departures_(#DateFormat(now(),'mmddyy')#).xlsx"> 
<cfcontent type="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" variable="#spreadsheetReadBinary(sheet)#" reset="true"> 
+0

感謝您的幫助!我可以確認,使用這種方法,所有東西都會「乾淨」。 – weggie

相關問題