using UnityEngine; using System.Collections; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Text.RegularExpressions; using System.IO; using Excel; using System.Data; using UnityEditor; public class ExcelReader { static Dictionary txtExcelTables = new Dictionary(); public static string GetExcelPath(string txtName) { if (!txtExcelTables.ContainsKey(txtName)) { var lines = File.ReadAllLines(Application.dataPath + "/Editor/Config/ExcelToTxt.txt"); for (var i = 1; i < lines.Length; i++) { var contents = lines[i].Split('\t'); txtExcelTables[contents[1]] = contents[0]; } } if (!txtExcelTables.ContainsKey(txtName)) { Debug.LogFormat("没有找到{0}的Excel母表.", txtName); return string.Empty; } return StringUtility.Contact(ExtensionalTools.excelRootPath, "/", txtExcelTables[txtName], ".xlsx"); } [MenuItem("Assets/同步Excel母表")] static void XLSX() { if (Selection.objects == null) { return; } foreach (var item in Selection.objects) { var path = AssetDatabase.GetAssetPath(item); path = Application.dataPath + path.Substring(6, path.Length - 6); var extension = Path.GetExtension(path); if (extension.ToLower() == ".txt") { var name = Path.GetFileNameWithoutExtension(path); var excelPath = GetExcelPath(name); var lines = ExcelRead(excelPath); File.WriteAllLines(path, lines.ToArray(), Encoding.UTF8); Debug.LogFormat("{0}同步完成。", name); } } } static List ExcelRead(string excelPath) { var stream = File.Open(excelPath, FileMode.Open, FileAccess.Read); var excelReader = ExcelReaderFactory.CreateOpenXmlReader(stream); DataSet result = null; try { result = excelReader.AsDataSet(true); } catch (System.Exception ex) { Debug.LogException(ex); } int columns = result.Tables[0].Columns.Count; int rows = result.Tables[0].Rows.Count; var contents = new Dictionary>(); for (var i = 0; i < rows; i++) { for (var j = 0; j < columns; j++) { var isClient = result.Tables[0].Rows[0][j].ToString().ToLower().Contains("c"); var nvalue = result.Tables[0].Rows[i][j].ToString(); if (isClient) { var lineContents = contents.ContainsKey(i) ? contents[i] : contents[i] = new Dictionary(); lineContents[j] = nvalue; } } } var lines = new List(); foreach (var item in contents.Values) { lines.Add(string.Join("\t", item.Values.ToArray())); } lines.RemoveAt(0); return lines; } }