Как скачать сгенерированный файл Excel из вашего приложения asp.net - PullRequest
1 голос
/ 02 ноября 2011

Я создаю веб-сайт asp.net и создаю документ Excel на основе некоторых данных сетки. Я использую Microsoft.Office.Interop.Excel для его построения. Я пытался использовать saveFileDialog поле, используя System.Windows.Forms. Благодаря моему онлайн-исследованию я узнал, что вы не можете сделать это в приложении asp.net? Все отлично работает в режиме отладки, но при загрузке на сайт страница не работает вообще. Итак, мой вопрос: можно ли использовать поле saveFileDialog для приложения asp.net? Кто-нибудь знает хороший обходной путь для этого? Я опубликую свой код, который отлично работает в режиме отладки, но не работает, когда я загружаю его на свой сайт. Заранее спасибо за любую помощь.

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();
    }
} 

Ответы [ 3 ]

2 голосов
/ 02 ноября 2011

Вы не можете делать то, что хотите, в диалоговом окне сохранения. Вы должны просто сохранить файл во временную папку на вашем сервере. Как только вы сохранили файл где-нибудь, вы можете принудительно загрузить его у пользователя. Я обычно следую этому коду (кажется, работает во всех браузерах наиболее последовательно). Вы должны указать переменные filename и yourFileByteArray.

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();

Есть несколько способов получить ваш файл в виде байтового массива, но я оставлю это как упражнение для вас.

1 голос
/ 02 ноября 2011

Не используйте 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 голосов
/ 02 ноября 2011

Невозможно отобразить диалоговое окно на сервере.Там никого нет, чтобы увидеть это.Избавьтесь от всего объекта saveFileDialog и просто вызовите SaveAs с созданным именем файла в файловой системе сервера, которое гарантированно будет уникальным.Затем передайте этот файл вашему пользователю.

...