7.生成Excel数据结构类

7.Excel表自动生成相关文件-生成数据结构类


7.1 知识点

创建生成Excel表对应的数据结构类函数,在生成Excel信息函数的遍历表循环中调用

[MenuItem("GameTool/GenerateExcel")]
private static void GenerateExcelInfo()
{
    // 遍历文件中的所有表的信息
    foreach (DataTable table in tableConllection)
    {
        Debug.Log(table.TableName);

        // 生成数据结构类
        GenerateExcelDataClass(table);

        // 生成容器类

        // 生成二进制数据
    }
}
private static void GenerateExcelDataClass(DataTable table)
{

}

创建获取变量名所在行函数和获取变量类型所在行函数。分别返回第0行和第1行,在生成Excel表对应的数据结构类函数中调用。

/// <summary>
/// 生成Excel表对应的数据结构类
/// </summary>
/// <param name="table"></param>
private static void GenerateExcelDataClass(DataTable table)
{
    // 字段名行
    DataRow rowName = GetVariableNameRow(table);

    // 字段类型行
    DataRow rowType = GetVariableTypeRow(table);
}

/// <summary>
/// 获取变量名所在行
/// </summary>
/// <param name="table"></param>
/// <returns></returns>
private static DataRow GetVariableNameRow(DataTable table)
{
    return table.Rows[0];
}

/// <summary>
/// 获取变量类型所在行
/// </summary>
/// <param name="table"></param>
/// <returns></returns>
private static DataRow GetVariableTypeRow(DataTable table)
{
    return table.Rows[1];
}

创建数据结构类脚本存储位置路径,在生成Excel表对应的数据结构类函数中判断数据结构类脚本存储位置路径是否存在,没有的话就创建文件夹

/// <summary>
/// 数据结构类脚本存储位置路径
/// </summary>
public static string DATA_CLASS_PATH = Application.dataPath + "/Scripts/ExcelData/DataClass/";

// 判断路径是否存在,没有的话就创建文件夹
if (!Directory.Exists(DATA_CLASS_PATH))
    Directory.CreateDirectory(DATA_CLASS_PATH);

在生成Excel表对应的数据结构类函数中用字符串逐个拼接出数据结构类和对应变量。把拼接好的字符串存到指定文件中去。刷新Project窗口。

// 如果我们要生成对应的数据结构类脚本,其实就是通过代码进行字符串拼接,然后存进文件就行了
string str = "public class " + table.TableName + "\n{\n";

// 遍历表的列 变量进行字符串拼接
for (int i = 0; i < table.Columns.Count; i++)
{
    str += "    public " + rowType[i].ToString() + " " + rowName[i].ToString() + ";\n";
}

str += "}";

// 把拼接好的字符串存到指定文件中去
File.WriteAllText(DATA_CLASS_PATH + table.TableName + ".cs", str);

// 刷新Project窗口
AssetDatabase.Refresh();

7.2 知识点代码

ExcelTool

using Excel; // 导入Excel命名空间
using System.Collections;
using System.Collections.Generic;
using System.Data; // 导入System.Data命名空间
using System.IO; // 导入IO命名空间
using UnityEditor; // 导入Unity编辑器命名空间
using UnityEngine;

public class ExcelTool
{
    /// <summary>
    /// excel文件存放的路径
    /// </summary>
    public static string EXCEL_PATH = Application.dataPath + "/ArtRes/Excel/";

    /// <summary>
    /// 数据结构类脚本存储位置路径
    /// </summary>
    public static string DATA_CLASS_PATH = Application.dataPath + "/Scripts/ExcelData/DataClass/";

    [MenuItem("GameTool/GenerateExcel")]
    private static void GenerateExcelInfo()
    {
        // 加载指定路径中的所有Excel文件 用于生成对应的3个文件
        DirectoryInfo dInfo = Directory.CreateDirectory(EXCEL_PATH);

        // 得到指定路径中的所有文件信息 相当于就是得到所有的Excel表
        FileInfo[] files = dInfo.GetFiles();

        // 数据表容器
        DataTableCollection tableConllection;

        for (int i = 0; i < files.Length; i++)
        {
            // 如果不是excel文件就不要处理了
            if (files[i].Extension != ".xlsx" &&
                files[i].Extension != ".xls")
                continue;

            // 打开一个Excel文件得到其中的所有表的数据
            using (FileStream fs = files[i].Open(FileMode.Open, FileAccess.Read))
            {
                IExcelDataReader excelReader = ExcelReaderFactory.CreateOpenXmlReader(fs);
                tableConllection = excelReader.AsDataSet().Tables;
                fs.Close();
            }

            // 遍历文件中的所有表的信息
            foreach (DataTable table in tableConllection)
            {
                Debug.Log(table.TableName);

                // 生成数据结构类
                GenerateExcelDataClass(table);

                // 生成容器类

                // 生成二进制数据
            }
        }
    }

    /// <summary>
    /// 生成Excel表对应的数据结构类
    /// </summary>
    /// <param name="table"></param>
    private static void GenerateExcelDataClass(DataTable table)
    {
        // 字段名行
        DataRow rowName = GetVariableNameRow(table);

        // 字段类型行
        DataRow rowType = GetVariableTypeRow(table);

        // 判断路径是否存在,没有的话就创建文件夹
        if (!Directory.Exists(DATA_CLASS_PATH))
            Directory.CreateDirectory(DATA_CLASS_PATH);

        // 如果我们要生成对应的数据结构类脚本,其实就是通过代码进行字符串拼接,然后存进文件就行了
        string str = "public class " + table.TableName + "\n{\n";

        // 遍历表的列 变量进行字符串拼接
        for (int i = 0; i < table.Columns.Count; i++)
        {
            str += "    public " + rowType[i].ToString() + " " + rowName[i].ToString() + ";\n";
        }

        str += "}";

        // 把拼接好的字符串存到指定文件中去
        File.WriteAllText(DATA_CLASS_PATH + table.TableName + ".cs", str);

        // 刷新Project窗口
        AssetDatabase.Refresh();
    }

    /// <summary>
    /// 获取变量名所在行
    /// </summary>
    /// <param name="table"></param>
    /// <returns></returns>
    private static DataRow GetVariableNameRow(DataTable table)
    {
        return table.Rows[0];
    }

    /// <summary>
    /// 获取变量类型所在行
    /// </summary>
    /// <param name="table"></param>
    /// <returns></returns>
    private static DataRow GetVariableTypeRow(DataTable table)
    {
        return table.Rows[1];
    }
}

PlayerInfo

public class PlayerInfo
{
    public int id;
    public string name;
    public int atk;
    public int def;
}

TowerInfo

public class TowerInfo
{
    public int id;
    public string name;
    public int money;
    public int atk;
    public int atkRange;
    public float offsetTime;
    public int nextLev;
    public string imgRes;
    public string res;
    public int atkType;
    public string eff;
}

TestInfo

public class TestInfo
{
    public int id;
    public string name;
    public int atk;
}


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com

×

喜欢就点赞,疼爱就打赏