Как показать сохранить как диалоговое окно в 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.

Может быть, вы могли бы сообщить нам немного больше о том, что вы пытаетесь сделать, и мы могли бы предоставить лучшее руководство.

Другие вопросы по тегам