NPOI

 from https://www.sejuku.net/blog/100771




    ファイルの作成

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

    サンプルコード:

    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;
            }
        }
    }

    実行結果:









留言

熱門文章