保存为使用EPPlus?

时间:2012-10-16 10:42:23

标签: c# epplus

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

但是这样一来,包仍然是开放的,我无法使用它所使用的文件。

save as会正确关闭包,但它不接受我的文件路径。


修改

我试过了:

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 个答案:

答案 0 :(得分:25)

该套餐将被关闭&在您调用任何功能后处理 GetAsByteArraySaveSaveAs。这就是你收到消息的原因

  

包对象已关闭并处理,因此无法对此对象或此包的某个部分上打开的任何流执行操作。

解决方法是在保存后调用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);

答案 1 :(得分:8)

我来找到答案,但现有的答案对我来说并不清楚。 以下是我使用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);
}

答案 2 :(得分:1)

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

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

Save方法SaveAs方法覆盖文件不同,以防文件名已存在。

答案 3 :(得分:0)

SaveAs将接受您的aFile信息流。

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

答案 4 :(得分:0)

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