更改表结构,以减少二次映射
This commit is contained in:
@@ -7,16 +7,6 @@ namespace ExcelTool.Parser
|
|||||||
{
|
{
|
||||||
public static class GenModels
|
public static class GenModels
|
||||||
{
|
{
|
||||||
// ── 枚举类型映射(key: 小写类型名,value: C# 枚举类型名)──────────────
|
|
||||||
// 新增枚举类型只改这里
|
|
||||||
private static readonly Dictionary<string, string> EnumMap = new()
|
|
||||||
{
|
|
||||||
{ "killmode", "KillMode" },
|
|
||||||
{ "mixingtype", "MixingType" },
|
|
||||||
{ "containertype", "ContainerType" },
|
|
||||||
{ "blendcrossfadetype","BlendCrossFadeType" },
|
|
||||||
};
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 生成对应的 C# Model 类
|
/// 生成对应的 C# Model 类
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -37,7 +27,7 @@ namespace ExcelTool.Parser
|
|||||||
for (int sheetNum = 0; ; sheetNum++)
|
for (int sheetNum = 0; ; sheetNum++)
|
||||||
{
|
{
|
||||||
var headers = ExcelHelper.ExcelHeaders(fileName, out string sheetName, out int sheetCount, sheetNum);
|
var headers = ExcelHelper.ExcelHeaders(fileName, out string sheetName, out int sheetCount, sheetNum);
|
||||||
if (headers == null || headers.Count == 0 || sheetName.StartsWith('#') || sheetNum > sheetCount)
|
if (headers == null || headers.Count == 0 || sheetName.StartsWith("#") || sheetNum > sheetCount)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
var sb = new StringBuilder();
|
var sb = new StringBuilder();
|
||||||
@@ -109,13 +99,6 @@ namespace ExcelTool.Parser
|
|||||||
var type = header.FieldType.ToLower();
|
var type = header.FieldType.ToLower();
|
||||||
var name = header.FieldName;
|
var name = header.FieldName;
|
||||||
|
|
||||||
// 枚举
|
|
||||||
if (EnumMap.TryGetValue(type, out var enumCsType))
|
|
||||||
{
|
|
||||||
sb.Append($"\t\t{name} = ({enumCsType})reader.ReadByte();\n");
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
// 注册表中的具名类型
|
// 注册表中的具名类型
|
||||||
var desc = TypeRegistry.Get(type);
|
var desc = TypeRegistry.Get(type);
|
||||||
if (desc != null)
|
if (desc != null)
|
||||||
@@ -133,13 +116,12 @@ namespace ExcelTool.Parser
|
|||||||
$"list<T> 的元素类型 \"{elemType}\" 未注册 ({sheetName})".WriteErrorLine();
|
$"list<T> 的元素类型 \"{elemType}\" 未注册 ({sheetName})".WriteErrorLine();
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
// 读取表达式复用注册表中的 GenDeserialize 只取 ReadXxx() 部分比较麻烦,
|
|
||||||
// 这里直接用公共辅助方法生成片段
|
|
||||||
sb.Append(TypeRegistry.GenListDeserialize(name, elemDesc.CSharpType, GetReadExpr(elemDesc)));
|
sb.Append(TypeRegistry.GenListDeserialize(name, elemDesc.CSharpType, GetReadExpr(elemDesc)));
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
$"类型 \"{type}\" 未注册,{sheetName} 处理异常".WriteErrorLine();
|
// 兜底:当枚举处理,类型名直接用 FieldType 原值(保留大小写)
|
||||||
|
sb.Append($"\t\t{name} = ({header.FieldType})reader.ReadByte();\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
sb.Append("\t}\n");
|
sb.Append("\t}\n");
|
||||||
@@ -158,13 +140,6 @@ namespace ExcelTool.Parser
|
|||||||
var type = header.FieldType.ToLower();
|
var type = header.FieldType.ToLower();
|
||||||
var name = header.FieldName;
|
var name = header.FieldName;
|
||||||
|
|
||||||
// 枚举
|
|
||||||
if (EnumMap.ContainsKey(type))
|
|
||||||
{
|
|
||||||
sb.Append($"\t\twriter.Write((byte){name});\n");
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
// 注册表
|
// 注册表
|
||||||
var desc = TypeRegistry.Get(type);
|
var desc = TypeRegistry.Get(type);
|
||||||
if (desc != null)
|
if (desc != null)
|
||||||
@@ -180,7 +155,8 @@ namespace ExcelTool.Parser
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
$"类型 \"{type}\" 未注册,{sheetName} 处理异常".WriteErrorLine();
|
// 兜底:当枚举处理
|
||||||
|
sb.Append($"\t\twriter.Write((byte){name});\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
sb.Append("\t}\n");
|
sb.Append("\t}\n");
|
||||||
@@ -230,9 +206,6 @@ namespace ExcelTool.Parser
|
|||||||
{
|
{
|
||||||
var lower = fieldType.ToLower();
|
var lower = fieldType.ToLower();
|
||||||
|
|
||||||
if (EnumMap.TryGetValue(lower, out var enumType))
|
|
||||||
return enumType;
|
|
||||||
|
|
||||||
var desc = TypeRegistry.Get(lower);
|
var desc = TypeRegistry.Get(lower);
|
||||||
if (desc != null)
|
if (desc != null)
|
||||||
return desc.CSharpType;
|
return desc.CSharpType;
|
||||||
@@ -244,8 +217,8 @@ namespace ExcelTool.Parser
|
|||||||
return elemDesc != null ? $"List<{elemDesc.CSharpType}>" : $"List<{elemType}>";
|
return elemDesc != null ? $"List<{elemDesc.CSharpType}>" : $"List<{elemType}>";
|
||||||
}
|
}
|
||||||
|
|
||||||
// 兜底:直接用原始类型名(可能是用户自定义类型)
|
// 兜底:当枚举处理,保留原始类型名大小写
|
||||||
return fieldType.ToLower();
|
return fieldType;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>尝试解析 list<T> 语法,成功返回元素类型名</summary>
|
/// <summary>尝试解析 list<T> 语法,成功返回元素类型名</summary>
|
||||||
|
|||||||
@@ -1,67 +1,64 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
|
|
||||||
namespace ExcelTool.Parser
|
namespace ExcelTool.Parser
|
||||||
{
|
{
|
||||||
public static class TableExcelExportBytes
|
public static class TableExcelExportBytes
|
||||||
{
|
{
|
||||||
public static bool ExportToFile(string fileName, string outputDir = null)
|
public static bool ExportToFile(string fileName, string outputDir = null)
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
Dictionary<string, string> enumMap = new()
|
FileInfo fileInfo = new(fileName);
|
||||||
{
|
if (string.IsNullOrEmpty(outputDir))
|
||||||
{ "killmode", "byte" },
|
{
|
||||||
{ "mixingtype", "byte" },
|
outputDir = fileInfo.DirectoryName;
|
||||||
{ "containertype", "byte" },
|
}
|
||||||
{ "blendcrossfadetype", "byte" }
|
|
||||||
};
|
for (int sheetNum = 0; ; sheetNum++)
|
||||||
FileInfo fileInfo = new(fileName);
|
{
|
||||||
if (string.IsNullOrEmpty(outputDir))
|
var tableData = ExcelHelper.ExcelData(fileName, out string sheetName, out int sheetCount, sheetNum);
|
||||||
{
|
if (tableData == null || sheetNum >= sheetCount)
|
||||||
outputDir = fileInfo.DirectoryName;
|
break;
|
||||||
}
|
|
||||||
|
// # 开头的 sheet 只跳过
|
||||||
for (int sheetNum = 0; ; sheetNum++)
|
if (sheetName.StartsWith("#"))
|
||||||
{
|
continue;
|
||||||
var tableData = ExcelHelper.ExcelData(fileName, out string sheetName, out int sheetCount, sheetNum);
|
|
||||||
if (tableData == null || sheetNum >= sheetCount)
|
List<Tuple<string, string>> datas = [];
|
||||||
break;
|
//先写入行数,然后每一行的数据一次写入 小写类型、字符串
|
||||||
|
Tuple<string, string> rowCount = new("int", tableData.RowCounts.ToString());
|
||||||
// # 开头的 sheet 只跳过
|
datas.Add(rowCount);
|
||||||
if (sheetName.StartsWith("#"))
|
foreach (var row in tableData.Rows)
|
||||||
continue;
|
{
|
||||||
|
for (int i = 0; i < tableData.CollonCount; i++)
|
||||||
List<Tuple<string, string>> datas = [];
|
{
|
||||||
//先写入行数,然后每一行的数据一次写入 小写类型、字符串
|
var type = tableData.Headers[i].FieldType.ToLower();
|
||||||
Tuple<string, string> rowCount = new("int", tableData.RowCounts.ToString());
|
var data = row.StrList[i];
|
||||||
datas.Add(rowCount);
|
|
||||||
foreach (var row in tableData.Rows)
|
// 未在 TypeRegistry 注册的类型(且不是 list<T>)当枚举处理,写入 byte
|
||||||
{
|
if (!TypeRegistry.Contains(type) && !IsGenericList(type))
|
||||||
for (int i = 0; i < tableData.CollonCount; i++)
|
{
|
||||||
{
|
type = "byte";
|
||||||
var type = tableData.Headers[i].FieldType.ToLower();
|
}
|
||||||
var data = row.StrList[i];
|
|
||||||
|
datas.Add(new Tuple<string, string>(type, data));
|
||||||
if (enumMap.ContainsKey(type))
|
}
|
||||||
{
|
}
|
||||||
type = enumMap[type];
|
var binaryFilePath = Path.Combine(outputDir, $"{sheetName}.bytes");
|
||||||
}
|
FileManager.WriteBinaryDatasToFile(binaryFilePath, datas);
|
||||||
|
}
|
||||||
datas.Add(new Tuple<string, string>(type, data));
|
return true;
|
||||||
}
|
}
|
||||||
}
|
catch (Exception ex)
|
||||||
var binaryFilePath = Path.Combine(outputDir, $"{sheetName}.bytes");
|
{
|
||||||
FileManager.WriteBinaryDatasToFile(binaryFilePath, datas);
|
ConsoleHelper.WriteErrorLine(ex.ToString());
|
||||||
}
|
return false;
|
||||||
return true;
|
}
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
|
||||||
{
|
private static bool IsGenericList(string type) =>
|
||||||
ConsoleHelper.WriteErrorLine(ex.ToString());
|
type.StartsWith("list<") && type.EndsWith(">");
|
||||||
return false;
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|||||||
Reference in New Issue
Block a user