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

如何在Asp.net 2.0 C#中显示另存为对话框?,c#,asp.net,excellibrary,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] = ne

我正在使用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希望允许我在未经用户许可的情况下保存!我希望用户选择自己的文件路径。如何提示另存为对话框?

在纯应用程序中不能这样做。您的代码正在服务器上运行,而不是在用户的计算机上运行

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

您可以尝试使用Silverlight这样的客户端插件执行类似的操作,这样您对Silverlight公开的文件系统的访问就会受到限制


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

您需要做的是将文件流式传输给用户。我确信
工作簿
类提供了保存到
,在这种情况下,
响应流

大概是这样的:

更新

很明显,Excel库的作者直到.NET 4才对此有支持,现在:

更新2

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

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

如果这不起作用,那么我担心如果您完全停止使用该库而改用EPPlus,您会过得更好

看起来您正在使用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();

您可以尝试文件上载服务器控件

在yourfile.aspx中,使用以下命令:

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

您想要的是用户下载该文件?你在使用网络表单吗?MVC?@HardCode您没有说您使用的是哪个库,所以我没想到我的代码会起作用。我的目的是让你知道你需要做什么。如果您使用的是ePlus,请查看Talon的答案;否则,请说明您正在使用哪个库来提供更好的帮助。好的,我正在使用ExcelLibrary。您是否尝试调用
SaveToStream
方法而不仅仅是save
save
?@HardCode发布和更新。如果这样不行,就不要再使用那个库了,我觉得它很糟糕。
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();
<asp:FileUpload ID="FileUpload1" runat="server" />
Server.MapPath(FileUpload1.FileName);