#asp.net #excel #export-to-excel #download
#asp.net #excel #экспорт в Excel #Скачать
Вопрос:
Я создаю asp.net веб-сайт, и я создаю документ Excel на основе некоторых данных gridview. Я использую 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();
}
}
Комментарии:
1. Вероятно, он показывает диалоговое окно … на вашем сервере, где его никто не видит!
Ответ №1:
Вы не можете делать то, что хотите, с помощью диалогового окна сохранения. Вам следует просто сохранить файл во временное хранилище на вашем сервере. После того как вы где-то сохранили файл, вы можете принудительно загрузить его у пользователя для загрузки. Я обычно следую этому коду (кажется, работает во всех браузерах наиболее последовательно). Вы должны указать переменные 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. итак, ответ. BinaryWrite() — это когда вы заставляете своего пользователя загружать файл, который вы сохранили, в ваше временное местоположение? правильно? почему вы не можете просто использовать Response. WriteFile() или что-то в этом роде, потому что технически файл существует сейчас правильно?
2. У вас нет никакого контроля над файловой системой пользователя. Пользователь должен выбрать сохранение файла. Лучшее, что вы можете сделать, это принудительно загрузить файл в браузер, как это делает приведенный выше код через ответ. Браузер и пользователь должны согласиться поместить файл куда-нибудь.
3. Спасибо за вашу помощь, Кори, ваши объяснения действительно помогли мне лучше понять, что нужно сделать.
Ответ №2:
Не используйте 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();
}
Комментарии:
1. Если вы не можете использовать interop, как вы форматируете свой файл Excel именно так, как вы этого хотите?
2. Либо с использованием OpenXML версии файлов Excel (2007 ), либо с помощью таких инструментов, как Aspose. Interop Excel не является потокобезопасным, имеет ужасную производительность и требует установки Excel на сервере. Это работает, но не идеально.
Ответ №3:
Вы не можете отобразить диалоговое окно на сервере. Там нет никого, кто мог бы это увидеть. Избавьтесь от всего объекта SaveFileDialog и просто вызовите SaveAs с сгенерированным именем файла в файловой системе сервера, которое гарантированно будет уникальным. Затем передайте этот файл своему пользователю.