LoginSignup
9
3

More than 5 years have passed since last update.

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

Last updated at Posted at 2016-12-19

はじめに

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

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

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を使うよりかは格段に楽になるのでばんばん使っていきましょう。

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

9
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
3