Sto lavorando su un codice che genera un foglio di calcolo di Excel lato server e poi lo scarica per l'utente. Sto usando ExcelPackage per generare il file.file Download .xlsx utilizzando Response.TransmitFile()
La generazione sta lavorando bene. Posso aprire i file generati utilizzando Excel 2007 senza problemi. Ma, ho problemi a scaricare il file con Response.TransmitFile()
.
In questo momento, ho il seguente codice:
//Generate the file using ExcelPackage
string fileName = generateExcelFile(dataList, "MyReportData");
Response.AddHeader("content-disposition", "attachment;filename=FileName.xls");
Response.ContentType = "application/vnd.xls"
Response.Charset = "";
Response.TransmitFile(fileName);
Quando Excel 2007 apre il file scaricato come sopra, dà l'avvertimento "formato di file non corrisponde estensione". Dopo aver fatto clic sull'avviso, Excel visualizza i contenuti xml originali del file.
Se cambio l'estensione del file, in questo modo
Response.AddHeader("content-disposition", "attachment;filename=FileName.xlsx");
Excel 2007 fornisce un "Excel trovato contenuto illeggibile nel file" errore, seguito da una finestra di dialogo che offre per individuare un convertitore sul web. Se faccio clic su "no" in questa finestra di dialogo, Excel è in grado di caricare i dati.
Ho anche sperimentato diversi tipi MIME, come application/vnd.ms-excel
e application/vnd.openxmlformats-officedocument.spreadsheetml.sheet
, combinato con estensioni di file .xls e .xlsx. Tutte le combinazioni risultano in uno dei due comportamenti sopra menzionati.
Qual è la corretta combinazione di estensione del file e il tipo MIME da utilizzare in questo scenario? Cos'altro potrebbe causare questo errore, a parte un tipo o un'estensione MIME impropria?
FYI, questo sta accadendo con il server web integrato di sviluppo di Visual Studio. Non ho ancora provato con IIS.
Impostazione dell'intestazione Content-Length ha fatto il trucco. In alternativa, anche chiamata Response.End() dopo TransmitFile() ha funzionato. Quindi, immagino che il browser non sapesse dove si trovava la fine della risposta? – Odrade
Senza impostare l'intestazione Content-Length o chiamando Response.End(), il browser interpreta in modo errato le dimensioni del file e salva troppi dati nel file. Grazie per l'aiuto! – Odrade
Content-Length è sicuramente il modo per andare qui. Ho trovato alcune informazioni utili su Response.End() sul blog di Rick Strahl che dovrebbero essere condivise con i futuri visitatori di questa pagina: http://west-wind.com/weblog/posts/368975.aspx – Odrade