こちらについて、細かな機能や設計を解説した記事になります。
機能
ファイルの場所を変えたい
MapChip.cs、MapChip_Table.cs は設定画面で class dir に設定された場所に配置されます。
MapChip.asset (Scriptable Object) は scriptable object dir に設定された場所になります。
この設定はエクセルファイルごとに変更が可能です。
List<>(配列)を扱いたい場合
List<> にしたい箇所の型に [] をつけ、横に並べてください。(画像だと MapNo)
このようになります。
テーブルクラス内 (Row) にサブクラスを作成したい場合
以下のような構造にしたい場合…
public class Row { int ID; eCategory Category; Map Map; } public class Map { eMapHit Hit; List<string> Mapno = new List<string>(); }
エクセルをこのように記述してください。
サブクラスにもコメントを入れる
先ほどのサブクラスで示したクラス宣言部分、他はコメントがあるのに、サブクラスだけないのはちょっと不自然です。
サブクラスにもコメントが欲しい場合、エクセルに以下の記述を付け足します。
なぜ ArcCity_Table がないのか(1クラス複数シート)
ArcCity と RainForce はテーブルクラス(ソースコード)がありません。
この 2 つは CityData_Table と全く同じテーブルの形であるため、自動的に CityData_Table に統合されます。
同じテーブルが複数あった場合、一番左のシートが優先してクラス化され、後のテーブルはそのクラスを使用します。
ステージデータや町データなど、クラスの形は一緒だけどデータの内容が違う…といった場合にこの機能は便利です。
サンプルエクセルの CityData シートに中身がないのは、クラス名を CityData_Table にするための小細工です。
Mapchip.cs、Mapchip_Table.cs、MapChip_Import.cs のテンプレートファイルは?
以下のファイルです。必要であれば内容を書き換えてもいいでしょう。
Mapchip_Table.cs -> ImportXLSTemplate_Class.cs
Mapchip.cs -> ImportXLSTemplate_Access.cs
Mapchip_Import.cs -> ImportXLSTemplate_Import.txt
技術仕様とか
割と自由な場所にデータを置ける理由
こんなハチャメチャなポジションに置いても、実は大丈夫だったりします。
理由ですが、ID、[ENUM]、[CLASS] と表記のあるセルを探し出し、そこから横、または(上)下にデータを確認していくため、A1 列からデータを置かなくても動作するようになっています。
クラスメンバの上にコメントや、サブクラス宣言を書くことができます。この時、コメントは空欄でその上にサブクラス宣言がある際の検出の都合で、データ間は必ず 2 列必要になっています。
計算式も自由に取得
これは ImportXLS というより NPOI の仕様解説です。
ICell はほとんどの値を ToString() で取得できますが、以下の C1 列については、計算式をそのまま返してしまいます。
( =TEXT(A1,"###")&"+"&TEXT(B1,"###")&"=" をそのまま返す)
このような場合、次の手順で望む値(計算結果)を取得します。
- CellType が Formula になっているか確認(なっていたら計算式)
- CachedFormulaResultType を確認。Numeric、Boolean、String などの計算結果の型が入っている
- Numeric なら NumericCellValue、Boolean なら BooleanCellValue、String なら StringCellValue を取得
string cellstr = cell.ToString(); CellType celltype = cell.CellType == CellType.Formula ? cell.CachedFormulaResultType : cell.CellType; switch (celltype) { case CellType.Numeric: cellstr = cell.NumericCellValue.ToString(); break; case CellType.Boolean: cellstr = cell.BooleanCellValue.ToString(); break; case CellType.String: cellstr = cell.StringCellValue.ToString(); break; }
同じ列構造を持つテーブルの判断方法
Row ID int Category eMapNo Map Map = new Map() NextMap eMap Map Hit eMapHit MapNo List = new List()
↓
98c71a4882571ec1e143f1c60a87ff1de7fc5e7680fbbe3ae375927e24cb62e7
テーブルの列、列の型を全て文字列として繋げ、そのハッシュを各シート算出し、一致していれば「同じ列構造」と判定しています。
このため、列の順番を変えてしまうと別テーブルと判定されてしまいます。