我正在使用MemoryStream
API和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已经有了这方面的东西?
答案 0 :(得分:2)
不要在构造函数中添加流。保持构造函数为空。
所以改变这一行:
using (ExcelPackage p = new ExcelPackage(stream))
到此:
using (ExcelPackage p = new ExcelPackage())
答案 1 :(得分:0)
对于'Response.ContentType',使用application/octet-stream
作为类型。这将告诉大多数浏览器将文件视为应该只下载的数据。