1

我正在使用MemoryStreamAPI 和 EPPlus 在内存中创建一个 excel 文件来创建一个 excel 文档。

我创建 excel 文件的代码基本上是这样的:

public Stream GetXlsDocument(IQueryable data)
{

    const string sheetName = "Sheet1";
    var file = new FileInfo("test2.xls");

    MemoryStream stream = new MemoryStream();
    using (ExcelPackage p = new ExcelPackage(stream))
    {
        p.Workbook.Worksheets.Add(sheetName);

        ExcelWorksheet ws = p.Workbook.Worksheets[1];
        ws.Name = sheetName;
        ws.Cells.Style.Font.Size = 11;
        ws.Cells.Style.Font.Name = "Calibri";

        // Headers
        ws.SetValue(1, 1, "Some data");

        p.SaveAs(stream);
    }

    stream.Position = 0;
    return stream;
}

然后我的其他功能应该将此流作为下载提供给用户。我正在尝试这样做:

var file = Documents.GetXlsDocument();

var memoryStream = new MemoryStream();
file.CopyTo(memoryStream);

Response.Clear();
Response.ContentType = "application/force-download";
Response.AddHeader("content-disposition", "attachment; filename=nfile.xls");
Response.BinaryWrite(memoryStream.ToArray());
Response.End();

这确实显示了一个下载对话框。但是当我打开我的 excel 文件时,整个 excel 文档都充满了垃圾(我猜二进制数据表示为字符串)。

我不知道我做错了什么。

任何人都知道如何使excel文件以良好的格式下载吗?也许 EPPlus 已经为此准备了一些东西?

4

2 回答 2

2

不要在构造函数中添加流。保持构造函数为空。

所以改变这一行:

using (ExcelPackage p = new ExcelPackage(stream))

对此:

using (ExcelPackage p = new ExcelPackage())
于 2012-09-12T14:24:11.797 回答
0

对于“Response.ContentType” application/octet-stream,用作类型。这将告诉大多数浏览器将该文件视为不应下载其他任何内容的数据。

于 2012-09-12T13:15:04.467 回答