添加对uint, ushort, byte, sbyte的支持

This commit is contained in:
2026-03-10 11:36:26 +08:00
parent 86437ba639
commit 5c4e413949
9 changed files with 215 additions and 69 deletions
+67 -38
View File
@@ -3,6 +3,7 @@ using NPOI.XSSF.UserModel;
using System;
using System.Collections.Generic;
using System.IO;
using ExcelTool.Parser;
namespace ExcelTool
{
@@ -12,36 +13,41 @@ namespace ExcelTool
{
try
{
var headers = new List<TableExcelHeader>();
IWorkbook wk = null;
string extension = Path.GetExtension(fileName);
FileStream fs = File.OpenRead(fileName);
if (extension.Equals(".xlsx"))
wk = new XSSFWorkbook(fs);
List<TableExcelHeader> headers = new();
using FileStream fs = File.OpenRead(fileName);
IWorkbook wk = new XSSFWorkbook(fs);
ISheet sheet = wk.GetSheetAt(0);
IRow row = sheet.GetRow(0); //读取当前第一行的数据
var descRow = sheet.GetRow(1);//读取注释
for (int j = 0; j < row.LastCellNum; j++)
IRow nameRow = sheet.GetRow(0); // 字段名
IRow typeRow = sheet.GetRow(1); // 类型
IRow descRow = sheet.GetRow(2); // 注释
for (int j = 0; j < nameRow.LastCellNum; j++)
{
string value = row.GetCell(j).ToString();
var descValue = descRow.GetCell(j) == null ? "" : descRow.GetCell(j).ToString();
var array = value.Split(',');
if (array.Length != 2)
string fieldName = nameRow.GetCell(j)?.ToString() ?? "";
string fieldType = typeRow.GetCell(j)?.ToString() ?? "";
string fieldDesc = descRow.GetCell(j)?.ToString() ?? "";
if (string.IsNullOrEmpty(fieldName))
{
ConsoleHelper.WriteErrorLine("表格第一行类型定义有异常,不是类型,命名的形式");
$"列 {j} 字段名为空".WriteErrorLine();
continue;
}
else
headers.Add(new TableExcelHeader()
{
headers.Add(new TableExcelHeader() { FieldName = array[1], FieldType = array[0], FieldDesc = descValue });
}
FieldName = fieldName,
FieldType = fieldType,
FieldDesc = fieldDesc
});
}
fs.Close();
fs.Dispose();
return headers;
}
catch (Exception ex)
{
ConsoleHelper.WriteErrorLine(ex.ToString());
ex.ToString().WriteErrorLine();
return null;
}
}
@@ -52,38 +58,61 @@ namespace ExcelTool
{
var excelHeader = ExcelHeaders(fileName);
var tableRows = new List<TableExcelRow>();
IWorkbook wk = null;
string extension = Path.GetExtension(fileName);
FileStream fs = File.OpenRead(fileName);
if (extension.Equals(".xlsx"))
wk = new XSSFWorkbook(fs);
using FileStream fs = File.OpenRead(fileName);
IWorkbook wk = new XSSFWorkbook(fs);
ISheet sheet = wk.GetSheetAt(0);
//跳过注释读取数据
for (int i = 2; i <= sheet.LastRowNum; i++)
for (int i = 6; i <= sheet.LastRowNum; i++)
{
var row = sheet.GetRow(i);
IRow row = sheet.GetRow(i);
if (row == null) continue;
var tableExcelRow = new TableExcelRow();
for (int j = 0; j < excelHeader.Count; j++)
{
var cellValue = row.GetCell(j);
if (cellValue != null)
tableExcelRow.Add(row.GetCell(j).ToString());
else
tableExcelRow.Add("");
var cell = row.GetCell(j);
tableExcelRow.Add(GetCellValue(cell));
}
tableRows.Add(tableExcelRow);
}
fs.Close();
fs.Dispose();
var tableExcelData = new TableExcelData(excelHeader, tableRows);
return tableExcelData;
return new TableExcelData(excelHeader, tableRows);
}
catch (Exception ex)
{
ConsoleHelper.WriteErrorLine(ex.ToString());
ex.ToString().WriteErrorLine();
return null;
}
}
private static string GetCellValue(ICell cell)
{
if (cell == null)
return "";
switch (cell.CellType)
{
case CellType.String:
return cell.StringCellValue;
case CellType.Numeric:
if (DateUtil.IsCellDateFormatted(cell))
{
return cell.DateCellValue.ToString();
}
return cell.NumericCellValue.ToString();
case CellType.Boolean:
return cell.BooleanCellValue ? "1" : "0";
case CellType.Formula:
return cell.ToString();
default:
return "";
}
}
}
}
+72
View File
@@ -81,6 +81,50 @@ namespace ExcelTool
bw.Write(Convert.ToInt32(data.Item2));
}
}
else if (data.Item1.Equals("uint"))
{
if (string.IsNullOrEmpty(data.Item2))
{
bw.Write(Convert.ToUInt32(0));
}
else
{
bw.Write(Convert.ToUInt32(data.Item2));
}
}
else if (data.Item1.Equals("ushort"))
{
if (string.IsNullOrEmpty(data.Item2))
{
bw.Write(Convert.ToUInt16(0));
}
else
{
bw.Write(Convert.ToUInt16(data.Item2));
}
}
else if (data.Item1.Equals("sbyte"))
{
if (string.IsNullOrEmpty(data.Item2))
{
bw.Write(Convert.ToSByte(0));
}
else
{
bw.Write(Convert.ToSByte(data.Item2));
}
}
else if (data.Item1.Equals("byte"))
{
if (string.IsNullOrEmpty(data.Item2))
{
bw.Write(Convert.ToByte(0));
}
else
{
bw.Write(Convert.ToByte(data.Item2));
}
}
else if (data.Item1.Equals("bool"))
{
if (string.IsNullOrEmpty(data.Item2))
@@ -283,6 +327,34 @@ namespace ExcelTool
bw.Write(Convert.ToInt32(numStrs[i]));
}
}
else if (listType.Equals("uint"))
{
for (int i = 0; i < numStrs.Length; i++)
{
bw.Write(Convert.ToUInt32(numStrs[i]));
}
}
else if (listType.Equals("ushort"))
{
for (int i = 0; i < numStrs.Length; i++)
{
bw.Write(Convert.ToUInt16(numStrs[i]));
}
}
else if (listType.Equals("sbyte"))
{
for (int i = 0; i < numStrs.Length; i++)
{
bw.Write(Convert.ToSByte(numStrs[i]));
}
}
else if (listType.Equals("byte"))
{
for (int i = 0; i < numStrs.Length; i++)
{
bw.Write(Convert.ToByte(numStrs[i]));
}
}
else if (listType.Equals("bool"))
{
for (int i = 0; i < numStrs.Length; i++)
+53 -6
View File
@@ -1,8 +1,8 @@
using System;
using System;
using System.IO;
using System.Text;
namespace ExcelTool
namespace ExcelTool.Parser
{
public class GenModels
{
@@ -36,7 +36,14 @@ namespace ExcelTool
for (int i = 0; i < headers.Count; i++)
{
sb.Append($"\t/// <summary>\n");
sb.Append($"\t/// {headers[i].FieldDesc}\n");
var descLines = headers[i].FieldDesc?.Replace("\r", "").Split('\n');
if (descLines != null)
{
foreach (var line in descLines)
{
sb.Append($"\t/// {line}\n");
}
}
sb.Append($"\t/// </summary>\n");
var type = headers[i].FieldType.ToLower();
if (type.Equals("vector"))
@@ -67,6 +74,22 @@ namespace ExcelTool
{
sb.Append(string.Format("\tpublic List<long> {0}", headers[i].FieldName));
}
else if (type.Equals("uintlist"))
{
sb.Append(string.Format("\tpublic List<uint> {0}", headers[i].FieldName));
}
else if (type.Equals("ushortlist"))
{
sb.Append(string.Format("\tpublic List<ushort> {0}", headers[i].FieldName));
}
else if (type.Equals("sbytelist"))
{
sb.Append(string.Format("\tpublic List<sbyte> {0}", headers[i].FieldName));
}
else if (type.Equals("bytelist"))
{
sb.Append(string.Format("\tpublic List<byte> {0}", headers[i].FieldName));
}
else if (type.Contains("list<"))
{
var tempS = type.Substring(5);
@@ -100,7 +123,8 @@ namespace ExcelTool
{
sb.Append(string.Format("\tpublic {0} {1}", headers[i].FieldType.ToLower(), headers[i].FieldName));
}
sb.Append(" { get; set; }\n");
sb.Append(" { get; set; }\n\n");
}
sb.Append("\n\tpublic void DeSerialize(BinaryReader reader)\n");
sb.Append("\t{\n");
@@ -112,6 +136,22 @@ namespace ExcelTool
{
sb.Append($"\t\t{name} = reader.ReadInt32();\n");
}
else if (type.Equals("uint"))
{
sb.Append($"\t\t{name} = reader.ReadUInt32();\n");
}
else if (type.Equals("ushort"))
{
sb.Append($"\t\t{name} = reader.ReadUInt16();\n");
}
else if (type.Equals("sbyte"))
{
sb.Append($"\t\t{name} = reader.ReadSByte();\n");
}
else if (type.Equals("byte"))
{
sb.Append($"\t\t{name} = reader.ReadByte();\n");
}
else if (type.Equals("bool"))
{
sb.Append($"\t\t{name} = reader.ReadBoolean();\n");
@@ -297,7 +337,7 @@ namespace ExcelTool
}
else
{
ConsoleHelper.WriteErrorLine($"类型:{type}没有解析 {fileName}处理异常");
$"类型:{type}没有解析 {fileName}处理异常".WriteErrorLine();
return false;
}
}
@@ -308,7 +348,14 @@ namespace ExcelTool
{
var type = header.FieldType.ToLower();
var name = header.FieldName;
if (type.Equals("int") || type.Equals("bool") || type.Equals("float") || type.Equals("string"))
if (type.Equals("int") ||
type.Equals("bool") ||
type.Equals("float") ||
type.Equals("string") ||
type.Equals("uint") ||
type.Equals("ushort") ||
type.Equals("sbyte") ||
type.Equals("byte"))
{
sb.Append($"\t\twriter.Write({name});\n");
}
+2 -5
View File
@@ -1,10 +1,7 @@
using System;
using System.Collections.Generic;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ExcelTool
namespace ExcelTool.Parser
{
public class TableExcelData
{
+1 -1
View File
@@ -2,7 +2,7 @@
using System.Collections.Generic;
using System.IO;
namespace ExcelTool
namespace ExcelTool.Parser
{
public class TableExcelExportBytes
{
+1 -1
View File
@@ -1,4 +1,4 @@
namespace ExcelTool
namespace ExcelTool.Parser
{
public class TableExcelHeader
{
+1 -1
View File
@@ -1,6 +1,6 @@
using System.Collections.Generic;
namespace ExcelTool
namespace ExcelTool.Parser
{
public class TableExcelRow
{
+1 -1
View File
@@ -1,4 +1,4 @@
namespace ExcelTool
namespace ExcelTool.Parser
{
/// <summary>
/// 导出格式
+17 -16
View File
@@ -2,6 +2,7 @@
using System.Collections.Generic;
using System.IO;
using System.Linq;
using ExcelTool.Parser;
namespace ExcelTool
{
@@ -13,36 +14,36 @@ namespace ExcelTool
string exportPath = "";
//TableExportFormat format = TableExportFormat.Bytes;
if (args != null && args.Length == 1)
if (args is { Length: >= 1 })
{
path = args[0]; //第一个是路径
}
if (args != null && args.Length == 2)
if (args is { Length: >= 2 })
{
exportPath = args[1]; //第二个是输出路径
}
DirectoryInfo dirInfo = new DirectoryInfo(path);
var csvs = dirInfo.GetFiles("*.csv", SearchOption.AllDirectories);
var excels = dirInfo.GetFiles("*.xlsx", SearchOption.AllDirectories);
FileInfo[] csvs = dirInfo.GetFiles("*.csv", SearchOption.AllDirectories);
FileInfo[] excels = dirInfo.GetFiles("*.xlsx", SearchOption.AllDirectories);
if ((csvs == null || csvs.Length <= 0) && (excels == null || excels.Length <= 0))
{
ConsoleHelper.WriteErrorLine("当前exe目录或者目标目录没有csv文件或者excels文件,请重新设置目录");
"当前exe目录或者目标目录没有csv文件或者excels文件,请重新设置目录".WriteErrorLine();
}
else
{
ConsoleHelper.WriteSuccessLine("==========================================================");
ConsoleHelper.WriteSuccessLine("== 根据csv/xlsx生成模板代码和二进制文件工具 ==");
ConsoleHelper.WriteSuccessLine("== 说明:将exe放在csv/xlsx目录中或者exe或者传入csv根目录 ==");
ConsoleHelper.WriteSuccessLine("==========================================================");
"==========================================================".WriteSuccessLine();
"== 根据csv/xlsx生成模板代码和二进制文件工具 ==".WriteSuccessLine();
"== 说明:将exe放在csv/xlsx目录中或者exe或者传入csv根目录 ==".WriteSuccessLine();
"==========================================================".WriteSuccessLine();
List<string> genExcels = new List<string>();
foreach (var csv in csvs)
List<string> genExcels = [];
foreach (FileInfo csv in csvs)
{
//生成对应的xlsx文件
var tempPath = CsvHelper.CsvToXlsx(csv.FullName);
if (string.IsNullOrEmpty(tempPath))
{
ConsoleHelper.WriteErrorLine($"csv:{csv.FullName}生成xlsx文件出错");
$"csv:{csv.FullName}生成xlsx文件出错".WriteErrorLine();
}
else
{
@@ -58,22 +59,22 @@ namespace ExcelTool
bool res = GenModels.GenCSharpModel(file.FullName, exportPath);
if (res)
{
ConsoleHelper.WriteSuccessLine($"{file.Name}CS模板生成成功");
$"{file.Name}CS模板生成成功".WriteSuccessLine();
}
else
{
ConsoleHelper.WriteErrorLine($"{file.Name}CS模板生成失败");
$"{file.Name}CS模板生成失败".WriteErrorLine();
}
//生成二进制文件,如果list或者vector数据为空则写入0,要根据类型来读取csv的字段数据强转成对应的数据类型然后写入
res = TableExcelExportBytes.ExportToFile(file.FullName, exportPath);
if (res)
{
ConsoleHelper.WriteSuccessLine($"{file.Name}二进制数据生成成功");
$"{file.Name}二进制数据生成成功".WriteSuccessLine();
}
else
{
ConsoleHelper.WriteErrorLine($"{file.Name}二进制数据生成失败");
$"{file.Name}二进制数据生成失败".WriteErrorLine();
}
}