EPPlus - 保存到内存流导致空文件,保存到文件工作正常

EPPlus - Saving to Memory Stream results in empty file, Saving to File works ok

我遇到了一个似乎是 C# 的奇怪问题,我一直无法弄清楚,希望在这里得到一些帮助。

我已经编写了下面的演示,它创建了本质上相同的文件,但是一个使用 ExcelPackage.SaveAs(FileInfo(filePath))ExcelPackage 保存到一个文件中(工作正常并且符合预期),而另一个保存到 MemoryStream(结果是一个完全空的文件)。

有趣的是,我确实有其他应用程序使用相同的 MemoryStream 模式并且文件保存得很好,但它看起来“喜怒无常”并且无法弄清楚它何时工作以及何时不工作。

任何人都知道为什么会发生这种情况以及如何通过 MemoryStream?

让它工作
    class Program
    {
        static void Main(string[] args)
        {
            ExcelPackage.LicenseContext = LicenseContext.NonCommercial;

            TestXLToFile($@"Export\Test-{DateTime.Now.ToString("dd-MM-yy.H.mm.ss")}.xlsx");

            var stream = TestXLToMemStream();

            stream.CopyTo(new FileStream($@"Export\TestMs-{DateTime.Now.ToString("dd-MM-yy.H.mm.ss")}.xlsx", FileMode.Create));
        }

        public static void TestXLToFile(string FilePath)
        {
            using (ExcelPackage xl = new ExcelPackage())
            {
                var ws = xl.Workbook.Worksheets.Add("TEST");
                ws.Cells[1, 1].Value = "abc123";

                xl.SaveAs(new FileInfo(FilePath));
            }
        }

        public static MemoryStream TestXLToMemStream()
        {
            ExcelPackage xl = new ExcelPackage();

            var ws = xl.Workbook.Worksheets.Add("TEST");
            ws.Cells[1, 1].Value = "abc123";

            MemoryStream ms = new MemoryStream();
            xl.SaveAs(ms);

            return ms;
        }
    }

问题是因为您没有为 FileStream 调用 Flush 和 Close 方法。使用 Streams 时应使用 Using 语句,如下所示:

using(var stream = TestXLToMemStream())
using(var fileStream = new FileStream($@"Export\TestMS-{DateTime.Now.ToString("dd-MM-yy.H.mm.ss")}.xlsx", FileMode.Create, FileAccess.Write))
{
    stream.WriteTo(fileStream);
}