无法使用ColdFusion创build适当的Excel电子表格

我有一个来自客户端的请求来从查询生成一个Excel电子表格。 我有查询踢出领域,我可以生成Excel文件顺利。 当客户端接受这个Excel文件,然后试图操纵它时,问题就来了。

大部分麻烦来自应该被标记为货币或date的字段。 我有一些挣扎,能够产生一个“真正的”date字段。 在此之前,Excel没有正确sortingdate。 我可以使用下面的代码来调用Excel公式。 DateValue强制Excel将其确认为实际date字段。 但是,通过Excel处理该文件时会失败。

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

接下来的问题是货币领域。 我无法让Excel将价值确认为货币。 它总是出现习惯。 当这个设置时, SUM函数将不能在Excel中工作。 您可以单独添加字段,如A1+B1+C1 = TOTAL 。 但是,如果有200行,这不会有帮助。

我能够从另一个CF程序员得到一个类似情况的build议。 他先用正确的标题生成Excel文件,并将列设置为适当的字段,如date和货币等。

下一步将是逐行填写字段,并且应该正确格式化。

码:

 <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"> 

单元格中的数据已被正确格式化。 生成此文件并将其传输给用户时,列未按预期格式化。

其他人是否知道这种方法是否可行或者有更好的build议让CF为Excel生成一个合适的date和货币区域来确认?

在RHEL 5上运行的Adobe ColdFusion v10。

这里的每个请求都是一些使用queryNe w的代码,它将生成代码date和货币。

第一步:我创build了第一行冻结的Excel文件,它具有列标题。 第一列被指定为格式为长date的date – mm / dd / yyy; 第二列是已经设定为货币的美元。

我读取该文件,然后填写行并将文件stream式传输给用户进行下载。

 <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表格中打开文件。 testing一个,第一行冻结,我们应该能够在date字段sorting。 我的结果是:date没有被正确sorting。 在货币列2,如果我们尝试做一个SUM工作! 这之前并没有奏效,但是现在呢。

另外,当我尝试打开文件时,我给出了这个文件已损坏的警告,Excel将尝试打开它。 Google表格中没有这样的警告。

使用date单元格时,CF可能有点古怪。 当手动input一个值时,Excel很适合猜测正确的单元格types。 但是,CF有点棘手。 由于CF是相对无types的,它并不总是正确匹配值和单元格types。 使用使用查询对象而不是SpreadsheetSetCellValue()的函数通常会产生更好的结果。 很可能是因为查询对象包含值和数据types。 虽然从CF11开始, SpreadsheetSetCellValue支持一个新的数据参数,它允许您指定值和单元格数据types。 由于您使用CF10,请尝试使用SpreadsheetAddRows来填充值。

对于文件损坏的警告,是由于下载代码中的实际文件内容和文件扩展名不匹配造成的。 代码是在一个.xlsx文件中读取,但下载声称它是一个。 xls (application / msexcel)文件。 为了摆脱这个错误,确保两个匹配。

这是一个使用CF11进行testing的实例

 <!--- 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">