2016-07-27 18 views
4

ColdFusionアプリケーションでは、ユーザーがスプレッドシートをハードドライブに保存できるようにする必要があります。ColdFusion:ファイルとして保存せずにスプレッドシートを生成するにはどうすればよいですか?

application/vnd.ms-excel MIMEタイプを適用し、.xls拡張子を付けて保存することで、XMLまたはHTMLテーブルとしてファイルを作成して、その場でファイルを生成することができました。

<cfheader name="Content-Disposition" value="attachment; filename=MySpreadsheet.xls"> 
<cfcontent type="application/vnd.ms-excel"> 

しかし、ユーザーは、このようなファイルをロードするとき、彼らは必ず(原因Excel's Extension Hardening Featureに)迷惑なメッセージを取得:

開こうとしているファイルを、「_____ XLS」、Aでありますファイル拡張子で指定されたものとは異なるフォーマット。ファイルを開く前に、ファイルが破損しておらず、信頼できるソースからのものであることを確認してください。今すぐファイルを開きますか?

私はこのメッセージを避けることをお勧めします。

<cfspreadsheet>タグとSpreadsheetWrite()の機能は、このメッセージを表示しない適切なExcelファイルを生成することを理解していますが、どちらのファイルにサーバー上のどこにファイルを書き込むかを指示する引数が必要です。一時的にでも - ダウンロードは機密情報が含まれている場合があり、およびファイルがサーバーに書き込まれた後、私は簡単にセキュリティを適用することはできませんので、私はそのようなファイルを作成する必要はありませんので。 (私はパスワードを提供することができますが、これはExcelファイルが生成された後に使用されるビジネスプロセスの中では理想的なソリューションではありません)。

Excelファイルを生成する方法ダウンロードなしでを最初にファイルに書き込みますか?

答えて

6

この問題のためにスタックオーバーフローおよびその他のリソースを精練した後、私は最終的に別の質問の文脈で解決策を見つけました。私は今、他の人がより簡単に私がやったよりも、この情報を見つけることを期待して、ここで問題と私の調査結果を掲載しています。

<cfcontent>タグのSpreadsheetReadBinary()関数とvariable属性を中心に解があります。

私はColdFusion spreadsheet functionsを使用してスプレッドシートを構築し、その後、ファイルの終わり(最初に<cfheader><cfcontent>を置くことの私の習慣に反し)で次のように置きます。

<cfheader name="Content-Disposition" value="attachment; filename=MySpreadsheet.xls"> 
<cfcontent type="application/vnd.ms-excel" variable="#SpreadsheetReadBinary(objSpreadsheet)#"> 

誰もが詳細恩恵を受ける場合は、スプレッドシートを構築し、適切に形成されたExcelファイルとしてダウンロードを促します.cfmファイルに次の内容:

<!--- 
Building a spreadsheet that looks like: 

+-----+-----+-----+ 
| FOO | BAR | BAZ | 
+-----+-----+-----+ 
| 101 | 102 | 103 | 
+-----+-----+-----+ 
| 201 | 202 | 203 | 
+-----+-----+-----+ 

---> 


<!--- Create a new spreadsheet. ---> 
<cfset objSpreadsheet = SpreadsheetNew()> 

<!--- Create and format the header row. ---> 
<cfset SpreadsheetAddRow(objSpreadsheet, "FOO,BAR,BAZ")> 
<cfset SpreadsheetFormatRow(objSpreadsheet, {bold=TRUE, alignment="center"}, 1)> 

<!--- Populate the spreadsheet. ---> 
<!--- In a real situation, this would be looped programmatically; it is done cell-by-cell here for readability. ---> 
<cfset SpreadsheetSetCellValue(objSpreadsheet, 101, 2, 1, "NUMERIC") > 
<cfset SpreadsheetSetCellValue(objSpreadsheet, 102, 2, 2, "NUMERIC") > 
<cfset SpreadsheetSetCellValue(objSpreadsheet, 103, 2, 3, "NUMERIC") > 
<cfset SpreadsheetSetCellValue(objSpreadsheet, 201, 3, 1, "NUMERIC") > 
<cfset SpreadsheetSetCellValue(objSpreadsheet, 202, 3, 2, "NUMERIC") > 
<cfset SpreadsheetSetCellValue(objSpreadsheet, 203, 3, 3, "NUMERIC") > 

<cfheader name="Content-Disposition" value="attachment; filename=MySpreadsheet.xls"> 
<cfcontent type="application/vnd.ms-excel" variable="#SpreadsheetReadBinary(objSpreadsheet)#"> 
関連する問題