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 に答える
1

SaveAsaFileあなたのストリームを受け入れるでしょう。

関数のシグネチャを見ることで、そのようなことを自分で見つけることができます: SaveAs(System.IO.Stream)。かかりますStream。a を渡すとstringコンパイルできない可能性があるため、何らかの方法で便利なものを作成する必要が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 に答える