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);
}
我遇到了一个似乎是 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);
}