ClosedXML で Excel ファイルを読む方法

ここでは ClosedXML を用いて、 Excel ファイルから内容を読み取る方法を説明します。

特定のセルを読む方法

まずは、「ClosedXML で簡単な Excel ファイルを作成する方法」で 作成した Excel ファイルから文字を読み取ります。

セル C2 に "Hello world!" と書いてあります。ワークシート (タブ) の名前は "Tab A" です。

次のように XLWorkbook オブジェクトの Worksheets コレクションの中から "Tab A" という名前 (Name 属性) のワークシートを探し、 その中でセル C2 の値 (Value) を取得します。

using System;
using ClosedXML.Excel;

namespace ClosedXMLTest1c
{
    class Program
    {
        static void Main(string[] args)
        {
            var workbook = new XLWorkbook(@"C:\Temp\test1.xlsx");
            foreach(var worksheet in workbook.Worksheets)
            {
                if(worksheet.Name.Equals("Tab A"))
                {
                    Console.WriteLine("C2={0}", worksheet.Cell("C2").Value);
                    break;
                }
            }
        }
    }
}

この実行結果は次のようになります。

C2=Hello world!

条件を満たすセルを抽出する方法

上記の例ではセル "C2" から文字を読む、ということが分かっていたので、セルアドレスを指定することで一発で文字を読むことが可能でした。

何らかの条件を満たすセルを抽出する場合は、FindCells メソッドを利用します。

具体例として次のエクセルシートを考えてみましょう。

カラム A に州が書いてあって、カラム B に市が書いてあるとします。ここではテキサス州の市を抽出してみましょう。

上の表で Dallas と Irving が抽出出来れば成功です。

これを行うには次のようにします。

using System;
using ClosedXML.Excel;

namespace ClosedXMLTest1c
{
    class Program
    {
        static void Main(string[] args)
        {
            var workbook = new XLWorkbook(@"C:\Temp\test_cities.xlsx");
            
            var cells = workbook.FindCells((cell) =>
            {
                var addr = cell.Address;

                if (cell.Worksheet.Name.Equals("Tab A")
                && addr.ColumnNumber == 2
                && cell.Worksheet.Cell(addr.RowNumber, addr.ColumnNumber - 1)
                    .Value.ToString().StartsWith("Texas"))
                {
                    return true;
                }
                return false;
            });
            
            foreach(var cell in cells)
            {
                Console.WriteLine("{0}={1}", cell.Address, cell.Value);
            }
            
        }
    }
}

FindCells メソッドの引数には 「XLCell オブジェクトを受け取り、条件を満たす場合は true、満たさない場合は false を返す関数」 を渡します。

このような場合は、ラムダ式 を使うと便利です。

実行時にはエクセルシートの利用範囲内にある XLCell (セル) オブジェクトがひとつひとつ渡されて、そのセルを評価することが可能になります。

上記の例では、それぞれのセルについて、カラム 2 (B) であったら、同じ行のカラム 1 (A) をみて、それがテキサスだったら true を返すようにしています。

ここまでお読みいただき、誠にありがとうございます。SNS 等でこの記事をシェアしていただけますと、大変励みになります。どうぞよろしくお願いします。

© 2024 C# 入門