2

500 MB の Excel (.xlsb/.xlsm) ファイルがあります。ファイル全体をメモリにロードせずに C# を使用して大きな (.xlsb/.xlsm) ファイルを読み取り/書き込み/変更する方法が必要ですが、代わりにチャンクでロードするか、少なくとも一度に 1 つのシートをロードします。

4

2 に答える 2

0

Excel ファイルは、基本的に XML ファイルを含む zip ファイルです。任意の zip ツールで Excel ファイルを開くと、Excel ドキュメントの内容が表示されます。変更する必要があるのは次のとおりです。

  • xl/sharedStrings.xml - Excel は、このファイルでインデックスを作成することにより、文字列の使用を最適化します (視覚的にではありませんが、最後まで反復してカウントできます。最初のインデックスは 0、2 番目のインデックスは 1 などです。 ..)。これらのインデックスを使用して、シート ファイル内の文字列を変更または追加し、ドキュメントが破損しないようにします。

  • xl/workbook.xml - シートの名前が含まれています。たとえば、シート 1 は Excel で「今月の収入」という名前になっていることがわかります。必要に応じて、それを使用して名前でシートを見つけます。

  • xl/worksheets/*.xml - これが実際のシートです。文字列を変更/追加するには、共有文字列 XML ファイルを使用します。数字を変更/追加するには、直接行ってください。共有文字列値を含むセルは、そのようにマークされます。

これらの XML ファイルを 1 行ずつ読み取りながら解析/編集する必要があり、ファイル全体をメモリにロードする必要はありません。非常に少ないメモリ フットプリントで大量のデータを処理できます。

C# では、ZipArchive を使用して必要なファイルのみを一時的に抽出し、それらを編集してから zip を更新します。ファイルが破損するため、すべてを抽出して再度圧縮しないでください。少なくとも、再び使用できるようにする方法で圧縮する方法がわかりません。

于 2016-07-10T15:01:22.197 に答える