如何在Asp.net 2.0 C#中显示另存为对话框?

时间:2012-08-30 15:03:18

标签: c# asp.net excellibrary

我使用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 个答案:

答案 0 :(得分:2)

看起来你正在使用EPPlus,它在ExcelPackage对象上有一个Stream属性,我相信你可以用来写入响应流。我已经包含了一些类似于我过去用来下载文件的代码。

然后我将此逻辑放入我链接到的页面的页面加载中。

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

答案 1 :(得分:1)

您需要做的是将文件流式传输给用户。我确信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);

更新

显然,在.NET 4和现在claims to support it by doing this之前,Excel库的作者不支持这个:

    MemoryStream m = new MemoryStream(); // Temp Stream
    workbook.Save(m);
    m.CopyTo(Response.OutputStream);

更新2

实际上,作者并不是那个声称在MemoryStream上调用Workbook的Save方法可以工作而不是其他人的人。作者实际上推荐了这段愚蠢的代码。

DataSet ds = GetData();
MemoryStream m = new MemoryStream();
ExcelLibrary.DataSetHelper.CreateWorkbook(m , ds);
m.WriteTo(Response.OutputStream);

如果这不起作用,那么如果您完全停止使用该库并使用EPPlus,我恐怕您会感觉更好。

答案 2 :(得分:0)

您无法在纯应用程序中执行此操作。您的代码在服务器上运行 - 而不是在用户的计算机上运行。

您可以在服务器上生成Excel文件,然后为您的用户提供下载链接,但无法将服务器上的代码直接保存到用户的计算机上。

您可以尝试使用像Silverlight这样的客户端插件执行类似操作,并且您将无限制地访问Silverlight公开的文件系统。

也许您可以让我们更多地了解您尝试做的事情,我们可以提供更好的指导。

答案 3 :(得分:0)

您可以尝试 FileUpload 服务器控件。

在yourfile.aspx中使用:

<asp:FileUpload ID="FileUpload1" runat="server" />

在yourfile.aspx.cs中使用它来保留用户选择的路径:

Server.MapPath(FileUpload1.FileName);