2012-11-19 36 views
0

从查询创建电子表格时,生成的电子表格不允许格式化某个日期时间数据类型的列。Coldfusion生成的电子表格不允许列格式化

电子表格创作是:

<cfset filenametouse = 'AllCaseData' /> 
    <!---Set directory and full file path---> 
    <cfset theDir = GetDirectoryFromPath(GetCurrentTemplatePath()) /> 
    <!---Attach file extension to full file path and file name---> 
    <cfset theFile = theDir & filenametouse & ".xls" /> 
    <cflock name="fileActionSentItems" type="exclusive" timeout="30" throwontimeout="true"> 
     <cfset SpreadsheetObj = spreadsheetNew()> 
     <!---<cfset fcol = {}> 
     <cfset fcol.dataformat = "@">---> 
     <!---Create the column headings---> 
     <cfset SpreadsheetAddRow(SpreadsheetObj, "Case_Number,Ship_Start,Projected_$,VA_$,Customer_ID,Customer,Project_Description,Stage,Sales,PM,J_Count,O_Count,S2_Count,S_Count,I_Count")> 
     <!---add the column data to the spreadsheet---> 
     <cfset SpreadsheetAddRows(SpreadsheetObj, caseData) /> 

     <cfset SpreadsheetFormatColumn(SpreadsheetObj, {dataformat="m/d/yyyy"}, 2)> 


     <!---Generate the spreadsheet---> 
     <cfspreadsheet action="write" filename="#theFile#" name="SpreadsheetObj" sheetname="Sheet1" overwrite="true" /> 

    </cflock> 
    <cftry> 
     <cflock name="fileActionSentItems" type="exclusive" timeout="30" throwontimeout="true"> 
      <cfmail to="#session.authUser.getEmail()#" from="[email protected]" subject="All Case Data" type="html" > 
       <cfmailparam file="#theFile#" remove="true" /> 
       <p>The requested data is attached.</p> 
      </cfmail> 
     </cflock> 
     <cfcatch type="any" > 
      <cffile action="delete" file="#theFile#" /> 
     </cfcatch> 
    </cftry> 
    <cfoutput><h3 style="margin-top: 1em;">Email sent to <cfoutput>#session.authUser.getEmail()#</cfoutput></h3></cfoutput> 

所有的数据是正确的,并在正确列,不过“Ship_Start”栏自带的格式相似,2012年11月27日00:00:00.000,并且无法在Excel中更改为任何其他格式。

如果我在SQL Server Management Studio中手动运行查询,然后将结果与标题复制到Excel,数据可以格式化。我还创建了一个Excel模板,其中的列标题格式化并使用数据填充模板,但即使使用“日期”格式化该列也无法格式化。

我可能会错过什么?

+1

您运行的是哪种ColdFusion版本?你能格式化电子表格中的任何列吗?您是否尝试过使用[SpreadsheetFormatColumn](http://help.adobe.com/zh_CN/ColdFusion/9.0/CFMLRef/WSc3ff6d0ea77859461172e0811cbec22c24-6806.html)格式化列? –

+0

这个应用程序驻留在CF9盒子上。我刚刚完成了SpreadsheetFormatColumn的测试,它会影响除“Ship_Start”之外的所有列。我注意到在Excel文件中,看起来像列中的数据后面有一个空格:“2012-11-27 00:00:00.0 ” – aparker81

+0

我的问题已经添加了SpreadsheetFormatColumn更新。完整的CF版本是9,0,1,274733。 – aparker81

回答

1

这似乎是一个错误。有关这方面的一些很好的讨论 Raymond Camden的博客 - HERE。讨论在底部的用户评论中。看起来Ray真的进入了这个错误。我想我找到了它 - HERE

我发现了两条可能对您有帮助的评论。他们是解决方法,但也许会让你感动。我有BOLDED我认为适用的评论部分,但您可能想阅读Ray的博客上的所有评论,以便将它们置于上下文中。


*** BEGIN引述博客文章 ***

首先评论发表莱斯Konley表示,二零一一年六月二十零日在上午11时12分

雷&詹姆斯,我有关于CFSPREADSHEET和Excel无法识别结果日期字段的其他信息。首先,我们的代码既使用查询对象,也设置显式日期格式[即cfset temp = QuerySetCell(GetExcelReport,“FollowUpDate”,“DateFormat(GetResult.FollowUpDate,”MM/DD/YYYY“))]] 。当我们在Excel中打开电子表格(使用CFSPREADSHEET构建)时,日期列被格式化为普通文本或常规(左对齐)。在此网站上(http://www.appnitro.com/forums/topic/excel-不要...)提供了解决方法,因此业务用户可以突出显示该列(在Excel中),然后选择数据>文本到列,然后单击向导上的完成(无需通过它)...和日期字段现在被Excel识别为DATE。我们可能需要恢复在生产服务器上安装MS Office,并且如果业务用户决定不再需要这个添加的次要文件,则继续使用旧的CFX_Excel标记不便之处,至少在未来的版本中纠正特定的错误用于向Adobe提交有关此问题的错误报告。通过丹墨菲说发表于2011年7月22日在上午10时44

詹姆斯,雷和Les



第二个评论 - 我知道我有点太迟了在这里,但我想我只是找到了Excel中日期格式的解决方法,这对我来说一直很好。 首先,我使用基于另一个查询的querynew创建我自己的查询,并使用它来导出到Excel。如果我将querynew中的数据类型设置为cf_sql_varchar而不是date或cf_sql_timestamp,然后将查询输出到Excel电子表格,它将采用您提供的任何格式。如果您在那里停留,Excel仍然会将数据视为文本,而不是实际日期(尽管格式正确)。其次,只需使用spreadsheetFormatColumns设置数据格式以匹配您在查询中指定的格式,并且Excel现在将其全部识别为日期。 Ray,我正在使用CFLib中的DateTimeFormat函数,所以下面就是我为什么这么做的。 (这显然只是其中的一部分,但你会发现这个想法)。

这里的查询......

<cfset mys = QueryNew("OrderNumber,InScan,OutScan","cf_sql_varchar,cf_sql_varchar,cf_sql_varchar")> 
<cfloop query="qryThroughputScans"> 
<cfset queryAddRow(mys)> 
<cfset querySetCell(mys,"OrderNumber",NumberFormat(qryThroughputScans.OrderNumber,000000))> 
<cfset querySetCell(mys,"InScan",DateTimeFormat(qryThroughputScans.InScan))> 
<cfset querySetCell(mys,"OutScan",DateTimeFormat(qryThroughputScans.OutScan))> 
</cfloop> 

然后,我创建Excel电子表格后使用列格式...

<cfset spreadsheetFormatColumns(s, 
{ 
alignment="center", 
dataformat="m/d/yyyy h:mm AM/PM" 
}, 
"2-3")> 

我古灵精怪的格式,测试了这一点只是为了确保它能够工作,并且我取得了巨大的成功。也许这已经是众所周知的,但是当我正在寻找修复程序时,我找不到任何东西。希望当他们去寻找日期问题的答案时,这可以帮助别人解决问题。

感谢, 丹


*** END引述博客文章不幸的是,格式支持缺乏 ***

+0

是的,看起来你是对的。整天都在逼我疯了。我会建议用户使用文本到列的方法,因为他需要自己格式化数据。感谢您的帮助! – aparker81

1

。如果您正在运行Windows,您可以简单地使用循环来执行此操作。SpreadSheetSetCellValue

<cfset obj = spreadsheetNew()> 
<cfset SpreadSheetAddRow(obj, "Case_Number,Ship_Start")> 
<cfset SpreadSheetAddRows(obj, yourQuery)> 
<cfset spreadsheetFormatColumns(obj, {dataformat="m/d/yyyy"}, 2)> 
<cfloop query="yourQuery"> 
    <cfset theValue = yourQuery.Ship_Start[currentRow]> 
    <cfif IsDate(theValue)> 
     <!--- offset by 1 row for header ---> 
     <cfset SpreadSheetSetCellValue(obj, theValue.toDouble(), currentRow+1, 2)> 
    </cfif> 
</cfloop> 

<cfset SpreadSheetWRite(obj, theFilePath, true)>