使用 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();
}
}
在这个程序集中,我将 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();
}
}