2

我正在使用 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

4 回答 4

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();
于 2012-08-30T15:16:25.933 回答
1

您需要做的是将文件流式传输给用户。我相信workbook班级提供保存到 a 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

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

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

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

于 2012-08-30T15:13:09.993 回答
0

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

在 yourfile.aspx 中使用:

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

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

Server.MapPath(FileUpload1.FileName);
于 2012-08-30T15:27:02.200 回答
0

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

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

您可以尝试使用 Silverlight 之类的客户端插件执行类似操作,并且您对 Silverlight 公开的文件系统的访问权限有限。

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

于 2012-08-30T15:10:43.320 回答