C# 使用EPPlus另存为?

C# 使用EPPlus另存为?,c#,epplus,C#,Epplus,有人知道如何使用package.Saveas函数吗 package.SaveAs(tempFolderPathAlt + saveas + ".xlsx"); 目前,这一点用红色下划线,错误如下: 匹配的最佳重载方法 “OfficeOpenXml.ExcelPackage.SaveAs(System.IO.Stream)”具有一些无效的 论据 目前,我正在以以下方式保存文件 FileStream aFile = new FileStream(tempFolderPathAlt + saveas

有人知道如何使用package.Saveas函数吗

package.SaveAs(tempFolderPathAlt + saveas + ".xlsx");
目前,这一点用红色下划线,错误如下:

匹配的最佳重载方法 “OfficeOpenXml.ExcelPackage.SaveAs(System.IO.Stream)”具有一些无效的 论据

目前,我正在以以下方式保存文件

FileStream aFile = new FileStream(tempFolderPathAlt + saveas + ".xls",    FileMode.Create);
byte[] byData = package.GetAsByteArray();
aFile.Seek(0, SeekOrigin.Begin);
aFile.Write(byData, 0, byData.Length);
aFile.Close();
但这样的话,软件包仍然是打开的,我无法处理它使用过的文件

另存为将正确关闭包,但它不接受我的文件路径


编辑

我试过这个:

using (FileStream aFile = new FileStream(tempFolderPathAlt + saveas + ".xlsx", FileMode.Create))
{
    byte[] byData = package.GetAsByteArray();
    aFile.Seek(0, SeekOrigin.Begin);
    package.SaveAs(aFile);
    //aFile.Write(byData, 0, byData.Length);
    aFile.Close();
}
但是得到以下错误吗


包对象已关闭并已释放,因此无法对此对象或在此包的一部分上打开的任何流执行操作。

SaveAs
将接受您的
文件流


通过查看函数签名:
SaveAs(System.IO.Stream)
,您可以自己找到这些内容。它需要一个
。传递
字符串
不可能编译,因此您必须以某种方式生成一个有用的

调用任何函数
GetAsByteArray
Save
SaveAs
后,程序包将关闭并释放。这就是你收到这个消息的原因

包对象已关闭并已释放,因此无法对此对象或在此包的一部分上打开的任何流执行操作

解决方案是,保存后,调用
Load
函数继续处理excel文件。或者,如果您只想同时获得ByteArray和FileOutput,我相信它们都是相同的

将文件保存到磁盘后,您可以读取数据:

string path = @"C:\test1.xlsx";
Stream stream = File.Create(path);
package.SaveAs(stream);
stream.Close();

byte[] data = File.ReadAllBytes(path);
或者,您可以在获取ByteArray后将数据保存到磁盘:

byte[] data = package.GetAsByteArray();

string path = @"C:\test1.xlsx";
File.WriteAllBytes(path, data);

我是来寻找这个问题的答案的,但现有的答案对我来说并不清楚。 以下是我使用EPPlus和
System.Windows.Forms所做的工作:

ExcelPackage xlPackage = new ExcelPackage(xlsTmpFileName)

// Populate the Excel spreadsheet here.

SaveFileDialog sfd = new SaveFileDialog();
using (FileStream fs = new FileStream(sfd.FileName, FileMode.Create))
{
    xlPackage.SaveAs(fs);
}

我不知道从哪个版本开始,但EPPlus的
SaveAs
方法接受
FileInfo
。所以你可以这样做:

using (var app = new ExcelPackage(new FileInfo(inputPath)))
{
    //process
    app.SaveAs(new FileInfo(outputPath));
}

Save
方法不同,如果文件名已经存在,那么
SaveAs
方法也会覆盖文件。

清除多余的
包。GetAsByteArray
调用,您应该解决它

我只是跑:

using (FileStream aFile = new FileStream(@"C:\Temp\asdf.xlsx", FileMode.Create))
{
    aFile.Seek(0, SeekOrigin.Begin);
    package.SaveAs(aFile);
    aFile.Close();
}

// See here - I can still work with the spread sheet.
var worksheet = package.Workbook.Worksheets.Single(); 

我是否可以将“另存为”功能设置为保存到文件路径?否,因为您无法为其指定路径。不过,您可以将文件流提供给它。请尝试删除“package.GetAsByteArray()”。在保存之前,您是否在某个地方关闭了该包?无论如何,你发布的代码是正确的方法。您可能需要询问有关新错误消息的新问题。