2011-11-01 66 views
1

我正在構建一個asp.net網站,我正在構建基於一些gridview數據的Excel文檔。我使用Microsoft.Office.Interop.Excel來構建它。我試圖使用saveFileDialog框使用System.Windows.Forms。通過我的在線研究,我瞭解到你不能在asp.net應用程序中做到這一點?在調試模式下一切都很好,但是當它上傳到網站時,頁面根本不起作用。所以我的男人的問題是,是否有可能使用一個asp.net應用程序的saveFileDialog框?有誰知道一個很好的解決方法嗎?我將發佈在調試模式下工作良好的代碼,但在將代碼上傳到我的網站時不起作用。預先感謝您的幫助。如何從您的asp.net應用程序下載生成的excel文件

using System.Threading; 
using Excel = Microsoft.Office.Interop.Excel; 
using Microsoft.Office.Interop.Excel; 
using System.Windows.Forms; 

SaveFileDialog saveFileDialog1 = new SaveFileDialog(); 
Excel.Application xlApp = new Excel.Application(); 
Excel.Workbook xlWorkBook; 
Excel.Worksheet xlWorkSheet; 
object misValue = System.Reflection.Missing.Value; 

public void someEvent() 
{ 
    var t = new Thread(SaveFolder); 
    t.IsBackground = true; 
    t.SetApartmentState(ApartmentState.STA); 
    t.Start(); 
} 

public void SaveFolder() 
{ 
    saveFileDialog1.Filter = "Sources (*.xls, *.xlsx)|*.xls*;*.xlsx"; 
    saveFileDialog1.ShowDialog(); 
    exportReport(); 
} 

public void exportReport() 
{ 
    xlWorkBook.SaveAs(@saveFileDialog1.FileName, Excel.XlFileFormat.xlWorkbookNormal, misValue, misValue, misValue, misValue, Excel.XlSaveAsAccessMode.xlExclusive, misValue, misValue, misValue, misValue, misValue); 
    xlWorkBook.Close(true, misValue, misValue); 
    xlApp.Quit(); 

    releaseObject(xlApp); 
    releaseObject(xlWorkBook); 
    releaseObject(xlWorkSheet); 
} 

public void releaseObject(object obj) 
{ 
    try 
    { 
     System.Runtime.InteropServices.Marshal.ReleaseComObject(obj); 
     obj = null; 
    } 
    catch (Exception ex) 
    { 
     obj = null; 
     MessageBox.Show("Unable to release the Object " + ex.ToString()); 
    } 
    finally 
    { 
     GC.Collect(); 
    } 
} 
+0

它可能會顯示對話...在您的服務器上,沒有人在那裏看到它! –

回答

0

您無法在服務器上顯示對話框。沒有人在那裏看到它。擺脫整個saveFileDialog對象,只需在服務器的文件系統中使用生成的文件名調用SaveAs,該文件保證是唯一的。然後將該文件傳輸給您的用戶。

1

請勿使用Interop。建議使用HtmlTextWriter,StringWriter和GridView的組合。

public void GridViewToExcel() 
{ 
    Response.Clear(); 
    Response.AddHeader("content-disposition", "attachment;filename=MyFile.xls"); 
    Response.Charset = ""; 
    Response.ContentType = "application/vnd.xls"; 

    var writer = new System.IO.StringWriter(); 
    var htmlWriter = new HtmlTextWriter(writer); 

    GridView1.RenderControl(htmlWriter); 
    Response.Write(writer.ToString()); 
    Response.End(); 
} 
+0

如果你不能使用interop,你如何按你想要的方式格式化你的excel文件? – Marrs

+0

使用OpenXML版本的Excel文件(2007+)或Aspose等工具。 Interop Excel不是線程安全的,性能很糟糕,並且需要在服務器上安裝Excel。它的工作原理但並不理想。 –

2

你不能用保存對話框做你想做的。您應該將文件保存到服務器上的臨時位置。將文件保存到某個位置後,可以強制用戶下載文件。我通常遵循這個代碼(似乎在所有瀏覽器中工作最一致)。您必須提供filenameyourFileByteArray變量。

Response.Buffer = true; 
Response.Clear(); 
Response.ClearHeaders(); 
Response.ContentType = "application/vnd.ms-excel"; 
Response.CacheControl = "public"; 
Response.AddHeader("Pragma", "public"); 
Response.AddHeader("Expires", "0"); 
Response.AddHeader("Cache-Control", "must-revalidate, post-check=0, pre-check=0"); 
Response.AddHeader("Content-Description", "Excel File Download"); 
Response.AddHeader("Content-Disposition", "attachment; filename=\"" + filename + "\""); 

Response.BinaryWrite(yourFileByteArray); 
Response.Flush(); 
Response.End(); 

有幾種方法可以將文件作爲字節數組獲取,但我將其作爲練習留給您。

+0

所以Response.BinaryWrite()是你強迫你的用戶下載你保存到臨時位置的文件的地方嗎?正確?爲什麼不能使用Response.WriteFile()或其他東西,因爲從技術上講,文件現在存在正確嗎? – Marrs

+0

您無法控制用戶的文件系統。用戶必須選擇保存文件。你可以做的最好的辦法是強制文件到瀏覽器,就像上面的代碼通過Response一樣。瀏覽器和用戶必須同意將文件放在某個地方。 –

+0

感謝您的幫助科裏,您的解釋確實給了我更好的理解需要做什麼。 – Marrs

相關問題