MENU閉じる

HEXA BLOG

プログラム

HEXA BLOGプログラム2017.5.10

敵とか武器とかアイテムとか その2

GW中にハイラルを救い、無事に勇者の仲間入りを果たすことができました

こんにちは、だっちです

(ハイラルから外に出るのは久しぶりなので現実世界のリハビリ中なのは内緒です)

 

 

さて、前回に引き続き、Excelで作成したデータから、

ゲーム内で扱いやすい形に変換するためのプログラムを実装していこうと思います。

 

今回は「型を生成するための情報」を定義していきたいと思います。

各種データを持つクラスを作成するためには、最低でも以下の情報が必要です。

・クラス情報

 ・名前

 ・説明

・メンバ変数情報

 ・名前

 ・型

 ・説明

 

「武器」のデータを例として、

上記の情報を実際にExcelに入力して「クラス(型)定義」として扱うための準備を行います。

Excelに入力するとこんな感じになります。

NPOITestExcelDataTypedefWeapon

 

 

前回作成したプログラムを改良してこの情報を読み込んでみます。
コードはこんな感じです。

using System;
using System.IO;
using NPOI.SS.UserModel;

namespace NPOITest
{
	class Program
	{
		private const string	TYPEDEF_SHEET_NAME		= "typedef";		//!< 「型情報定義」シート名

		private const int	DATA_NAME_ROW			= 0;			//!< データ名行
		private const int	DATA_NAME_CELL			= 1;			//!< データ名列

		private const int	DATA_DESC_ROW			= 1;			//!< データ説明行
		private const int	DATA_DESC_CELL			= 1;			//!< データ説明列

		private const int	MEMBER_VARIABLE_START_ROW	= 10;			//!< メンバ変数開始行
		private const int	MEMBER_VARIABLE_NAME_CELL	= 1;			//!< メンバ変数名列
		private const int	MEMBER_VARIABLE_TYPE_CELL	= 2;			//!< メンバ変数型列
		private const int	MEMBER_VARIABLE_DESC_CELL	= 3;			//!< メンバ変数説明列
		private const int	MEMBER_VARIABLE_MAX		= 1024;			//!< メンバ変数最大許容数

		// エントリポイント
		public static void Main(string[] args)
		{
			// 入力受付
			Console.Write("Please input excel file path : ");
			var srcPath = Console.ReadLine();

			// ファイル存在確認
			if( !File.Exists(srcPath) ) {
				Console.WriteLine("file not exists.");
				return;
			}

			// 読み込み
			using( var fs = new FileStream(srcPath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite) ) {
				var workbook = WorkbookFactory.Create(fs);

				// 中にあるシートを順番に取得
				foreach( ISheet sheet in workbook ) {
					if( sheet == null ) continue;

					// シート名表示
					Console.WriteLine("	Name : " + sheet.SheetName);

					// シートの名前が「型情報定義」シート名だったら、型情報を読み込み
					if( sheet.SheetName == TYPEDEF_SHEET_NAME ) {
						Console.WriteLine();

						Console.WriteLine("Data");
						// データ名を取得
						var dataName = getCellValue(sheet, DATA_NAME_ROW, DATA_NAME_CELL);
						if( string.IsNullOrWhiteSpace(dataName) ) {
							Console.WriteLine("DataName acquisition failed...");
						}
						else {
							Console.WriteLine("	Name : " + dataName);
						}

						// データ説明を取得
						var dataDesc = getCellValue(sheet, DATA_DESC_ROW, DATA_DESC_CELL);
						if( string.IsNullOrWhiteSpace(dataDesc) ) {
							Console.WriteLine("DataDesc acquisition failed...");
						}
						else {
							Console.WriteLine("	Desc : " + dataDesc);
						}

						// メンバ変数を取得
						Console.WriteLine("MemberVariables");
						for( int i = 0, row = MEMBER_VARIABLE_START_ROW; i < MEMBER_VARIABLE_MAX; ++i, ++row ) {
							// メンバ変数名を取得
							var memberName = getCellValue(sheet, row, MEMBER_VARIABLE_NAME_CELL);
							if( string.IsNullOrWhiteSpace(memberName) ) {
								Console.WriteLine("MemberName acquisition failed...");
								// メンバ変数名が空欄だったら終了と判断
								Console.WriteLine("End Of Member Variables");
								break;
							}

							Console.WriteLine("	[" + i + "]");
							Console.WriteLine("		Name : " + memberName);

							// メンバ変数型を取得
							var memberType = getCellValue(sheet, row, MEMBER_VARIABLE_TYPE_CELL);
							if( string.IsNullOrWhiteSpace(memberType) ) {
								// メンバ変数名が空欄だったら終了と判断
								Console.WriteLine("MemberType acquisition failed...");
							}
							else {
								Console.WriteLine("		Type : " + memberType);
							}

							// メンバ変数説明を取得
							var memberDesc = getCellValue(sheet, row, MEMBER_VARIABLE_DESC_CELL);
							if( string.IsNullOrWhiteSpace(memberDesc) ) {
								// メンバ変数名が空欄だったら終了と判断
								Console.WriteLine("MemberDesc acquisition failed...");
							}
							else {
								Console.WriteLine("		Desc : " + memberDesc);
							}
						}
					}
				}
			}
		}

		// セルの値を取得
		private static string getCellValue(ISheet sheet, int rowIndex, int cellIndex)
		{
			if( sheet == null ) return string.Empty;

			// 行を取得
			var row = sheet.GetRow(rowIndex);
			if( row == null ) return string.Empty;

			// 行からセルを取得
			var cell = row.GetCell(cellIndex);
			if( cell == null ) return string.Empty;

			// セルが取得できたら中身を文字列化
			return cell.ToString();
		}
	}
}

 

 

実行結果

NPOITestExcelDataResultReadWeapon

「型を生成するための情報」をExcelから取得できていますね

 

 

次回は、今回取得した情報を元に「クラスファイル」を書き出していきたいと思います。

ではでは~

RECRUIT

大阪・東京共にスタッフを募集しています。
特にキャリア採用のプログラマー・アーティストに興味がある方は下のボタンをクリックしてください

RECRUIT SITE