Skip to content

Commit

Permalink
changes package structures.
Browse files Browse the repository at this point in the history
remove CodeGenerateExtend, CodeTemplate.
  • Loading branch information
elky84 committed May 29, 2024
1 parent 947c923 commit 5ed6597
Show file tree
Hide file tree
Showing 12 changed files with 116 additions and 164 deletions.
2 changes: 1 addition & 1 deletion ExcelCli/ExcelCli.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@
<PackAsTool>true</PackAsTool>
<ToolCommandName>excel2dotnet</ToolCommandName>
<PackageReadmeFile>README.md</PackageReadmeFile>
<Version>1.0.38</Version>
<Version>1.0.39</Version>

<PackageDescription>Excel To Dotnet</PackageDescription>
<RepositoryUrl>https://github.com/elky84/ExcelToDotnet</RepositoryUrl>
Expand Down
4 changes: 3 additions & 1 deletion ExcelCli/Program.cs
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
using CommandLine;
using ExcelToDotnet;
using ExcelToDotnet.Actor;
using ExcelToDotnet.Cli;
using ExcelToDotnet.Code;
using ExcelToDotnet.Extend;
using System;

Expand Down
134 changes: 94 additions & 40 deletions ExcelToDotnet/Generator.cs → ExcelToDotnet/Actor/Generator.cs
Original file line number Diff line number Diff line change
@@ -1,9 +1,12 @@
using ExcelToDotnet.Extend;
using ExcelToDotnet.Cli;
using ExcelToDotnet.Code;
using ExcelToDotnet.Entity;
using ExcelToDotnet.Extend;
using Newtonsoft.Json;
using System.Data;
using System.Text;

namespace ExcelToDotnet
namespace ExcelToDotnet.Actor
{
public static class Generator
{
Expand Down Expand Up @@ -128,7 +131,7 @@ private static void GenerateTableFromData(string fileName, Options opts, string
{
if (dataTable.Rows.Count < 2)
{
Validation.Failed($"스키마 정보가 유효하지 않습니다. 상위 3개의 행은 필수로 존재해야 합니다. !! 1행: 컬럼 이름, 2행: 데이터 타입, 3행: 타겟 (다중 타겟시 |로 구분자) !! <file:{fileName}, table:{tableName} row count: {dataTable.Rows.Count}>");
Validator.Failed($"스키마 정보가 유효하지 않습니다. 상위 3개의 행은 필수로 존재해야 합니다. !! 1행: 컬럼 이름, 2행: 데이터 타입, 3행: 타겟 (다중 타겟시 |로 구분자) !! <file:{fileName}, table:{tableName} row count: {dataTable.Rows.Count}>");
return;
}

Expand All @@ -148,7 +151,7 @@ private static void GenerateTableFromData(string fileName, Options opts, string

private static void ValidateDataTable(DataTable dataTable)
{
Validation.ValidateTableName(dataTable.TableName);
Validator.ValidateTableName(dataTable.TableName);
dataTable.ValidateDuplicate();
dataTable.ValidateColumnName();
}
Expand Down Expand Up @@ -271,7 +274,7 @@ private static bool GenerateEnum(KeyValuePair<int, int> startPos, Options opts,
var tableName = list2D[start.Value][start.Key + 1];
if (tableName == null)
{
Validation.Failed($"테이블 명을 가져오는 데에 실패했습니다. <X:{start.Value},Y:{start.Key + 1}>");
Validator.Failed($"테이블 명을 가져오는 데에 실패했습니다. <X:{start.Value},Y:{start.Key + 1}>");
return false;
}

Expand All @@ -296,7 +299,7 @@ private static List<List<string>> ExtractEnumData(List<List<object?>> list2D, Ke

public static bool GenerateEnum(string tableName, Options opts, DataTable dt)
{
Validation.ValidateTableName(tableName);
Validator.ValidateTableName(tableName);

dt.TableName = tableName;

Expand All @@ -306,15 +309,13 @@ public static bool GenerateEnum(string tableName, Options opts, DataTable dt)
string jsonFileName = Path.Combine(opts.Output, "enumJson", $"{tableName}.json");
if (File.Exists(jsonFileName))
{
Validation.Failed($"이미 존재하는 Enum을 사용하셨습니다. <FileName:{jsonFileName}> <Table:{tableName}>");
Validator.Failed($"이미 존재하는 Enum을 사용하셨습니다. <FileName:{jsonFileName}> <Table:{tableName}>");
return false;
}

WriteJsonFile(jsonFileName, dt.MapDatasetData());

var patterns = GetPatterns(opts, tableName);

WriteEnumFile(opts, tableName, dt, patterns);
WriteEnumFile(opts, tableName, dt);

return true;
}
Expand All @@ -326,25 +327,13 @@ private static void WriteJsonFile(string jsonFileName, object data)
outputFileJson.Write(json);
}

private static Dictionary<string, string> GetPatterns(Options opts, string tableName)
{
return new Dictionary<string, string>()
{
{ "##NAMESPACE##", opts.NameSpace },
{ "##CLASS##", tableName },
{ "##USING##", string.Join(Environment.NewLine, opts.Usings) },
{ "##ATTRIBUTE##", opts.Attribute }
};
}

private static void WriteEnumFile(Options opts, string tableName, DataTable dt, Dictionary<string, string> patterns)
private static void WriteEnumFile(Options opts, string tableName, DataTable dt)
{
using (FileStream vStream = File.Create($"{opts.Output}/enum/{tableName}.cs"))
{
using StreamWriter outputFile = new StreamWriter(vStream, new UTF8Encoding(true));
using FileStream vStream = File.Create($"{opts.Output}/enum/{tableName}.cs");
using StreamWriter outputFile = new(vStream, new UTF8Encoding(true));

CodeTemplate.Enum().GenerateEnumCode(outputFile, dt, patterns);
}
var strings = Enum(opts.NameSpace, tableName, string.Join(Environment.NewLine, opts.Usings), opts.Attribute, EnumBody(dt));
outputFile.Write(string.Join(Environment.NewLine, strings));
}

public static void GenerateCsAndJson(string fileName, string keyword, string tableName, Options opts, DataTable dt, List<string> dataTypes)
Expand All @@ -354,32 +343,97 @@ public static void GenerateCsAndJson(string fileName, string keyword, string tab
string jsonFileName = Path.Combine(opts.Output, keyword, $"{tableName}.json");
if (File.Exists(jsonFileName))
{
Validation.Failed($"이미 존재하는 테이블 명을 사용하셨습니다. <ExcelFileName{fileName} jsonFileName:{jsonFileName}, Table:{tableName}>");
Validator.Failed($"이미 존재하는 테이블 명을 사용하셨습니다. <ExcelFileName{fileName} jsonFileName:{jsonFileName}, Table:{tableName}>");
return;
}

WriteJsonFile(jsonFileName, dt.MapDatasetData(dataTypes.ConvertAll(x => x.ToString() ?? "")));

var patterns = GetPatterns(opts, tableName, keyword);
WriteCsFile(opts, keyword, tableName, dt, dataTypes);
}

WriteCsFile(opts, keyword, tableName, dt, dataTypes, patterns);
private static void WriteCsFile(Options opts, string keyword, string tableName, DataTable dt, List<string> dataTypes)
{
string filePath = Path.Combine(opts.Output, keyword, $"{tableName}.cs");
using var outputFile = new StreamWriter(filePath);
var strings = Class($"{opts.NameSpace}.{keyword}", tableName, string.Join(Environment.NewLine, opts.Usings), ClassBody(dt, dataTypes, opts.Nullable));
outputFile.Write(string.Join(Environment.NewLine, strings));
}

private static Dictionary<string, string> GetPatterns(Options opts, string tableName, string keyword)
private static List<string> EnumBody(DataTable dt)
{
return new Dictionary<string, string>()
var strings = new List<string>();
for (int n = 0; n < dt.Rows.Count; ++n)
{
{ "##NAMESPACE##", $"{opts.NameSpace}.{keyword}" },
{ "##CLASS##", tableName },
{ "##USING##", string.Join(Environment.NewLine, opts.Usings) }
};
strings.Add(string.Empty);
strings.Add(string.Format("[Description(\"{0}\")]", dt.Rows[n].ItemArray[1]));
strings.Add(string.Format("{0},", dt.Rows[n].ItemArray[0]));
}
return strings;
}

private static void WriteCsFile(Options opts, string keyword, string tableName, DataTable dt, List<string> dataTypes, Dictionary<string, string> patterns)
private static List<string> ClassBody(DataTable dt, List<string> dataTypes, bool nullable)
{
string filePath = Path.Combine(opts.Output, keyword, $"{tableName}.cs");
using var outputFile = new StreamWriter(filePath);
CodeTemplate.Class().GenerateCode(outputFile, dt, dataTypes, patterns, opts.Nullable);
var dataTypesConverted = dataTypes.Convert(nullable);
var strings = new List<string>();
for (int n = 0; n < dt.Columns.Count; ++n)
{
//var plainDataType = dataTypesConverted[n].Key;
var dataType = dataTypesConverted[n].Value;

strings.Add(string.Empty);

if (dataType.EndsWith("Type") || dataType.EndsWith("Type?"))
{
strings.Add(string.Format($"[JsonConverter(typeof(JsonEnumConverter<{dataType.RemoveSpecialCharacters()}>))]"));
}
else if (dataType.StartsWith("List") && (dataType.EndsWith("Type>?") || dataType.EndsWith("Type>") || dataType.EndsWith("Type?>")))
{
strings.Add(string.Format($"[JsonConverter(typeof(JsonEnumsConverter<{dataType.ExtractDataTypeInList().RemoveSpecialCharacters()}>))]"));
}
strings.Add(string.Format("public {0} {1}", dataType, dt.Columns[n].ColumnName) + " { get; set; }");
}
return strings;
}

private static readonly List<string> DefaultUsings = [
"using System;",
"using System.Collections.Generic;",
"using System.Drawing;",
"using Newtonsoft.Json;"
];

public static List<string> Enum(string namespaceName, string className, string usings, string attribute, List<string> enumValues)
{
var template = new List<string> {
$"{string.Join(Environment.NewLine, DefaultUsings)}",
$"{usings}",
"",
$"namespace {namespaceName}",
"{",
$"\t{string.Join(Environment.NewLine + "\t", attribute)}",
$"\tpublic enum {className}",
"\t{",
$"\t{string.Join(Environment.NewLine + "\t\t", enumValues.Select(value => value))}",
"\t}",
"}" };
return template;
}

public static List<string> Class(string namespaceName, string className, string usings, List<string> classBody)
{
var template = new List<string> {
$"{string.Join(Environment.NewLine, DefaultUsings)}",
$"{usings}",
"",
$"namespace {namespaceName}",
"{",
$"\tpublic partial class {className}",
"\t{",
$"\t{string.Join(Environment.NewLine + "\t\t", classBody)}",
"\t}",
"}" };
return template;
}
}
}
11 changes: 6 additions & 5 deletions ExcelToDotnet/Validation.cs → ExcelToDotnet/Actor/Validator.cs
Original file line number Diff line number Diff line change
@@ -1,13 +1,14 @@
using ExcelToDotnet.Extend;
using ExcelToDotnet.Code;
using ExcelToDotnet.Extend;
using Newtonsoft.Json;
using System.CodeDom.Compiler;
using System.Data;
using System.Drawing;
using System.Text.RegularExpressions;

namespace ExcelToDotnet
namespace ExcelToDotnet.Actor
{
public static class Validation
public static class Validator
{
public static void Failed(string format, params object[] args)
{
Expand Down Expand Up @@ -561,7 +562,7 @@ public static bool IsKeyword(string dataType)

public static void ValidateDataType(this DataTable dt, string keyword, List<string> dataTypes)
{
var dataTypeStrings = dataTypes.ConvertAll(x => x != null ? (string)x : String.Empty);
var dataTypeStrings = dataTypes.ConvertAll(x => x != null ? x : string.Empty);
for (int index = 0; index < dataTypeStrings.Count; ++index)
{
var dataType = dataTypeStrings[index];
Expand Down Expand Up @@ -614,7 +615,7 @@ public static void ValidateColumnName(this DataTable dt)
}

foreach (var col in dt.Columns.Cast<DataColumn>()
.Where(x => !Char.IsUpper(x.ColumnName[0]) || (x.ColumnName.Length > 1 && x.ColumnName.Length == x.ColumnName.Where(n => Char.IsUpper(n)).ToList().Count)))
.Where(x => !char.IsUpper(x.ColumnName[0]) || x.ColumnName.Length > 1 && x.ColumnName.Length == x.ColumnName.Where(n => char.IsUpper(n)).ToList().Count))
{
Failed($"컬럼명은 카멜 케이스만 지원합니다. <Table:{dt.TableName}, Column:{col}>");
}
Expand Down
2 changes: 1 addition & 1 deletion ExcelToDotnet/Options.cs → ExcelToDotnet/Cli/Options.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
using System;
using System.Collections.Generic;

namespace ExcelToDotnet
namespace ExcelToDotnet.Cli
{
public partial class Options
{
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
namespace ExcelToDotnet
namespace ExcelToDotnet.Code
{
public class ErrorCode
{
Expand Down
38 changes: 0 additions & 38 deletions ExcelToDotnet/CodeTemplate.cs

This file was deleted.

Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
using System.Data;

namespace ExcelToDotnet
namespace ExcelToDotnet.Entity
{
public class DataTableEx
{
Expand Down
6 changes: 3 additions & 3 deletions ExcelToDotnet/ExcelToDotnet.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
<Nullable>enable</Nullable>

<PackageId>ExcelToDotnet</PackageId>
<Version>1.0.38</Version>
<Version>1.0.39</Version>
<Authors>elky</Authors>
<Company>elky</Company>
<PackageReadmeFile>README.md</PackageReadmeFile>
Expand All @@ -18,8 +18,8 @@
</PropertyGroup>

<ItemGroup>
<None Include="..\LICENSE" Pack="true" PackagePath="\"/>
<None Include="..\README.md" Pack="true" PackagePath="\"/>
<None Include="..\LICENSE" Pack="true" PackagePath="\" />
<None Include="..\README.md" Pack="true" PackagePath="\" />
</ItemGroup>

<ItemGroup>
Expand Down
Loading

0 comments on commit 5ed6597

Please sign in to comment.