Excel4Unity-master插件使用

using UnityEngine;
using UnityEditor;
using System.Collections;
using OfficeOpenXml;
using System.IO;
using System.Collections.Generic;
using LitJson;
using System.Text;

public class Excel4Unity : Editor
{

[MenuItem("Excel4Unity/Test/ReadWrite")] 
static void ReadWrite()
{
    Excel xls = new Excel();
    ExcelTable table = new ExcelTable();
    table.TableName = "test";
    string outputPath = Application.dataPath + "/Test/Test2.xlsx";
    xls.Tables.Add(table);
    Debug.Log("數量==" + xls.Tables.Count);
    xls.Tables[0].SetValue(1, 1, "1");
    xls.Tables[0].SetValue(1, 2, "2");
    xls.Tables[0].SetValue(2, 1, "3");
    xls.Tables[0].SetValue(2, 2, "4");
    xls.ShowLog();
    ExcelHelper.SaveExcel(xls, outputPath);
}
/// <summary>
/// 讀
/// </summary>
[MenuItem("Excel4Unity/Test/Read")] 
static void Read()
{
    string path = Application.dataPath + "/Test/Test3.xlsx";
    Excel xls =  ExcelHelper.LoadExcel(path);
    xls.ShowLog();
}
/// <summary>
/// 新建一張excel表,覆蓋了原來的表(沒有這張表就創建一下)
/// </summary>
[MenuItem("Excel4Unity/Test/Write")] 
static void Write()
{
    Excel xls = new Excel();
    ExcelTable table = new ExcelTable();
    table.TableName = "test";
    string outputPath = Application.dataPath + "/Test/Test5.xlsx";
    xls.Tables.Add(table);
    xls.Tables[0].SetValue(1, 1, Random.Range(1000,100000).ToString());
    xls.ShowLog();
    ExcelHelper.SaveExcel(xls, outputPath);
}
/// <summary>
/// 把.xlsx根據寫好的格式轉換成.cs  
/// 這里設置.xlsx的第一行為字段名字 ed.FieldNameLine = 1;
/// 這里設置.xlsx的第二行為字段類型 ed.FieldTypeLine = 2;
/// 這里設置.xlsx的第三行為字段值   ed.FieldValueLine = 3;
/// 這里設置如果字段名字為空或者類型為空或者字段名字以#為開頭則不添加該字段,ed.IgnoreSymbol = "#";#為忽略值
/// </summary>
[MenuItem("Excel4Unity/Test/GenerateModel")] 
static void GenerateModel()
{
    string path = Application.dataPath + "/Test/Test4.xlsx";
    Excel xls =  ExcelHelper.LoadExcel(path);
    ExcelDeserializer ed = new ExcelDeserializer();
    ed.FieldNameLine = 1;
    ed.FieldTypeLine = 2;
    ed.FieldValueLine = 3;
    ed.IgnoreSymbol = "#";
    ed.ModelPath = Application.dataPath + "/Editor/Excel4Unity/DataItem.txt";
    ed.GenerateCS(xls.Tables[1]);
}

[MenuItem(@"Excel4Unity/Test/Excel2JSON")]
static void Excel2JSON()
{
    Object[] objs = Selection.objects;
    for (int i = 0; i < objs.Length; i++)
    {
        string path = AssetDatabase.GetAssetPath(objs[i]);
        if (path.EndsWith(".xlsx"))
        {
            Excel4Unity.ParseFile(path);
        }
        else
        {
            EditorUtility.DisplayDialog("提示", "暫不支持的文件格式" + path, "ok");
            return;
        }
    }
    AssetDatabase.Refresh();
}
/// <summary>
/// 解析excel文件在這里 for (int i = 4; i < = table.NumberOfRows; i++)寫死了從第四行開始
/// </summary>
/// <param name="path"></param>
/// <param name="createCS"></param>
/// <param name="isMac"></param>
/// <returns></returns>
public static string ParseFile(string path, bool createCS = true, bool isMac = false)
{
    //      UnityEngine.Debug.LogError ("path " + path);
    if (!path.EndsWith("xlsx"))
    {
        return null;
    }

    string tableName = "";
    string currentPropName = "";
    int tableRow = 0;
    int tableColumn = 0;
    string v = "";
    Excel excel = null;
    excel = ExcelHelper.LoadExcel(path);
    try
    {
        System.Text.StringBuilder sb = new System.Text.StringBuilder();
        JsonWriter writer = new JsonWriter(sb);
        writer.WriteObjectStart();
        foreach (ExcelTable table in excel.Tables)
        {
            tableName = table.TableName;
            bool language = tableName.ToLower().Contains("language");
            if (table.TableName.StartsWith("#"))
            {
                continue;
            }
            if (createCS)
            {
                ExcelDeserializer ed = new ExcelDeserializer();
                ed.FieldNameLine = 1;
                ed.FieldTypeLine = 2;
                ed.FieldValueLine = 3;
                ed.IgnoreSymbol = "#";
                ed.ModelPath = Application.dataPath + "/Editor/Excel4Unity/DataItem.txt";
                ed.GenerateCS(table);
            }
            writer.WritePropertyName(table.TableName);
            writer.WriteArrayStart();
            //這里寫死了從excel的第四行開始解析
            for (int i = 4; i <= table.NumberOfRows; i++)
            {
                tableRow = i;
                string idStr = table.GetValue(i, 1).ToString();
                if (idStr.Length <= 0)
                {
                    //                      UnityEngine.Debug.LogError ("ID error:" + tableName + "  (第" + i + "行)");
                    break;
                }
                writer.WriteObjectStart();

                for (int j = 1; j <= table.NumberOfColumns; j++)
                {
                    tableColumn = j;
                    string propName = table.GetValue(1, j).ToString();
                    string propType = table.GetValue(3, j).ToString();
                    propName = propName.Replace("*", "");
                    currentPropName = propName;

                    if (propName.StartsWith("#"))
                    {
                        continue;
                    }
                    if (string.IsNullOrEmpty(propName) || string.IsNullOrEmpty(propType))
                    {
                        continue;
                    }
                    writer.WritePropertyName(propName);
                    v = table.GetValue(i, j).ToString();
                    if (propType.Equals("int"))
                    {
                        int value = v.Length > 0 ? int.Parse(v) : 0;
                        writer.Write(value);
                    }
                    else if (propType.Equals("bool"))
                    {
                        int value = v.Length > 0 ? int.Parse(v) : 0;
                        writer.Write(value);
                    }
                    else if (propType.Equals("float"))
                    {
                        float value = v.Length > 0 ? float.Parse(v) : 0;
                        writer.Write(value);
                    }
                    else
                    {
                        string ss = table.GetValue(i, j).ToString();
                        if (language && ss.Contains(" "))
                        {
                            ss = ss.Replace(" ", "\u00A0");
                        }
                        writer.Write(ss);
                    }
                }
                writer.WriteObjectEnd();
            }
            writer.WriteArrayEnd();
        }
        writer.WriteObjectEnd();
        string outputDir = Application.dataPath + "/Resources/DataFiles/";
        string outputPath = outputDir + Path.GetFileNameWithoutExtension(path) + ".txt";
        if (!Directory.Exists(outputDir)) {
            Directory.CreateDirectory(outputDir);
        }
        string str = string.Empty;
        if (File.Exists(path))
        {
            byte[] bytes = File.ReadAllBytes(path);
            UTF8Encoding encoding = new UTF8Encoding();
            str = encoding.GetString(bytes);
        }
        string content = sb.ToString();
        if (str != content)
        {
            File.WriteAllText(outputPath, content);
        }
        Debug.Log("convert success! path = " + path);

        return sb.ToString();
    }
    catch (System.Exception e)
    {
        if (excel == null)
        {
            //                EditorUtility.DisplayDialog("ERROR!", "open excel failed!","ok"); 
            UnityEngine.Debug.LogError("open excel failed!");
        }
        else
        {
            string msg = "解析錯誤! \n表:" + tableName + " \n字段:" + currentPropName + "  \n第" + tableRow + "行,第" + tableColumn + "列 \nvalue = " + v;
            EditorUtility.DisplayDialog("error!", msg, "ok");
            UnityEngine.Debug.LogError(e);
            UnityEngine.Debug.LogError(e.StackTrace);
            UnityEngine.Debug.LogError(msg);
        }
        UnityEngine.Debug.LogError(e.StackTrace.ToString());
        return null;
    }
}

}

using UnityEngine;
using System.Collections;
using LitJson;
/// <summary>
/// 此為生成的類
/// </summary>
public class TestItem : DataItem {
public int ID;
public override int Identity(){ return ID; }
public string Name;
public int Type;

public override void Setup(JsonData data) {
    base.Setup(data);
    ID = int.Parse(data["ID"].ToString());
    Name = data["Name"].ToString();
    Type = int.Parse(data["Type"].ToString());

}

public TestItem () {

}

}


using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using LitJson;
public class TestExcel2Json : MonoBehaviour {

TestItem testItem;



// Use this for initialization
void Start () {
    //拿到測試類對象
    testItem = new TestItem();
    //加載寫好的json
    Object obj= Resources.Load("DataFiles/Test4") ;
    //把加載的數據轉為string
    string str = obj.ToString();
    Debug.Log("str==" + str);
    //new一個jsondata
    JsonData data = new JsonData();
    //把加載的字符串轉換成obj給data
    data = JsonMapper.ToObject(str);
    Debug.Log("data==" + data["Test"][0]);
    //調用setup函數給測試類字段賦值
    testItem.Setup(data["Test"][0]);
    Debug.Log("ID==" + testItem.ID);
    //Debug.Log(data[0]);
}

// Update is called once per frame
void Update () {
    
}

}

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,546評論 6 533
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,570評論 3 418
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,505評論 0 376
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,017評論 1 313
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,786評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,219評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,287評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,438評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,971評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,796評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,995評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,540評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,230評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,662評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,918評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,697評論 3 392
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,991評論 2 374

推薦閱讀更多精彩內容