保存为使用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(); } 

但是得到以下错误?

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

在调用任何函数 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); 

我来寻找答案,但现有的答案对我来说并不清楚。 以下是我使用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方法也会覆盖文件,以防文件名已存在。

SaveAs将接受您的aFile Stream。

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

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