【C# NPOI】Excelをプログラムで処理したい(1)

C#

職場ではExcelで管理されているドキュメントがしばしばあって、そのドキュメントから特定の条件に合った結果だけを抽出してほしい、という要望に対応したときに「手動だと面倒くさいし、どうにかプログラムで処理できないかな…」と思って、調べて試した結果を備忘録もかねてまとめます。

Visual Basic Applications(VBA)

ExcelなどのMicrosoft Officeソフトで利用できるプログラミング言語として有名なものがVisual Basic Applications(VBA)です。VBAについての知識がある場合は、こちらを利用する方が手っ取り早いかと思います。ただ私はVBAに関してまったく知識がなかったので、「あまり利用する機会はなさそうなのに一から学習してもな…」と思い、多少なりとも知識があるC言語系でできる方法を探したところ、以下のようなものがありました。

Apache POI(NPOI)

Googleで「Excel NPOI」などで検索すると、いろいろ出てくると思いますので概要については省略しますが、NPOIとはざっくりと言ってしまえばC#でExcelを扱うことができるライブラリです。今回はこのライブラリの導入から実際にExcelファイルを処理するところまでやってみたいと思います。開発環境は以下を前提とします。

■ OS : Windows 10 Home

■ IDE : Visual Studio Community 2019

■.NET Core 3.1

■ NPOI 2.5.1

NPOIの導入

Visual Studio Community 2019を起動し、新しいプロジェクトの作成を選択します。

コンソールアプリ(.NET Core)を選択して、次へを押します。

プロジェクト名、プロジェクトの場所、ソリューション名を任意に入力して、作成を押します。「ソリューションとプロジェクトを同じディレクトリに配置する」のチェックはどちらでも構いません。

プロジェクトを右クリックして出てくるメニューの「NuGetパッケージの管理」を選択します。

「参照」を選択し、検索ウインドウに「NPOI」と入力して実行すると、NPOIのパッケージが表示されるので、これを選択してインストールします。

インストール中に以下の画像が出てきた場合は、OKで先に進みます。

インストールが終わったらNPOIの導入は完了です。インストールが終わったかどうか確認するには「出力」タブを見てください。

Excelファイルの読み込み

まずはNPOIの公式GitHub(https://github.com/tonyqus/npoi/wiki/Getting-Started-with-NPOI)を参考に、以下のような「Excelファイルを開いてセルの値を取得し、コンソールに結果を表示する」ソースコードを作成・実行します。テストに利用するExcelファイルはこんな感じです。

using System;
using System.IO;
using NPOI.SS.UserModel;
using NPOI.HSSF.UserModel; // Excel 97-2003 formats (.xls) 
using NPOI.XSSF.UserModel; // Excel 2007+ formats (.xlsx)

namespace NPOITest
{
  class Program
  {
    static void Main(string[] args)
    {
      try
      {
        // 読み込むExcelファイルの場所(サンプルは絶対パスで指定)
        // パス指定時に\は\のようにエスケープしておくこと
        string filePath = "C:\Hoge\Fuga\ExcelReadTest.xlsx";

       // 編集中のExcelファイルをプログラムから開いても動作するように(排他ロックせずに読み取り専用で開く) 
       // モードを指定してファイルストリームオブジェクトのインスタンス作成して以下の関数に引数として渡す 
       var fs = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite); 

       // Excelファイルを読み込む 
       IWorkbook workbook = WorkbookFactory.Create(fs); 

       // Excelの1シート目を取得。?はnullチェック用の条件演算子 
       var sheet = workbook?.GetSheetAt(0); 

       // シートの最終行を取得 
       int lastRow = sheet.LastRowNum; 
       
       for(int i=0; i<=lastRow; i++) 
       { 
         var row = sheet?.GetRow(i); // 行を取得 
         if (row == null) continue; 

         short lastCellNum = row.LastCellNum; // 行の最終列を取得
         for(int j = 0; j <=lastCellNum; j++) 
         { 
           var column = row?.GetCell(j); // 取得した行の列(=セルの値)を取得
           var columnString = column?.ToString(); // セルの値を文字列で取得 
           //取得した文字列がnullもしくは空文字でなければコンソール出力
           if (!string.IsNullOrWhiteSpace(columnString)) 
           { 
              Console.WriteLine(columnString);
           }
         }
       }
     } catch (Exception ex) 
       { 
         // エラーが発生したらコンソール出力 
         Console.WriteLine(ex);
       }
     }
  }
}

上記を実行すると以下のような結果が出力されます。

Excelのセルの値がちゃんと出力されていることが確認できました。

長くなってきましたので今回はここまでにします。次回はExcelファイルの書き出しセルのスタイル設定などに触れられたらと思います。

コメント