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

これはバグのようです。レイモンドカムデンのブログでこれについてかなり良い議論があります-ここに。議論は下部のユーザーコメントにあります。レイが実際にこのバグに入ったようです。私はそれを見つけたと思います-ここに。

私はあなたを助けるかもしれないコメントの2つを見つけました。それらは回避策ですが、おそらく1つはあなたを動かすでしょう。私は、私が当てはまると思うコメントの部分を太字にしましたが、とにかくそれらを文脈に取り入れるために、レイのブログでそれらのコメントのすべてを読みたいと思うかもしれません


*** QUOTEDBLOGENTRIESを開始*** LesKonleySaid

による最初のコメント2011年6月20日午前11時12分

Ray&James、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タグを引き続き使用する必要があります。この問題についてアドビにバグレポートを提出していただきありがとうございます。



ダンマーフィーによって投稿された2番目のコメント2011年7月22日午前10時44分に言った

James、Ray、Les-私はここでゲームに少し遅れていることを知っていますが、Excelの日付形式の回避策を見つけただけでうまくいきました。まず、別のクエリに基づいてquerynewを使用して独自のクエリを作成し、それを使用してExcelにエクスポートしています。querynewのデータ型をdateやcf_sql_timestampではなくcf_sql_varcharにしてから、クエリをExcelスプレッドシートに出力すると、指定した形式になります。ここで停止すると、Excelはデータを実際の日付ではなく単なるテキストとして表示します(正しくフォーマットされていますが)。次に、spreadsheetFormatColumnsを使用してデータ形式を設定し、クエリで指定した形式と一致させると、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 に答える
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 に答える