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



我有一个似乎是c#的奇怪问题,我还没能弄清楚,希望在这里得到一些帮助。

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

有趣的是,我确实有其他应用程序使用相同的MemoryStream模式,文件保存得很好,但它似乎"喜怒无常"。也不知道它什么时候起作用,什么时候不起作用。

有谁知道为什么会发生这种情况,以及我如何通过MemoryStream让它工作吗?

class Program
{
static void Main(string[] args)
{
ExcelPackage.LicenseContext = LicenseContext.NonCommercial;
TestXLToFile($@"ExportTest-{DateTime.Now.ToString("dd-MM-yy.H.mm.ss")}.xlsx");
var stream = TestXLToMemStream();
stream.CopyTo(new FileStream($@"ExportTestMs-{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($@"ExportTestMS-{DateTime.Now.ToString("dd-MM-yy.H.mm.ss")}.xlsx", FileMode.Create, FileAccess.Write))
{
stream.WriteTo(fileStream);
}