2016-07-27 16 views
4

In einer ColdFusion-Anwendung muss ich es Benutzern ermöglichen, eine Tabelle auf ihren Festplatten zu speichern.ColdFusion: Wie kann ich eine Tabelle erstellen, ohne sie als Datei zu speichern?

Ich konnte Dateien im laufenden Betrieb generieren, indem Sie sie als XML- oder HTML-Tabellen erstellen, den application/vnd.ms-excel MIME-Typ anwenden und sie mit einer .xls-Erweiterung speichern.

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

Aber wenn Benutzer eine solche Datei zu laden, sie immer eine lästige Nachricht erhalten (aufgrund Excel's Extension Hardening Feature):

Die Datei, die Sie versuchen, zu öffnen ‚_____ xls‘ ist in ein anderes Format als durch die Dateiendung angegeben. Stellen Sie vor dem Öffnen der Datei sicher, dass die Datei nicht beschädigt ist und von einer vertrauenswürdigen Quelle stammt. Möchten Sie die Datei jetzt öffnen?

Ich würde diese Nachricht lieber vermeiden.

Ich verstehe die <cfspreadsheet> Tag und SpreadsheetWrite() Funktionen generieren eine ordnungsgemäße Excel-Datei, die diese Meldung nicht anzeigt - aber sie beide erfordern ein Argument an, wo auf dem Server die Datei geschrieben werden soll. Da der Download möglicherweise vertrauliche Informationen enthält und ich die Sicherheit nicht einfach erzwingen kann, nachdem eine Datei auf den Server geschrieben wurde, möchte ich keine solche Datei erstellen - auch nicht vorübergehend. (Ich weiß, dass ich ein Passwort angeben kann, aber dies ist keine ideale Lösung im Kontext des Geschäftsprozesses, in dem die Excel-Datei nach der Generierung verwendet wird.)

Wie kann ich die Excel-Datei generieren und Aufforderung zum Download ohne zuerst in eine Datei schreiben?

Antwort

6

Nach dem Durchforsten Stack Overflow und andere Ressourcen für dieses Problem, fand ich schließlich die Lösung im Kontext einer anderen Frage. Ich schreibe jetzt die Frage und meine Ergebnisse hier in der Hoffnung, dass andere diese Informationen leichter finden werden als ich. Die Lösung dreht sich um die SpreadsheetReadBinary() Funktion und das variable Attribut im <cfcontent> Tag.

baute ich eine Tabelle, die ColdFusion spreadsheet functions verwenden, und die dann am Ende folgenden setzen der Datei (entgegen meiner Gewohnheit <cfheader> und <cfcontent> zu Beginn der Umsetzung).

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

Wenn jemand würde von mehr Detail profitieren, die folgenden Inhalte in einer .cfm Datei wird die Tabelle und prompt zum Download als richtig geformten Excel-Datei erstellen:

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