以下均為我個人總結的方案,如果有所不足的地方,請多多包涵
首先,需要加入庫檔案aspose.cells 和system.data庫檔案
讀取excel資料的思路是:將表中所有資料作為文字資料讀取,轉成datatable,然後在工具內進行型別轉換。
在讀取之前,要先定好我們需要的excel表中的格式,基於以後希望能通用到多個專案。所以我定義的格式支援雙端,格式如下:
第四行,關鍵key數量,簡單來說,就是索引,是通過多少個關鍵key找到對應唯一的資料。
例如,目前的大型網路遊戲,寵物分成了階級,在階級內又分等級,這時候,就是使用2*2,2個關鍵key來做索引了。
接下來,基於asopse.cells,編寫乙個工具類,用於讀取excel表資訊。
以後可以基於這個工具類,再進行擴充套件,做出將資料匯出為excel表內容等等功能。
public class asposeexceltool
private static datatable readfromfile(string filename, string title)
if (filename.indexof(".xls") < 0)
tryworksheet ws = null;
if (title != null)
ws = wb.worksheets[title];
if (ws == null)
if (ws == null)
file.close();
var iter = ws.cells.getenumerator();
while (iter.movenext())}}
fixcolumns(ws);
return fixrows(ws.cells.exportdatatableasstring(0, 0, ws.cells.maxdatarow + 1, ws.cells.maxdatacolumn + 1, true));}}
catch (exception e)
return null;
}public static void fixcolumns(worksheet ws)
else}}
public static datatable fixrows(datatable dt)
return dt;}}
現在資料已經都轉換成datatable,接下來就是對資料進行處理。
還記得第一篇章中提到的函式updateclientdata,這就是我處理資料的函式。
/// /// 選中檔案路徑
///
private string curfilepath;
/// /// 選中檔案名字
///
private string curfilename;
/// /// 選中檔案大寫名字
///
private string curnewname;
private string fileinfo; //excel裡面的中文名字
private int keynum = 0; //key數量
private bool neederror = true;
private dictionarydicfilenames; //excel名、excel裡面的中文名字
private dictionarydiccolumnnames; //excel表內每行對應的中文名字
private dictionarydicclientmembers; //客戶端型別對應的屬性名
private dictionarydicclienttypes; //客戶端型別
private dictionarydicservermembers; //服務端型別對應的屬性名
private dictionarydicservertypes; //服務端型別
private listindex; //列數
private dictionary> dicdata;//資料字典
private const int export_type_lua = 1;
private const int export_type_json = 2;
private const int export_type_script = 3;
private const int export_type_asset = 4;
private dictionaryexport_type_string = new dictionary();
void onenable()
private bool updateclientdata(fileinfodata fi,int exporttype, bool show = true)
assetdatabase.refresh();}}
return success;
}
以上就是一些初始化工作,重點部分在exportexceltoclient函式裡。
private const int const_file_info_row_index = 0; //表名index
private const int const_column_names_row_index = 1; //字段描述index
private const int const_keys_row_index = 2; //關鍵key index
private const int const_client_members_row_index = 3; //客戶端屬性名字index
private const int const_client_types_row_index = 4; //客戶端型別index
private const int const_server_members_row_index = 5; //服務端屬性名字index
private const int const_server_types_row_index = 6; //服務端屬性名字index
private const string const_client_int_type = "int";
private const string const_client_string_type = "string";
private const string const_client_array_type = "array";
private static listclient_type_list = new list()
;private bool exportexceltoclient(fileinfodata fi, bool show, int exporttype)
if (datatable.rows.count < (const_server_types_row_index + 1))
try//因為前六行已經在上面進行了判斷,並且continue之後,跳過了下面的步驟
if (!show && fi.tojson) return true;
dictionarydicrowdata = new dictionary();
for (int j = 0; j < datatable.columns.count; j++)
dicdata[i] = dicrowdata;//哪行,對應那一行的所有列數的資料
}//這裡接下去是資料匯出部分,將在第三篇章放出。
}
以上處理datatable中的資料,之前定義好的excel格式,處理不同行數的資料。
根據不同行數,不同處理如下:
#region 客戶端讀取各個欄位tool
private bool readcolumnnames(datatable datatable)
}return success;
}private bool readclientmembers(datatable datatable,bool show,out bool success)
{string member;
success = true;
listmemberlist = new list();
for (int i= 0;i經過了這些處理之後,定義的格式中的不同行數的資料就已經全部讀取並分類好了。
因我個人小專案只是個單機遊戲,所以服務端的部分暫時沒有編寫。
工具都是慢慢完善的,待以後我完善了也會回頭重新梳理寫過的文章。
接下來就是將資料運用起來,然後匯出我們想要的格式,詳細將在第三篇章闡述。
Unity編輯器擴充套件
unity引擎除了提供大部分通用的功能以外,還為開發者提供了編輯器的擴充套件開發介面,開發者可以編寫編輯器指令碼,打造適合自己的遊戲輔助工具和定製的編輯器。以前指令碼開發中使用的一些api和元件類,都屬於執行時類,unity還提供了編輯器類用於編輯器的擴充套件開發,包括編輯器環境下使用的gui類,編...
Unity擴充套件編輯器三
scene檢視是編輯遊戲模型的地方,其實它還可以進行編輯,如下圖所示,我給scene檢視做了簡單的編輯 scene檢視的擴充套件是基於物件的,意思是你必須在hierarchy檢視中選擇乙個物件才行,hierarchy檢視中選擇不同的物件可以有不同的scene檢視。圖中我麼建立了乙個立方體物件,接著給...
Unity編輯器擴充套件 視窗建立
using unityeditor 展示對話方塊中的屬性 public class playerchange scriptablewizard 建立表和屬性被修改的時候每幀被呼叫 private void onwizardupdate 當物體在選中或未選中狀態發生改變時呼叫 private void...