【C#】NPOIならExcel操作が簡単にできる!使い方まとめ

C#でExcelの自動化がしたい
Microsoft.Office.Interop.Excelってよくわからない
もっと早くて楽に実装できないの?

Excelファイルの自動化は、簡単な様で意外と骨が折れる作業ですよね。もっと楽にできないの?と思う方も多いかと思います。

こんにちは!現役エンジニア5年目の遠藤です。

今回の記事では、NPOIというオープンソースライブラリを使って、Excelファイルを編集する方法について解説致します!

この記事はこんな方へ向けて書かれています。

  • #でExcelを編集する仕方を知りたい方
  • Microsoft.Office.Interop.Excelで躓いた方
  • できれば楽に実装したいという方

この記事を読んでいただければ、NPOIを使ってExcel編集の基本的な事が可能になります。

是非最後までお付き合いください!

C#でExcel操作をする為には

C#でExcel操作をするにあたって、今回は冒頭でも説明したNPOIというオープンソースライブラリを使用します。NPOIを使う利点は、以下が挙げられます。

  • Excel自体をインストールしなくても良い
  • プロセスの解放など、面倒なことを気にしなくて良い
  • 他のオープンソースライブラリより比較的処理が早い

環境の準備

今回の記事で使用する環境は以下の通りです。

  • Windows 10
  • C#の動作環境(Project作成まで完了している前提)
  • NuGet 5.0.2
  • NPOI 2.4.1

本章では、NuGetとNPOIのインストール手順について解説致します。

NuGet(パッケージマネージャー)のインストール

まずはNuGetというパッケージマネージャーをインストールし、コマンドプロンプトで使えるようにしましょう。

  1. C:\Program Files (x86)にNuGetフォルダを作成する。
  2. nuget.exeをダウンロードする
  3. こちらから推奨のパッケージをダウンロードしてください。

  4. 1で作成したNuGetフォルダにダウンロードしてきたnuget.exeを配置する
  5. パスを通す
    1. Windowsの検索欄で「環境変数を編集」と入力し、出てきたボタンを選択
    2. 以下のような画面が出るので、ユーザ環境変数の「Path」を選択し、編集ボタンを押す
    3. 以下の画面で新規ボタンを押し、先ほど作成したNuGetフォルダのパスを入力。OKボタンを押して設定完了

    これでコマンドプロンプトでいつでもnugetコマンドが使えるようになります。実際にコマンドプロンプトを開き、nugetコマンドを実行しましょう。


    上のようなHelpが出ていればOKです!

    NuGetでNPOIをインストールする

    今度はNPOIをインストールします。コマンドプロンプトで以下のコマンドを実行します。

    $nuget Install NPOI

     
    インストールが完了したら、C#のプロジェクトでNPOIを参照できるようにしましょう。参照設定の手順は使用環境によって異なるので、それぞれの環境での手順を参照してください。

    Excelファイルの操作方法

    基本的な設定が完了したら、実際にExcelファイルの操作を行いましょう!

    ファイルの作成

    まずはファイルの作成です。以下のようにしてファイルを作成します。

    サンプルコード:

    using System;
    using System.IO;
    using NPOI.SS.UserModel;
    using NPOI.XSSF.UserModel;
    
    namespace NPOI_Excel
    {
        class CreateFile
        {
            static void Main()
            {
                try 
                {
                    IWorkbook book;
                    string fileName = "sample.xlsx"; //ファイル名を決めておく
    
                    book = new XSSFWorkbook(); //ブックを作成
                    book.CreateSheet("Sheet1"); //シートの作成
    
                    //ブックを保存
                    using(var fs = new FileStream(fileName, FileMode.Create))
                    {
                        book.Write(fs);
                    }
                }
                //ファイル作成時に例外が発生した場合の処理
                catch(Exception ex) 
                {
                    Console.WriteLine(ex);
                }
            }
        }
    }

    シートが1つ以上ないとファイルを保存できても開けなくなってしまう点だけ注意しましょう。

    実行すると、xlsxファイルが作成されている事が確認できます。

    読み込み

    既に作成されているファイルを読み込むには以下のように行います。

    サンプルとなるExcelファイルには以下のように入力してあります。

    実装例:

    using System;
    using System.IO;
    using NPOI.SS.UserModel;
    
    namespace NPOI_Excel
    {
        class ReadFile
        {
            static void Main()
            {
                try {
                    var book = WorkbookFactory.Create( "sample.xlsx" ); //ブックの読み込み
    
                    //シート名からシートを取得
                    var sheet = book.GetSheet("Sheet1");
    
                    //セルの値を取得する処理を実行
                    getCellValue(sheet, 0, 0);
                    getCellValue(sheet, 0, 1);
                    getCellValue(sheet, 0, 2);
                    getCellValue(sheet, 0, 3);
                    getCellValue(sheet, 0, 4);
    
                }
                catch( Exception ex ) {
                    Console.WriteLine( ex );
                }
            }
    
            //指定したセルの値を取得する
            public static void getCellValue(ISheet sheet, int idxColumn, int idxRow)
            {
                var row = sheet.GetRow( idxRow ) ?? sheet.CreateRow( idxRow ); //指定した行を取得できない時はエラーとならないよう新規作成している
                var cell = row.GetCell( idxColumn ) ?? row.CreateCell( idxColumn ); //一行上の処理の列版
                string value;
    
                switch(cell.CellType)
                {
                    case CellType.String:
                        value = cell.StringCellValue;
                        break;
                    case CellType.Numeric:
                        value = cell.NumericCellValue.ToString();
                        break;
                    case CellType.Boolean:
                        value = cell.BooleanCellValue.ToString();
                        break;
                    default:
                        value = "Value無し";
                        break;
                }
                Console.WriteLine("value: " + value);
            }
        }
    }

    実行結果:

    value: cell A1
    value: 2
    value: True
    value: Value無し
    value: cell A5

    書き込み

    続いて書き込みです。

    セルに書き込みをする場合は、SetCellValue()で書き込みます。この時に指定した引数の型(数値や文字列、日付など)に合わせて値がセルに格納されます。

    サンプルコード:

    using System;
    using System.IO;
    using NPOI.SS.UserModel;
    using NPOI.XSSF.UserModel;
    
    namespace NPOI_Excel
    {
        class WriteCellValue
        {
            static void Main()
            {
                try 
                {
                    IWorkbook book;
                    string fileName = "sample.xlsx"; //ファイル名を決めておく
    
                    book = new XSSFWorkbook(); //ブックを作成
                    ISheet sheet = book.CreateSheet("Sheet1"); //シートの作成
    
                    writeCellValue(sheet, 0, 0, "value A1");
                    writeCellValue(sheet, 0, 1, 256);
    
                    //日付表示するためには書式設定が必要
                    var style = book.CreateCellStyle();
                    style.DataFormat = book.CreateDataFormat().GetFormat("yyyy/mm/dd");
                    writeCellValue(sheet, 0, 2, DateTime.Today, style);
    
                    //ブックを保存
                    using(var fs = new FileStream(fileName, FileMode.Create))
                    {
                        book.Write(fs);
                    }
                }
                //ファイル作成時に例外が発生した場合の処理
                catch(Exception ex) 
                {
                    Console.WriteLine(ex);
                }
            }
    
            //セル書き込み(書き込む値が文字列の場合)
            static void writeCellValue(ISheet sheet, int idxColumn, int idxRow, string value)
            {
                var row = sheet.GetRow(idxRow) ?? sheet.CreateRow(idxRow); //指定した行を取得できない時はエラーとならないよう新規作成している
                var cell = row.GetCell(idxColumn) ?? row.CreateCell(idxColumn); //一行上の処理の列版
    
                cell.SetCellValue(value);
            }
    
            //セル書き込み(数値の場合)
            static void writeCellValue(ISheet sheet, int idxColumn, int idxRow, double value)
            {
                var row = sheet.GetRow(idxRow) ?? sheet.CreateRow(idxRow); 
                var cell = row.GetCell(idxColumn) ?? row.CreateCell(idxColumn);
    
                cell.SetCellValue(value);
            }
    
            //セル書き込み(日付の場合)
            static void writeCellValue(ISheet sheet, int idxColumn, int idxRow, DateTime value, ICellStyle style)
            {
                var row = sheet.GetRow(idxRow) ?? sheet.CreateRow(idxRow); 
                var cell = row.GetCell(idxColumn) ?? row.CreateCell(idxColumn);
    
                cell.SetCellValue(value);
                cell.CellStyle = style;
            }
        }
    }

    実行結果:

    罫線の付け方

    罫線はStyleとして記述します。

    サンプルコード:

    using System;
    using System.IO;
    using NPOI.SS.UserModel;
    using NPOI.XSSF.UserModel;
    
    namespace NPOI_Excel
    {
        class WriteBorder
        {
            static void Main()
            {
                try 
                {
                    IWorkbook book;
                    string fileName = "sample.xlsx"; //ファイル名を決めておく
    
                    book = new XSSFWorkbook(); //ブックを作成
                    ISheet sheet = book.CreateSheet("Sheet1"); //シートの作成
    
                    writeCellBorder(book, sheet, 1, 1);
                    writeCellBorder(book, sheet, 2, 1);
                    writeCellBorder(book, sheet, 1, 2);
                    writeCellBorder(book, sheet, 2, 2);
    
                    //ブックを保存
                    using(var fs = new FileStream(fileName, FileMode.Create))
                    {
                        book.Write(fs);
                    }
                }
                //ファイル作成時に例外が発生した場合の処理
                catch(Exception ex) 
                {
                    Console.WriteLine(ex);
                }
            }
    
            //セル書き込み(書き込む値が文字列の場合)
            static void writeCellBorder(IWorkbook book, ISheet sheet, int idxColumn, int idxRow)
            {
                var border = book.CreateCellStyle();
                border.BorderBottom = BorderStyle.Thin;
                border.BorderLeft = BorderStyle.Thin;
                border.BorderRight = BorderStyle.Thin;
                border.BorderTop = BorderStyle.Thin;
    
                var row = sheet.GetRow(idxRow) ?? sheet.CreateRow(idxRow);
                var cell = row.GetCell(idxColumn) ?? row.CreateCell(idxColumn);
    
                cell.CellStyle = border;
            }
        }
    }

    実行結果:

    まとめ

    今回の記事では、以下の事を解説致しました。

    • NPOIを使う利点
    • 環境の準備
    • Excelファイルの操作方法

    NPOIは入り口が少々難しいですが、基礎的な操作は一通りできるので覚えてしまえばとても便利です。

    ここで使い方の基礎を身につけ、活用していってください!

    LINEで送る
    Pocket

SEからWebエンジニアへ転職した理由

侍エンジニア塾卒業生の小池さんは、以前は社内SEとして約5年ほど勤務していました。しかし業務内容は社内のヘルプデスク対応など、プログラムを書く仕事は全くなかったそうです。

SEながらプログラムを書けない現状に「将来仕事がなくなるんじゃないか」と不安を感じ、プログラミング学習を決意。

弊社スクールで学習し、無事ベンチャー企業のプログラマーとして転職に成功しました。そんな小池さんの学習法や転職体験談を伺いましたので、是非ご覧ください。

「プログラミングができないSEは仕事がなくなる」不安を感じたSEが未経験から転職成功するまで
更新日 : 2019年10月7日

書いた人

遠藤貴大

遠藤貴大

1991年生まれ。双子座。
理系大学で認証システムを学んだ後、アプリ開発者となる。
新しく学ぶ人に寄り添った記事を心がけて執筆します。
芸術が好き。いつか猫と暮らすのが夢。

おすすめコンテンツ

あなたにぴったりなプログラミング学習プランを無料で診断!

プログラミング学習の効率を劇的に上げる学習メソッドを解説