using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.Data;
using System.IO;
using System.Text;
using Excel;
using UnityEditor;
using Data;
using UnityEngine.UI;
using System;
public class ExcelBuild : Editor
{
public static DataRowCollection ReadExcel(string filePath, ref int columnNum, ref int rowNum)
{
FileStream stream = File.Open(filePath, FileMode.Open, FileAccess.Read, FileShare.Read);
IExcelDataReader excelReader = ExcelReaderFactory.CreateOpenXmlReader(stream);
//Debug.Log(stream);
DataSet result = excelReader.AsDataSet();
//Debug.Log(result);
// 获取第一张表的数据
columnNum = result.Tables[0].Columns.Count;
rowNum = result.Tables[0].Rows.Count;
return result.Tables[0].Rows;
}
///
/// 读取表数据,生成对应的数组
///
/// excel文件全路径
/// Item数组
public static Item[] CreateItemArrayWithExcel(string filePath)
{
int columnNum = 0, rowNum = 0;
DataRowCollection collect = ReadExcel(filePath, ref columnNum, ref rowNum);
// 根据excel的定义,第二行开始才是数据,因此这里需要从1开始
//Item[] array = new Item[rowNum - 1]; // 减去第一行(标题行)
//for (int i = 1; i < rowNum; i++) // 从1开始,跳过标题行
Item[] array = new Item[rowNum]; // 减去第一行(标题行)
for (int i = 0; i < rowNum; i++) // 从1开始,跳过标题行
{
Item item = new Item();
item.itemData = new List();
// 解析每列的数据
try
{
for (int j = 0; j < columnNum; j++)
{
//Debug.Log("i:"+i+" j:"+j+" value:"+collect[i][j].ToString());
ItemData itemData = new ItemData();
// 这里可以根据实际情况,解析每列的数据类型,比如int、float、string等
// 这里假设每列都是string类型
itemData.item = collect[i][j].ToString();
item.itemData.Add(itemData);
}
}
catch (FormatException e)
{
// 如果解析失败,输出错误信息
Debug.LogError("解析Excel数据时发生格式错误: " + e.Message);
// 并且返回null数组,或者你可以选择跳过错误行,继续解析
return null;
}
array[i] = item; // 将解析好的item放入数组中,注意索引从i-1开始
}
return array;
}
[MenuItem("CustomEditor/CreateItemAsset")]
public static void CreateItemAsset()
{
ItemManager manager = ScriptableObject.CreateInstance();
// 赋值
Item[] items = CreateItemArrayWithExcel(Application.dataPath + "/Excels/" + "biao01.xlsx");
if (items != null)
{
manager.dataArray = items;
}
else
{
Debug.LogError("无法创建Item Asset,因为CreateItemArrayWithExcel返回了null");
return;
}
// 确保文件夹存在
if (!Directory.Exists("Assets/Resources/DataAssets/"))
{
Directory.CreateDirectory("Assets/Resources/DataAssets/");
}
// asset文件的路径 要以"Assets/..."开始,否则CreateAsset会报错
string assetPath = string.Format("{0}{1}.asset", "Assets/Resources/DataAssets/", "Item");
// 生成一个Asset文件
AssetDatabase.CreateAsset(manager, assetPath);
AssetDatabase.SaveAssets();
AssetDatabase.Refresh();
}
[MenuItem("GameObject/MyMenu/SaveExcelDataToUI")]
public static void SaveExcelDataToUI()
{
int columnNum = 0, rowNum = 0;
FileStream stream = File.Open(Application.dataPath + "/Excels/" + "biao01.xlsx", FileMode.Open, FileAccess.Read, FileShare.Read);
IExcelDataReader excelReader = ExcelReaderFactory.CreateOpenXmlReader(stream);
DataSet result = excelReader.AsDataSet();
// 获取第一张表的数据
columnNum = result.Tables[0].Columns.Count;
rowNum = result.Tables[0].Rows.Count;
DataRowCollection collect = result.Tables[0].Rows;
if (Selection.activeGameObject)
{
GameObject inputObj = null;
GameObject rowObj = null;
// 查找子对象中的rowObj和inputObj
foreach (var item in Selection.activeGameObject.transform.GetComponentsInChildren(true))
{
if (item.name == "rowObj")
{
rowObj = item.gameObject;
}
else if (item.name == "inputObj")
{
inputObj = item.gameObject;
}
}
Transform rowParent = Selection.activeGameObject.transform;
Transform columnParent = null;
Transform columnItem = null;
string content;
for (int i = 0; i < rowNum; i++) // 从1开始,跳过标题行
{
columnParent = (Instantiate(rowObj) as GameObject).transform;
columnParent.name = (i).ToString();
columnParent.gameObject.SetActive(true);
columnParent.parent = rowParent;
columnParent.localScale = Vector3.one;
columnParent.localPosition = new Vector3(0, -29 * (i - 1), 0); // 调整位置计算,以适应跳过的标题行
columnParent.localEulerAngles = Vector3.zero;
for (int j = 0; j < columnNum; j++)
{
columnItem = ((Instantiate(inputObj)) as GameObject).transform;
columnItem.gameObject.SetActive(true);
columnItem.parent = columnParent;
columnItem.localScale = Vector3.one;
content = collect[i][j].ToString();
columnItem.GetComponent().text = content;
}
}
rowParent.GetComponent().sizeDelta = new Vector2(columnParent.GetComponent().sizeDelta.x, (28 * (rowNum)));
}
}
}