0

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

电子表格的创建是:

    <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="noreply@pratt.com" 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 模板,其中列标题已格式化并用数据填充模板,但即使使用“日期”格式化该列也无法格式化。

我会错过什么?

4

2 回答 2

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)>
于 2012-11-19T22:27:25.170 回答
1

这似乎是一个错误。在 Raymond Camden 的博客上对此有一些很好的讨论 -这里。讨论在底部的用户评论中。看起来雷实际上为此输入了错误。我想我找到了 -这里

我找到了两条可能对你有帮助的评论。它们是解决方法,但也许可以让您动起来。我已将我认为适用的评论部分加粗,但无论如何您可能都想通读 Ray 博客上的所有评论,以了解它们的上下文。


***开始引用博客条目*** Les Konley

发表的第一条评论 发表于2011 年 6 月 20 日上午 11:12

Ray & James,我有关于 CFSPREADSHEET 和 Excel 无法识别结果日期字段的其他信息。首先,我们的代码既使用了查询对象,也设置了明确的日期格式 [ie, 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 标签,至少在未来版本中纠正该特定错误之前。感谢您向 Adob​​e 提交有关此问题的错误报告。



Dan Murphy 发表于 2011 年 7 月 22 日上午 10:44 发表的第二条评论

James、Ray 和 Les - 我知道我在这里玩游戏有点晚了,但我想我刚刚找到了 Excel 中日期格式的解决方法,对我来说效果很好。首先,我使用基于另一个查询的 querynew 创建自己的查询,并使用它导出到 Excel。如果我将 querynew 中的数据类型设为 cf_sql_varchar 而不是 date 或 cf_sql_timestamp,然后将查询输出到 Excel 电子表格,它将采用您提供的任何格式。如果您停在那里,Excel 仍会将数据视为文本,而不是实际日期(尽管格式正确)。其次,只需使用电子表格格式列设置数据格式以匹配您在查询中指定的格式,Excel 现在将其全部识别为日期。雷,我正在使用你的 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")>

我用各种奇怪的格式对其进行了测试,以确保它可以正常工作,并且我取得了巨大的成功。也许这已经众所周知,但是当我寻找修复时我找不到任何东西。希望这可以帮助某人在寻找日期问题的答案时有所帮助。

谢谢,丹


***结束引用的博客条目***

于 2012-11-19T20:57:08.913 回答