51

私はEPPlusを使用してC#でXLSXファイルを生成しています。メモリストリームを使用してExcelPackageをインスタンス化するとすぐに、次のエラーが発生します。

書き込み操作中にディスクエラーが発生しました。(HRESULTからの例外:0x8003001D(STG_E_WRITEFAULT))」

コードは次のとおりです。

MemoryStream stream = new MemoryStream();

using (ExcelPackage package = new ExcelPackage(stream))
{
    ...
}

他の誰かがこれを見たことがありますか?

4

8 に答える 8

77

他の答えはどれも私をそこに連れて行ってくれませんでした(Excelワークシートは常に空でした)が、これは私にとってはうまくいきました:

using (var package = new ExcelPackage())
{
    var worksheet = package.Workbook.Worksheets.Add("Worksheet Name");

    worksheet.Cells["A1"].LoadFromCollection(data);

    var stream = new MemoryStream(package.GetAsByteArray());
}
于 2012-12-27T02:05:28.723 に答える
26

私は質問が数ヶ月前に答えられたことを知っています、しかしこれは私が試みている人への将来の参照のためにそれをする方法です:

VB.NETの場合:

Dim stream As New MemoryStream
Using package As New ExcelPackage(stream)
    'Here goes the ExcelPackage code etc 
    package.Save()
End Using

C#の場合:

MemoryStream stream = new MemoryStream();
using (ExcelPackage package = new ExcelPackage(stream))
{
    //Here goes the ExcelPackage code etc
    package.Save()
}

私の知る限り、C#コードは正しいはずです。また、ExcelPackageにはストリームのサポートが組み込まれています。

于 2011-11-28T11:06:34.483 に答える
14

ストリーム(Response.OutputStreamなど)を引き続き使用する場合は、空のコンストラクターを使用してExcelPackageを作成し、SaveAs(Stream OutputStreamメソッドを使用できます。

于 2011-06-23T21:46:32.623 に答える
9

ExcelPackageコンストラクタのエラーハンドラにバグが発生しているようです。空のストリームを指定しようとするとSystem.IO.Packaging.Package.Open、パッケージを空にできないことを示す例外が発生します。

このコードは、ファイルが存在しない場合でも機能します。

var file = new FileInfo("test.xlsx");
using (ExcelPackage package = new ExcelPackage(file))
{
}

コンストラクターのオーバーロードに関するドキュメントに、ストリームを空にすることが許可されていることが示されていることを考えると、EPPlus課題追跡システムでこの問題を提起することをお勧めします。

于 2011-04-21T13:13:57.490 に答える
1

空のコンストラクターを使用してExcelPackageを作成できます。独自の内部バッファを処理します。

http://epplus.codeplex.com/wikipage?title=WebapplicationExample

于 2011-05-19T18:14:27.847 に答える
1

4.1.1バージョンのEPPlusを使用するコードを4.5.1バージョンに変換するときにも同様の問題が発生しました。

元々、次のパターンを使用していました。

using (var ms = new MemoryStream())
{
    new ExcelBuilder().BuildResultFile(result, ms);
    ms.Position = 0;    // <-- Cannot access a closed Stream error thrown here
    // Send Excel file to Azure storage
}

そして、ExcelBuilderクラスのBuildResultFile関数は次のとおりです。

public void BuildResultFile(List<ResultSet> resultSets, Stream stream)
{
    using (var package = new ExcelPackage(stream))
    {
        // Create Excel file from resultSets
        package.Save();
    }
}

4.5.1でこれを機能させるには、BuildResultFile関数からusingブロックを削除する必要がありました。

なぜこれが変更されたのか、またはこれを正しく実装しているのかどうかについて、GitHubにドキュメントが見つからないようです。

于 2018-03-30T15:19:16.267 に答える
0

既存のExcelファイルを開こうとしたときに同じ問題に直面し、数日間それを使用しました。私の場合、暗号化が原因で「書き込み操作中にディスクエラーが発生しました。(HRESULTからの例外:0x8003001D(STG_E_WRITEFAULT))」という例外が発生しました。

パスワードを渡すことで.xlsxファイルを読み取ることができました。私の場合、空の文字列""で十分でした。

あなたの場合、パスワードでコンストラクターを使用してパッケージを初期化してみてください:

public ExcelPackage(Stream newStream, string Password)

package = new ExcelPackage(stream, "");

ExcelPackageのソースコードをご覧くださいhttp://epplus.codeplex.com/SourceControl/latest#EPPlus/ExcelPackage.cs

方法があります

private void Load(Stream input, Stream output, string Password) 

これは、Excelファイルをロードするために使用されます。

private void Load(Stream input, Stream output, string Password) 

..。

if (Password != null)

{
  Stream encrStream = new MemoryStream();
  CopyStream(input, ref encrStream);
  EncryptedPackageHandler eph = new EncryptedPackageHandler();
  Encryption.Password = Password;
  ms = eph.DecryptPackage((MemoryStream)encrStream, Encryption);
}
else
{
  ms = new MemoryStream();
  CopyStream(input, ref ms);
 }

..。

パスワードが空であっても、コードはExcelストリームを復号化しようとしますが、NULLではありません。

ただし、暗号化されていないファイルのパッケージを初期化しようとすると、例外が発生します。

「ストリームは有効な/サポートされている暗号化されたドキュメントではありません。」

于 2018-01-26T11:08:06.580 に答える
0

私は同じエラーを扱っていましたが、他のどの答えも助けにはなりませんでした。

最終的に、ファイルを開こうとする前にこのコードを追加した後、問題は解決されました。

Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);

根本的な原因は、コードページがないためにEPPlusがZIPを開くことができなかったことであると思われます。このStackOverflowの回答に感謝します。

于 2018-02-20T15:43:58.297 に答える