218 lines
7.1 KiB
C#
218 lines
7.1 KiB
C#
using System.Collections;
|
|
using System.Collections.Generic;
|
|
using System.Data;
|
|
using System.IO;
|
|
using UnityEditor;
|
|
using UnityEngine;
|
|
using Excel;
|
|
using System;
|
|
using System.Text;
|
|
|
|
public class Tools
|
|
{
|
|
/// <summary>
|
|
/// Excel文件存储路径
|
|
/// </summary>
|
|
public static string ExcelPath = Application.dataPath + "/ArtRes/Excel/";
|
|
|
|
/// <summary>
|
|
/// 数据结构类存储路径
|
|
/// </summary>
|
|
public static string DataClassPath = Application.dataPath + "/Scripts/ExcelData/DataClass/";
|
|
|
|
/// <summary>
|
|
/// 数据容器类存储路径
|
|
/// </summary>
|
|
public static string DataContainerPath = Application.dataPath + "/Scripts/ExcelData/DataContainer/";
|
|
|
|
public static int startIndex = 4;
|
|
|
|
/// <summary>
|
|
/// 以配置表生成数据结构类 数据容器类 数据
|
|
/// </summary>
|
|
[MenuItem("Tools/GenerateExcel")]
|
|
private static void GenerateExcelInfo()
|
|
{
|
|
//判断路径是否存在
|
|
if (!Directory.Exists(ExcelPath))
|
|
return;
|
|
|
|
//创建目录 已存在的目录 直接返回文件夹信息
|
|
DirectoryInfo directory = Directory.CreateDirectory(ExcelPath);
|
|
|
|
//获取文件夹下的 所有文件
|
|
FileInfo[] fileInfo = directory.GetFiles();
|
|
|
|
DataTableCollection tables;
|
|
|
|
//筛选后缀为.xlsx的所有Excel文件
|
|
for (int i = 0; i < fileInfo.Length; i++)
|
|
{
|
|
//如果不是Excel文件 不处理
|
|
if (fileInfo[i].Extension != ".xlsx")
|
|
continue;
|
|
|
|
//打开一个Excel文件 得到其中的所有表数据
|
|
using (FileStream fs = fileInfo[i].Open(FileMode.Open,FileAccess.Read))
|
|
{
|
|
IExcelDataReader reader = ExcelReaderFactory.CreateOpenXmlReader(fs);
|
|
tables = reader.AsDataSet().Tables;
|
|
fs.Close();
|
|
}
|
|
|
|
//遍历文件中所有表的信息
|
|
foreach (DataTable table in tables)
|
|
{
|
|
//生成数据结构类
|
|
GenerateExcelDataClass(table);
|
|
|
|
//生成数据容器类
|
|
GenerateExcelContainerClass(table);
|
|
|
|
//生成数据
|
|
GenerateExcelData(table);
|
|
}
|
|
}
|
|
Debug.Log("生成成功");
|
|
AssetDatabase.Refresh();
|
|
}
|
|
|
|
/// <summary>
|
|
/// 生成数据结构类
|
|
/// </summary>
|
|
/// <param name="dataTable"></param>
|
|
private static void GenerateExcelDataClass(DataTable dataTable)
|
|
{
|
|
//获取变量名行
|
|
DataRow nameRow = GetvariableNameRow(dataTable);
|
|
//获取变量类型行
|
|
DataRow typeRow = GetvariableTypeRow(dataTable);
|
|
//判断路径是否存在
|
|
if (!Directory.Exists(DataClassPath))
|
|
Directory.CreateDirectory(DataClassPath);
|
|
|
|
string classString;
|
|
//拼接字符串
|
|
classString = "public class " + dataTable.TableName + "\n{\n";
|
|
for (int i = 0; i < dataTable.Columns.Count; i++)
|
|
{
|
|
classString += "\tpublic " + typeRow[i].ToString() + " " + nameRow[i] + ";\n";
|
|
}
|
|
classString += "}";
|
|
File.WriteAllText(DataClassPath + dataTable.TableName + ".cs", classString);
|
|
}
|
|
|
|
/// <summary>
|
|
/// 生成数据容器类
|
|
/// </summary>
|
|
private static void GenerateExcelContainerClass(DataTable dataTable)
|
|
{
|
|
//获取主键索引
|
|
int keyIndex = GetKeyIndex(dataTable);
|
|
|
|
//获取变量类型行
|
|
DataRow typeRow = GetvariableTypeRow(dataTable);
|
|
|
|
//判断路径是否存在
|
|
if (!Directory.Exists(DataContainerPath))
|
|
Directory.CreateDirectory(DataContainerPath);
|
|
|
|
string str;
|
|
str = "using System.Collections.Generic;\n";
|
|
str += "public class " + dataTable.TableName + "Container\n{\n";
|
|
str += string.Format("\tpublic Dictionary<{0}, {1}> dataDic = new Dictionary<{2}, {3}>();\n", typeRow[keyIndex],dataTable.TableName, typeRow[keyIndex], dataTable.TableName);
|
|
str += "}";
|
|
File.WriteAllText(DataContainerPath + dataTable.TableName + "Container.cs", str);
|
|
}
|
|
|
|
/// <summary>
|
|
/// 生成数据
|
|
/// </summary>
|
|
private static void GenerateExcelData(DataTable dataTable)
|
|
{
|
|
//判断路径是否存在
|
|
if (!Directory.Exists(BinaryManager.BinaryDataPath))
|
|
Directory.CreateDirectory(BinaryManager.BinaryDataPath);
|
|
|
|
using FileStream fs = new FileStream(BinaryManager.BinaryDataPath + dataTable.TableName + ".binary", FileMode.OpenOrCreate);
|
|
//存储数据行数
|
|
fs.Write(BitConverter.GetBytes(dataTable.Rows.Count - 4), 0, 4);
|
|
|
|
//存储表中的键名
|
|
string keyName = GetvariableNameRow(dataTable)[GetKeyIndex(dataTable)].ToString();
|
|
byte[] bytes = Encoding.UTF8.GetBytes(keyName);
|
|
|
|
fs.Write(BitConverter.GetBytes(bytes.Length), 0, 4);
|
|
fs.Write(bytes, 0, bytes.Length);
|
|
|
|
DataRow row;
|
|
DataRow typeRow = GetvariableTypeRow(dataTable);
|
|
//存储每一行数据
|
|
for (int i = startIndex; i < dataTable.Rows.Count; i++)
|
|
{
|
|
row = dataTable.Rows[i];
|
|
for (int j = 0; j < dataTable.Columns.Count; j++)
|
|
{
|
|
switch (typeRow[j].ToString())
|
|
{
|
|
case "int":
|
|
Debug.Log($"当前表{dataTable.TableName},当前行列:{i}_______{j}");
|
|
fs.Write(BitConverter.GetBytes(int.Parse(row[j].ToString())), 0, 4);
|
|
break;
|
|
case "bool":
|
|
fs.Write(BitConverter.GetBytes(bool.Parse(row[j].ToString())), 0, 1);
|
|
break;
|
|
case "float":
|
|
fs.Write(BitConverter.GetBytes(float.Parse(row[j].ToString())), 0, 4);
|
|
break;
|
|
case "string":
|
|
bytes = Encoding.UTF8.GetBytes(row[j].ToString());
|
|
fs.Write(BitConverter.GetBytes(bytes.Length), 0, 4);
|
|
fs.Write(bytes, 0, bytes.Length);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
fs.Flush();
|
|
fs.Close();
|
|
}
|
|
|
|
/// <summary>
|
|
/// 获取变量名所在行
|
|
/// </summary>
|
|
/// <param name="dataTable">表</param>
|
|
/// <returns></returns>
|
|
private static DataRow GetvariableNameRow(DataTable dataTable)
|
|
{
|
|
return dataTable.Rows[0];
|
|
}
|
|
|
|
/// <summary>
|
|
/// 获取变量类型所在行
|
|
/// </summary>
|
|
/// <param name="dataTable">表</param>
|
|
/// <returns></returns>
|
|
private static DataRow GetvariableTypeRow(DataTable dataTable)
|
|
{
|
|
return dataTable.Rows[1];
|
|
}
|
|
|
|
/// <summary>
|
|
/// 获取主键所在列 的索引
|
|
/// </summary>
|
|
/// <param name="dataTable"></param>
|
|
/// <returns></returns>
|
|
private static int GetKeyIndex(DataTable dataTable)
|
|
{
|
|
DataRow row = dataTable.Rows[2];
|
|
for (int i = 0; i < dataTable.Columns.Count; i++)
|
|
{
|
|
if (row[i].ToString() == "key")
|
|
{
|
|
return i;
|
|
}
|
|
}
|
|
return 0;
|
|
}
|
|
}
|