Как показать сохранить как диалоговое окно в Asp.net 2.0 C#?
Я использую ExcelLibrary для создания динамического листа Excel. Который работает отлично.
Код
//create new xls file
string file = Server.MapPath("Discussion_Board_Report.xls");
Workbook workbook = new Workbook();
Worksheet worksheet = new Worksheet("Report");
worksheet.Cells[0, 0] = new Cell("COMM 226 Case Discussions Report");
worksheet.Cells[4, 0] = new Cell("Student ID");
worksheet.Cells[4, 1] = new Cell("User Name");
worksheet.Cells[4, 2] = new Cell("Case 1");
worksheet.Cells[4, 3] = new Cell("Case 2");
worksheet.Cells[4, 4] = new Cell("Case 3");
worksheet.Cells[4, 5] = new Cell("Topics");
worksheet.Cells[4, 6] = new Cell("Replies");
workbook.Worksheets.Add(worksheet);
workbook.Save(file);
Вопрос
Проблема с этим кодом в том, что он собирается сохранить файл на сервере. Я не могу сохранить файл в C://, потому что Windows хочет, чтобы я мог сохранить без разрешения пользователя! Я хочу, чтобы пользователь выбрал свой собственный путь к файлу. Как мне вызвать диалоговое окно Сохранить как?
4 ответа
Похоже, что вы используете EPPlus, у него есть свойство Stream объекта ExcelPackage, которое, я полагаю, вы можете использовать для записи в поток ответов. Я включил некоторый код, который похож на то, что я использовал в прошлом для загрузки файла.
Затем я помещаю эту логику в загрузку страницы, на которую я ссылаюсь.
ExcelPackage package = new ExcelPackage();
ExcelWorksheet worksheet = package.Workbook.Worksheets.Add("Name Here");
///worksheet logic
var msArray = package.Stream;
var response = HttpContext.Current.Response;
response.Clear();
response.ClearHeaders();
response.ContentType = "application/vnd.ms-excel";
response.AddHeader("Content-Disposition", "attachment; filename={0}.xls".FormatWith(reportName));
response.AddHeader("Content-Length", msArray.Length.ToString());
response.OutputStream.Write(msArray, 0, msArray.Length);
response.Flush();
response.End();
Что вам нужно сделать, это передать файл пользователю. Я уверен workbook
класс предлагает сохранить в Stream
на этот случай Response Stream
Как то так:
Response.ContentType = "application/vnd.ms-excel";
//Force the browser to offer to download the file
Response.AddHeader("content-disposition", "attachment; filename=file.xlsx");
workbook.SaveToStream(Response.OutputStream);
Обновить
По-видимому, автор библиотеки Excel не поддерживал это до.NET 4 и теперь утверждает, что поддерживает это, выполнив следующее:
MemoryStream m = new MemoryStream(); // Temp Stream
workbook.Save(m);
m.CopyTo(Response.OutputStream);
Обновление 2
На самом деле, автор не тот, кто утверждает, что вызов метода Save в Workbook для MemoryStream
будет работать, а кто-то другой. Автор на самом деле рекомендует этот глупый кусок кода.
DataSet ds = GetData();
MemoryStream m = new MemoryStream();
ExcelLibrary.DataSetHelper.CreateWorkbook(m , ds);
m.WriteTo(Response.OutputStream);
Если это не сработает, то, боюсь, вам будет лучше, если вы перестанете использовать эту библиотеку полностью и вместо этого будете использовать EPPlus.
Вы можете попробовать серверный элемент управления FileUpload.
В yourfile.aspx используйте это:
<asp:FileUpload ID="FileUpload1" runat="server" />
В yourfile.aspx.cs используйте это для сохранения выбранного пути:
Server.MapPath(FileUpload1.FileName);
Вы не можете сделать это в чистом приложении. Ваш код работает на сервере, а не на компьютере пользователя.
Вы можете сгенерировать файлы Excel на сервере, а затем предоставить пользователям ссылку для их загрузки, но нет способа получить код на сервере для сохранения непосредственно на компьютере вашего пользователя.
Вы можете попробовать сделать что-то подобное с клиентским плагином, таким как Silverlight, и у вас будет ограниченный доступ к файловой системе, предоставляемой Silverlight.
Может быть, вы могли бы сообщить нам немного больше о том, что вы пытаетесь сделать, и мы могли бы предоставить лучшее руководство.