2

我有以下内容:

using(var memoryStream = new MemoryStream())
{
   gc.CreatePackage(memoryStream);
}

MemoryStream 吐出一个 excel 文件。从 memoryStream 中,我如何实际显示生成的文件。请注意,我不想将文件实际保存到磁盘,而只是显示它。

到目前为止,我有以下但似乎不起作用:

using (var memoryStream = new MemoryStream())
{
    gc.CreatePackage(memoryStream);

    using (var fileStream = File.OpenWrite("Test.xlsx"))
    {
        memoryStream.WriteTo(fileStream);
    }                
}

但不确定我的方向是否正确。我收到一条错误消息:

System.Web.Mvc.Controller.File(byte[], string)' 是一个“方法”,在给定的上下文中无效

我不确定我是否朝着正确的方向前进。

4

3 回答 3

1

假设您使用的是 ASP.NET MVC,您可能需要File response helper

using (var memoryStream = new MemoryStream())
{
    gc.CreatePackage(memoryStream);
    memoryStream.Seek(0, SeekOrigin.Begin);
    return File(memoryStream, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
}

如果您想让文件源实际出现在浏览器中,您也可以谎报 MIME 类型并text/plain改用它。浏览器很可能会将其呈现为纯文本。

您还可以添加第三个参数,File以指定下载文件应显示给最终用户的文件名。

于 2012-12-19T21:10:33.653 回答
0

由于您发布的错误似乎表明您正在尝试从 MVC 控制器返回生成的文件,我认为这可能是您正在寻找的。

public ActionResult MyAction()
{
    using (var memoryStream = new MemoryStream())
    {
        gc.CreatePackage(memoryStream);
        //Make sure the position of the stream is at 0
        memoryStream.Position = 0;
        //Return the contents of the stream with the appropriate MIME type
        return File(memoryStream, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
    }
}
于 2012-12-19T21:12:02.267 回答
0

您可以使用 MemoryMappedFile 创建虚拟文件。

示例代码:

写:

  using (var mmf = MemoryMappedFile.CreateNew("MappedFileName", size, MemoryMappedFileAccess.ReadWriteExecute))
   {
       using (MemoryMappedViewAccessor accessor = mmf.CreateViewAccessor())
       {
            accessor.Write(Write your data to mapped file);
       }
    }

读:

  using (var mmf = MemoryMappedFile.OpenExisting("MappedFileName"))
    {
        using (MemoryMappedViewAccessor accessor = mmf.CreateViewAccessor())
        {
            accessor.Read......
        }
    }
于 2012-12-19T21:26:41.020 回答