Open XML SDKを使ってExcelファイルを読み込む

samatsu 2/26/2023 202 N/A OpenXMLSDK

Excelファイルを.NETのプログラムから読み込む際に、プライマリ相互運用アセンブリを使用することがあるかと思いますが、こちらの方法では、Excelオブジェクトのリリースをコード内でしっかり行わないとExcelがプロセスとして残り続けるという問題が発生します。そこで今回は、Microsoftから提供されている Open XML SDKを使用してExcelファイルを読み取りコード例を紹介します。

今回は、以下のような簡単なシートを読み込んでみます。

動作確認環境は次の通りです

  • .NET 6.0
  • Windows 11
  • Visual Studio 2022 Community

1. プログラム

Visual Studioでコンソールプロジェクトを作成したら、まずは、 DocumentFormat.OpenXml NuGetパッケージをインストールします。記事作成時点で最新のバージョンは 2.19.0 です。NuGet パッケージマネージャーコンソールを使用する場合は、次のコマンドを実行します。

Install-Package DocumentFormat.OpenXml

または、UIを使用して、NuGet パッケージ管理マネージャーを使用してパッケージを検索してインストールします。

パッケージを追加したら次のコードをProgram.csに追加します。コードでは簡単のため、ファイルが C:\demodata\sample.xlsxに存在する前提となっています。

using DocumentFormat.OpenXml.Packaging;
using DocumentFormat.OpenXml.Spreadsheet;


var file = @"C:\demodata\sample.xlsx";

using (SpreadsheetDocument document = SpreadsheetDocument.Open(file, false))
{
    var workbookPart = document.WorkbookPart;
    if (workbookPart == null) return;

    // シート名の取得
    var sheet = workbookPart.Workbook.Sheets?.Elements<Sheet>().FirstOrDefault();
    Console.WriteLine($"Sheet Name: {sheet?.Name}");

    // シートデータの取得
    var worksheetPart = workbookPart.WorksheetParts?.First(); // 先頭のシートデータ
    var sheetData = worksheetPart?.Worksheet.Elements<SheetData>().FirstOrDefault();

    // Shared String Tableの取得
    var sharedStringTable = workbookPart.SharedStringTablePart?.SharedStringTable;

    if(sheetData != null) { 
        foreach (var r in sheetData.Elements<Row>())
        {
            foreach (Cell c in r.Elements<Cell>())
            {
                var text = c.CellValue?.Text;
                if (c.DataType?.Value == CellValues.SharedString)
                {
                    text = sharedStringTable?.ElementAt(int.Parse(text)).InnerText;
                }
                Console.Write($"{text} ");
            }
            Console.WriteLine();
        }
    }
}

プログラムを保存して、ビルドし、エラーが発生しないことを確認します。

2. 動作確認

デバッグ実行すると例えば以下のようにターミナルに実行結果が出力されます。

コードの作成手順についての補足動画をyoutubeに上げました。