22

有谁知道如何使用 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();
}

但是得到以下错误?

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

4

5 回答 5

32

在您调用任何函数 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);
于 2012-11-14T09:47:50.033 回答
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);
}
于 2014-08-15T06:21:51.973 回答
4

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

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

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

于 2016-06-26T07:16:35.713 回答
1

SaveAs将接受您的aFile流。

您可以通过查看函数签名自己找出这些内容:SaveAs(System.IO.Stream). 它需要一个Stream. 传递 astring不可能编译,所以你必须以某种方式弥补一个有用的Stream(你做了)。

于 2012-10-16T10:50:41.773 回答
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(); 
于 2017-02-10T15:35:57.057 回答