使用EPPlus如何进行另存为操作?

24

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

package.SaveAs(tempFolderPathAlt + saveas + ".xlsx");

目前,以下错误信息导致该行代码被用红色下划线标记:

The best overloaded method match for 'OfficeOpenXml.ExcelPackage.SaveAs(System.IO.Stream)' has some invalid arguments

目前我是通过以下方式保存文件的。

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();
}

但是你遇到了以下错误?

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

5个回答

36

在调用函数 GetAsByteArray, Save, SaveAs 后,该文档包将被关闭和处理。这就是你收到该消息的原因。

文档包对象已关闭和处理,因此无法对该对象或任何打开于该文档包部分的数据流执行操作。

解决方法是在保存文件后调用 Load 函数以继续处理 Excel 文件。或者,如果你只想获得字节数组和文件输出,我相信它们是相同的。

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

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);

9

我来寻找答案,但现有的答案对我不够清晰。

这是我使用 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);
}

4
我不知道从哪个版本开始,EPPlus的SaveAs方法接受一个FileInfo。因此,您可以像这样做:
using (var app = new ExcelPackage(new FileInfo(inputPath)))
{
    //process
    app.SaveAs(new FileInfo(outputPath));
}

Save方法不同,SaveAs方法在文件名已存在的情况下也会覆盖该文件。


1
摆脱多余的package.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(); 

1

SaveAs 将接受您的 aFile 流。

您可以通过查看函数签名自行了解这些内容:SaveAs(System.IO.Stream)。它需要一个 Stream。传递一个 string 显然无法编译,因此您必须想出一个有用的 Stream(您已经做到了)。


我可以将“另存为”功能设置为保存到文件路径吗? - Pomster
不行,因为你不能给它一个路径。但是你可以给它你的FileStream。 - usr
尝试移除 "package.GetAsByteArray()"。你是否在保存之前关闭了 package?无论如何,你发布的代码是正确的方法。你可能想要发一个新问题来询问新的错误消息。 - usr

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接