使用 EPPlus 的内存流

MemoryStream using EPPlus

在这个程序集中,我将 excel 文件直接导出到本地磁盘,但现在我尝试分两步执行此操作: 首先将其写入内存流,然后将内存流保存到本地磁盘。不确定这是否正确。每当我 运行 时,它都不给我任何东西。想法?

public static void Createxlsx(string filename) 
{
    FileInfo newFile = new FileInfo ("C:\ConsoleApplicationXLSX\" + filename + ".xlsx");
    MemoryStream stream = new MemoryStream();

    //create a package 
    using (var package = new ExcelPackage(stream))
    {
        var worksheet = package.Workbook.Worksheets.Add("worksheet");

        package.Save();
    }
} 

您现在需要将内存流复制到文件中。添加这个

using (fileStream = File.Open("C:\ConsoleApplicationXLSX\" + filename + ".xlsx"))
{
    stream.Position = 0;
    stream.CopyTo(fileStream);
}
public static void Createxlsx(string filename) 
{
    MemoryStream stream = new MemoryStream();
    //create a package 
    using (var package = new ExcelPackage(stream)) // disposing ExcelPackage also disposes the above MemoryStream
    {
        var worksheet = package.Workbook.Worksheets.Add("worksheet");
        package.Save();

        // see the various ways to create/open a file, Create is just one of them
        // open the file stream
        using(var file = System.IO.File.Open("C:\ConsoleApplicationXLSX\" + filename + ".xlsx", System.IO.FileMode.CreateNew))
        {
            stream.Position = 0; // reset the position of the memory stream
            stream.CopyTo(file); // copy the memory stream to the file stream
        }
    }
}

一些笔记

  • 将您的流(内存、文件等)包装在 using 语句中。这将确保流在超出范围后始终 released/freed(使用已实现的 IDisposable 接口)。
  • 请参阅FileMode,我在上面选择的选项CreateNew 如果您尝试覆盖现有文件,将会抛出异常。如果您不关心那个,请改用 Create
  • 最后,您必须在复制之前重置流的位置,否则它将从当前位置停止的位置开始,通常是在流的末尾。

编辑

您也可以在没有 MemoryStream 的情况下执行此操作。

public static void Createxlsx(string filename) 
{
    using(var file = System.IO.File.Open("C:\ConsoleApplicationXLSX\" + filename + ".xlsx", System.IO.FileMode.CreateNew))
    using (var package = new ExcelPackage(file)) // disposing ExcelPackage also disposes the above MemoryStream
    {
        var worksheet = package.Workbook.Worksheets.Add("worksheet");
        package.Save();
    }
}