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