「ClosedXML - Excelファイルの操作」の版間の差分

📢 Webサイト閉鎖と移転のお知らせ
このWebサイトは2026年9月に閉鎖いたします。
新しい記事は移転先で追加しております。(旧サイトでは記事を追加しておりません)

695行目: 695行目:


== 大量データの高速処理 ==
== 大量データの高速処理 ==
==== 使用例 : 分割処理なし・ストリーミング処理なし ====
以下の例では、100万行のデータを生成して、Excelファイルに高速で書き込んでいる。<br>
以下の例では、100万行のデータを生成して、Excelファイルに高速で書き込んでいる。<br>
<br>
<br>
779行目: 780行目:
  }
  }
  </syntaxhighlight>
  </syntaxhighlight>
<br>
==== 使用例 : 分割処理 ====
以下の例では、メモリ使用量を抑えつつ大量のデータを効率的に処理している。<br>
また、メモリに制約のあるシステムで動作させる場合にも有効である。<br>
<br>
* メモリ使用量の削減
*: 1度に全データを生成せずに、小さなバッチで処理するため、メモリ使用量を抑えることができる。
* 柔軟性
*: バッチサイズを調整することにより、様々なシステム環境に対応できる。
<br>
<u>※注意</u><br>
* <u>バッチサイズの選択</u>
*: <u>システムのメモリ容量とパフォーマンスを考慮して適切なバッチサイズを選択する必要がある。</u>
* <u>処理時間</u>
*: <u>全データを1度に処理する場合と比較して、若干処理時間が増加する可能性がある。</u>
<br>
<syntaxhighlight lang="c#">
using System;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Threading.Tasks;
using ClosedXML.Excel;
class Program
{
    // Mainメソッドは変更なし
    static async Task Main(string[] args)
    {
      // ...略
    }
    static async Task ProcessLargeDataAsync()
    {
      const int totalRows = 1_000_000;
      const int batchSize = 100_000; // 1度に処理する行数
      using (var workbook = new XLWorkbook())
      {
          var worksheet = workbook.Worksheets.Add("大量データ");
          // ヘッダを追加
          worksheet.Cell(1, 1).Value = "ID";
          worksheet.Cell(1, 2).Value = "Value";
          for (int start = 0; start < totalRows; start += batchSize)
          {
            int end = Math.Min(start + batchSize, totalRows);
            await ProcessBatchAsync(worksheet, start, end);
            Console.WriteLine($"Processed rows {start + 1} to {end}");
          }
          // 合計を計算
          worksheet.Cell(totalRows + 2, 1).Value = "合計";
          worksheet.Cell(totalRows + 2, 2).FormulaA1 = $"=SUM(B2:B{totalRows + 1})";
          await SaveWorkbookAsync(workbook, "大量データ処理_分割.xlsx");
      }
    }
    static async Task ProcessBatchAsync(IXLWorksheet worksheet, int start, int end)
    {
      await Task.Run(() =>
      {
          var data = Enumerable.Range(start + 1, end - start)
                              .Select(i => new { ID = i, Value = i * 2 });
          worksheet.Cell(start + 2, 1).InsertData(data);
      });
    }
    // SaveWorkbookAsyncメソッドは変更なし
    static async Task SaveWorkbookAsync(XLWorkbook workbook, string filePath)
    {
      // ...略
    }
}
</syntaxhighlight>
<br>
==== 使用例 : ストリーミング処理 ====
ストリーミング処理とは、データを連続的に処理する方法であり、全データを1度にメモリに読み込むことなく、データが利用可能になり次第処理を行う。<br>
典型的には、データを小さな塊 (チャンク) として読み取り、即座に処理・結果を出力する。<br>
<br>
<u>ストリーミング処理をExcelファイルの生成に適用するのは難しく、特に、Closed XMLライブラリではサポートされていない。</u><br>
<br>
<u>OpenXML SDKを使用する場合は、より低レベルでのストリーミングに近い処理が可能であるが、実装が複雑になる。</u><br>
<br><br>
<br><br>