Unity5でxls、xlsxファイル操作を実装する方法

# はじめに
Unity5でエクセルファイルを読み込む場合、いくつかのDLLを用いることで簡単にエクセルファイルの操作機能を実装する事が可能です。今回はそのDLLの紹介とUnity5のプロジェクトでの使い方、注意点をまとめておきます。

# 使用するDLLについて
今回は以下の4つを検討

OpenXML
ClosedXML
NPOI
EPPlus

# どれを使用するか
### OpenXML
まずOpenXMLはSDK2.0だと.Netのバージョンが3.5なのでエラーが出る。SDK1.0だと2007のエクセルまでは扱えるが古い。後単純にAPIが扱いづらい。ので使わない。

### ClosedXML
OpenXMLを使いやすくしたもの。
ソースコードは公開されているのでUnityで使えるようにビルドが可能。
ビルドする際はTargetFrameworkをUnity3.5 .net Full Base Class Librariesにして行うこと。
ただしプロジェクトの設定でApi Compatibility LevelがFull Baseでなければならない。

### NPOI
こちらはdllを特にビルドし直さなくても使用可能。
Api Compatibility Levelも気にしなくてOK。
ClosedXMLが使えない場合の候補。

### EPPlus
.xls形式には対応してないそうなので今回は検証してない。


# DLLファイルの置き場所
Assetフォルダ内であればどこでも認識してくれます。
それぞれで必要なDLLファイルを設置します。

# 読み込みを行うサンプルコード
適当に書いてみました。
それぞれファイル→シート→列行の項目を参照するような形になっています

### CLOSEDXML
```cpp
public void Read(string _path)
{
    XLWorkbook _book;
    using (_book = new XLWorkbook(_path))
    {
        for (int index = 0; index < _book.Worksheets.Count; index++)
        {
            IXLWorksheet _sheet = _book.Worksheet(index);
            for (int _index_row = 0; _index_row < _sheet.RowCount(); _index_row++)
            {
                for (int _index_column = 0; _index_column < _sheet.ColumnCount(); _index_column++)
                {
                    IXLCell _cell = _sheet.Cell(_index_row, _index_column);
                }
            }
        }
    }
}
```

### NPOI
```cpp
public void Read(string _path)
{
    using (FileStream _stream = File.Open(_path, FileMode.Open, FileAccess.Read, FileShare.Read))
    {
        file_path = _path;
        IWorkbook _book = null;
        string _extension = Path.GetExtension(_path);
        if (_extension == ".xls")
        {
            _book = new HSSFWorkbook(_stream);
        }
        else if (_extension == ".xlsx")
        {
            _book = new XSSFWorkbook(_stream);
        }
        else
        {
            return;
        }

        for (int _sheet_index = 0; _sheet_index < _book.NumberOfSheets; ++_sheet_index)
        {
            ISheet _sheet = _book.GetSheetAt(_sheet_index);
            int _row_num = _sheet.LastRowNum;
            for (int _row_index = _sheet.FirstRowNum; _row_index < _row_num; _row_index++)
            {
                IRow _row = _sheet.GetRow(_row_index);
                if (_row == null )
                    continue;

                int _cell_num = _row.LastCellNum;
                for (int _cell_index = _row.FirstCellNum; _cell_index < _cell_num; _cell_index++)
                {
                    ICell _cell = _row.GetCell(_cell_index);
                    if (_cell == null)
                        continue;

                    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:
                                break;
                    }
                }
            }
        }
    }
}
```

## 　

書き込み処理に関しては試していないけどそこまで難しくないはず。
OpenXMLを使うよりかは格段に楽になるのでばんばん使っていきましょう。

まぁ、あまり機会はないかもですが。