Skip to content

Commit 22b3acc

Browse files
authored
Merge pull request #5 from I-RzR-I/feature/AddNewTemplateGeneration
Feature/add new template generation
2 parents ab37785 + caff077 commit 22b3acc

22 files changed

+1050
-152
lines changed

docs/CHANGELOG.md

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,21 @@
1-
## **v1.1.0.0**
2-
-> Add template generation; <br />
3-
-> Add attribute with column validation on generate template and complete it; <br />
4-
-> Small code clean and fixes; <br />
5-
-> Upgrade reference libraries.
1+
### **v2.0.0.0**
2+
-> Add template generation based on user defined configuration (fields and validations) `GenerateTemplateAsync` and `GenerateTemplate`; <br />
3+
-> Add custom user defined fields on template generation based on class type (GenerateTemplate/Async&lt;T&gt;); <br />
4+
-> Remove cast to int on data validation attribute; <br />
5+
-> Add new test to verify data validation on DATE buid; <br />
6+
-> Adjust cell data validation build flow. Add/adjust DATE format on validation; <br />
7+
-> Adjust store and data format to use custom defined; <br />
8+
-> Add custom numbering formats; <br />
9+
-> Upgrade reference package version: `AggregatedGenericResultMessage`, `DocumentFormat.OpenXml`, `DomainCommonExtensions`.<br />
10+
11+
### **v1.2.0.0**
12+
-> Upgrade reference package version: `AggregatedGenericResultMessage`, `DocumentFormat.OpenXml`, `DomainCommonExtensions`.
613

714
### **v1.1.1.6701**
815
-> Update reference package version, fixing CVE (`CVE-2024-43485`);
916

10-
### **v1.2.0.0**
11-
-> Upgrade reference package version: `AggregatedGenericResultMessage`, `DocumentFormat.OpenXml`, `DomainCommonExtensions`.
17+
## **v1.1.0.0**
18+
-> Add template generation; <br />
19+
-> Add attribute with column validation on generate template and complete it; <br />
20+
-> Small code clean and fixes; <br />
21+
-> Upgrade reference libraries.

src/DynamicExcelProvider/Abstractions/IExcelWriteFactoryProvider.cs

Lines changed: 37 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
#region U S A G E S
1818

1919
using AggregatedGenericResultMessage.Abstractions;
20+
using DynamicExcelProvider.Models.Request.Configuration;
2021
using DynamicExcelProvider.Models.Request.Configuration.Property;
2122
using DynamicExcelProvider.Models.Request.Export;
2223
using DynamicExcelProvider.WorkXCore.Models;
@@ -56,7 +57,7 @@ public interface IExcelWriteFactoryProvider
5657
/// </returns>
5758
/// =================================================================================================
5859
Task<IResult<byte[]>> GenerateCsvFromKnownAsync(
59-
IReadOnlyCollection<PropModel> embeddedModelCollection, IReadOnlyCollection<PropTranslateModel> availablePropInOutput,
60+
IReadOnlyCollection<PropModel> embeddedModelCollection, IReadOnlyCollection<PropTranslateModel> availablePropInOutput,
6061
IEnumerable<IReadOnlyList<PropNameValue>> data, CancellationToken cancellationToken = default);
6162

6263
/// -------------------------------------------------------------------------------------------------
@@ -207,11 +208,12 @@ Task<IResult> GenerateAsync<TDataModel>(Stream stream, IReadOnlyCollection<TData
207208
/// </summary>
208209
/// <typeparam name="T">Generic type parameter.</typeparam>
209210
/// <param name="lcid">The lcid.</param>
211+
/// <param name="customOutFields">(Optional) Custom user defined output/result fields.</param>
210212
/// <returns>
211213
/// The template.
212214
/// </returns>
213215
/// =================================================================================================
214-
IResult<byte[]> GenerateTemplate<T>(int lcid) where T : class;
216+
IResult<byte[]> GenerateTemplate<T>(int lcid, IReadOnlyCollection<string> customOutFields = null) where T : class;
215217

216218
/// -------------------------------------------------------------------------------------------------
217219
/// <summary>
@@ -220,26 +222,30 @@ Task<IResult> GenerateAsync<TDataModel>(Stream stream, IReadOnlyCollection<TData
220222
/// <typeparam name="T">Generic type parameter.</typeparam>
221223
/// <param name="stream">The stream.</param>
222224
/// <param name="lcid">The lcid.</param>
225+
/// <param name="customOutFields">(Optional) Custom user defined output/result fields.</param>
223226
/// <returns>
224227
/// The template.
225228
/// </returns>
226229
/// =================================================================================================
227-
IResult GenerateTemplate<T>(MemoryStream stream, int lcid) where T : class;
230+
IResult GenerateTemplate<T>(MemoryStream stream, int lcid,
231+
IReadOnlyCollection<string> customOutFields = null) where T : class;
228232

229233
/// -------------------------------------------------------------------------------------------------
230234
/// <summary>
231235
/// Generates a template asynchronous.
232236
/// </summary>
233237
/// <typeparam name="T">Generic type parameter.</typeparam>
234238
/// <param name="lcid">The lcid.</param>
239+
/// <param name="customOutFields">(Optional) Custom user defined output/result fields.</param>
235240
/// <param name="cancellationToken">
236241
/// (Optional) A token that allows processing to be cancelled.
237242
/// </param>
238243
/// <returns>
239244
/// The template asynchronous.
240245
/// </returns>
241246
/// =================================================================================================
242-
Task<IResult<byte[]>> GenerateTemplateAsync<T>(int lcid, CancellationToken cancellationToken = default) where T : class;
247+
Task<IResult<byte[]>> GenerateTemplateAsync<T>(int lcid,
248+
IReadOnlyCollection<string> customOutFields = null, CancellationToken cancellationToken = default) where T : class;
243249

244250
/// -------------------------------------------------------------------------------------------------
245251
/// <summary>
@@ -248,13 +254,39 @@ Task<IResult> GenerateAsync<TDataModel>(Stream stream, IReadOnlyCollection<TData
248254
/// <typeparam name="T">Generic type parameter.</typeparam>
249255
/// <param name="stream">The stream.</param>
250256
/// <param name="lcid">The lcid.</param>
257+
/// <param name="customOutFields">(Optional) Custom user defined output/result fields.</param>
251258
/// <param name="cancellationToken">
252259
/// (Optional) A token that allows processing to be cancelled.
253260
/// </param>
254261
/// <returns>
255262
/// The template asynchronous.
256263
/// </returns>
257264
/// =================================================================================================
258-
Task<IResult> GenerateTemplateAsync<T>(MemoryStream stream, int lcid, CancellationToken cancellationToken = default) where T : class;
265+
Task<IResult> GenerateTemplateAsync<T>(MemoryStream stream, int lcid,
266+
IReadOnlyCollection<string> customOutFields = null, CancellationToken cancellationToken = default) where T : class;
267+
268+
/// -------------------------------------------------------------------------------------------------
269+
/// <summary>
270+
/// Generates a template.
271+
/// </summary>
272+
/// <param name="stream">The stream.</param>
273+
/// <param name="configuration">The configuration.</param>
274+
/// <returns>
275+
/// The template.
276+
/// </returns>
277+
/// =================================================================================================
278+
IResult GenerateTemplate(Stream stream, ExcelTemplateWriteConfiguration configuration);
279+
280+
/// -------------------------------------------------------------------------------------------------
281+
/// <summary>
282+
/// Generates a template asynchronous.
283+
/// </summary>
284+
/// <param name="stream">The stream.</param>
285+
/// <param name="configuration">The configuration.</param>
286+
/// <returns>
287+
/// The template asynchronous.
288+
/// </returns>
289+
/// =================================================================================================
290+
Task<IResult> GenerateTemplateAsync(Stream stream, ExcelTemplateWriteConfiguration configuration);
259291
}
260292
}

src/DynamicExcelProvider/Attributes/ExcelPropValidationAttribute.cs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -48,8 +48,8 @@ public ExcelPropValidationAttribute(
4848
ValidationType = validationType;
4949
OperatorType = operatorType;
5050
AllowedValues = allowedValues;
51-
MinValue = (int?)minValue;
52-
MaxValue = (int?)maxValue;
51+
MinValue = minValue;
52+
MaxValue = maxValue;
5353
ErrorMessage = errorMessage;
5454
PromptMessage = promptMessage;
5555
AllowEmpty = allowEmpty;
@@ -89,8 +89,8 @@ public ExcelPropValidationAttribute(
8989
{
9090
ValidationType = validationType;
9191
OperatorType = operatorType;
92-
MinValue = (int?)minValue;
93-
MaxValue = (int?)maxValue;
92+
MinValue = minValue;
93+
MaxValue = maxValue;
9494
ErrorMessage = errorMessage;
9595
PromptMessage = promptMessage;
9696
AllowEmpty = allowEmpty;
@@ -107,7 +107,7 @@ public ExcelPropValidationAttribute(
107107
{
108108
ValidationType = validationType;
109109
OperatorType = operatorType;
110-
MinValue = (int?)minValue;
110+
MinValue = minValue;
111111
ErrorMessage = errorMessage;
112112
PromptMessage = promptMessage;
113113
AllowEmpty = allowEmpty;

src/DynamicExcelProvider/DynamicExcelProvider.csproj

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -52,8 +52,8 @@
5252

5353
<ItemGroup>
5454
<PackageReference Include="AggregatedGenericResultMessage" Version="1.3.5.4696" />
55-
<PackageReference Include="DocumentFormat.OpenXml" Version="3.2.0" />
56-
<PackageReference Include="DomainCommonExtensions" Version="2.0.1.8588" />
55+
<PackageReference Include="DocumentFormat.OpenXml" Version="3.3.0" />
56+
<PackageReference Include="DomainCommonExtensions" Version="2.1.1.6403" />
5757
<PackageReference Include="Microsoft.CSharp" Version="4.7.0" />
5858
</ItemGroup>
5959

src/DynamicExcelProvider/Helpers/DataValidationsBuildHelper.cs

Lines changed: 111 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -25,15 +25,17 @@
2525
using DynamicExcelProvider.Enums;
2626
using DynamicExcelProvider.Mapper;
2727
using DynamicExcelProvider.Models.Request.Configuration.Property;
28+
using DynamicExcelProvider.Models.Request.Configuration.Template;
2829
using DynamicExcelProvider.WorkXCore.Extensions;
30+
using System;
2931
using System.Collections.Generic;
3032
using System.Linq;
3133
using System.Reflection;
3234

33-
#endregion
34-
3535
// ReSharper disable PossibleMultipleEnumeration
3636

37+
#endregion
38+
3739
namespace DynamicExcelProvider.Helpers
3840
{
3941
/// -------------------------------------------------------------------------------------------------
@@ -53,7 +55,9 @@ internal static class DataValidationsBuildHelper
5355
/// The DataValidations.
5456
/// </returns>
5557
/// =================================================================================================
56-
internal static DataValidations BuildSheetDataValidations(ref IEnumerable<PropertyInfo> properties, ref IReadOnlyCollection<PropTranslateModel> outputProps)
58+
internal static DataValidations BuildSheetDataValidations(
59+
ref IEnumerable<PropertyInfo> properties,
60+
ref IReadOnlyCollection<PropTranslateModel> outputProps)
5761
{
5862
try
5963
{
@@ -92,11 +96,27 @@ internal static DataValidations BuildSheetDataValidations(ref IEnumerable<Proper
9296
dataValidation.ShowErrorMessage = new BooleanValue(true);
9397
}
9498

95-
if (validationAttribute.MinValue.IsNull().IsFalse())
96-
dataValidation.Formula1 = new Formula1($"{validationAttribute.MinValue}");
99+
if (validationAttribute.MinValue.IsNotNull())
100+
{
101+
if (validationAttribute.ValidationType == ValidationType.Date)
102+
{
103+
var parseDate = Convert.ToDateTime(validationAttribute.MinValue);
104+
dataValidation.Formula1 = new Formula1("DATE({0},{1},{2})".FormatWith(parseDate.Year, parseDate.Month, parseDate.Day));
105+
}
106+
else
107+
dataValidation.Formula1 = new Formula1($"{validationAttribute.MinValue}");
108+
}
97109

98-
if (validationAttribute.MaxValue.IsNull().IsFalse())
99-
dataValidation.Formula2 = new Formula2($"{validationAttribute.MaxValue}");
110+
if (validationAttribute.MaxValue.IsNotNull())
111+
{
112+
if (validationAttribute.ValidationType == ValidationType.Date)
113+
{
114+
var parseDate = Convert.ToDateTime(validationAttribute.MaxValue);
115+
dataValidation.Formula2 = new Formula2("DATE({0},{1},{2})".FormatWith(parseDate.Year, parseDate.Month, parseDate.Day));
116+
}
117+
else
118+
dataValidation.Formula2 = new Formula2($"{validationAttribute.MaxValue}");
119+
}
100120

101121
if (validationAttribute.AllowedValues.IsNullOrEmptyEnumerable().IsFalse())
102122
dataValidation.Formula1 = new Formula1($"\"{validationAttribute.AllowedValues.ListToString(",")}\"");
@@ -115,5 +135,89 @@ internal static DataValidations BuildSheetDataValidations(ref IEnumerable<Proper
115135
return null;
116136
}
117137
}
138+
139+
/// -------------------------------------------------------------------------------------------------
140+
/// <summary>
141+
/// Builds sheet data validations.
142+
/// </summary>
143+
/// <param name="sheetValidations">[in,out] The sheet validations.</param>
144+
/// <returns>
145+
/// The DataValidations.
146+
/// </returns>
147+
/// =================================================================================================
148+
internal static DataValidations BuildSheetDataValidations(
149+
ref IEnumerable<TemplateDataValidation> sheetValidations)
150+
{
151+
try
152+
{
153+
var dataValidations = new DataValidations();
154+
155+
foreach (var validation in sheetValidations)
156+
{
157+
var sheetColumnLetter = SpreadsheetExtensions.GetExcelColumnName(validation.PropertyIndex).Response;
158+
159+
var dataValidation = new DataValidation
160+
{
161+
SequenceOfReferences = new ListValue<StringValue>
162+
{
163+
InnerText = $"{sheetColumnLetter}2:{sheetColumnLetter}1048576"
164+
},
165+
Type = new EnumValue<DataValidationValues>(EnumMapper.MapValidation(validation.ValidationType)),
166+
Operator = validation.ValidationType != ValidationType.List
167+
? new EnumValue<DataValidationOperatorValues>(EnumMapper.MapOperator(validation.OperatorType))
168+
: null,
169+
AllowBlank = new BooleanValue(validation.AllowEmpty.IsTrue())
170+
};
171+
172+
if (validation.PromptMessage.IsNullOrEmpty().IsFalse())
173+
{
174+
dataValidation.Prompt = validation.PromptMessage;
175+
dataValidation.ShowInputMessage = new BooleanValue(true);
176+
}
177+
178+
if (validation.ErrorMessage.IsNullOrEmpty().IsFalse())
179+
{
180+
dataValidation.Error = validation.ErrorMessage;
181+
dataValidation.ShowErrorMessage = new BooleanValue(true);
182+
}
183+
184+
if (validation.MinValue.IsNotNull())
185+
{
186+
if (validation.ValidationType == ValidationType.Date)
187+
{
188+
var parseDate = Convert.ToDateTime(validation.MinValue);
189+
dataValidation.Formula1 = new Formula1("DATE({0},{1},{2})".FormatWith(parseDate.Year, parseDate.Month, parseDate.Day));
190+
}
191+
else
192+
dataValidation.Formula1 = new Formula1($"{validation.MinValue}");
193+
}
194+
195+
if (validation.MaxValue.IsNotNull())
196+
{
197+
if (validation.ValidationType == ValidationType.Date)
198+
{
199+
var parseDate = Convert.ToDateTime(validation.MaxValue);
200+
dataValidation.Formula2 = new Formula2("DATE({0},{1},{2})".FormatWith(parseDate.Year, parseDate.Month, parseDate.Day));
201+
}
202+
else
203+
dataValidation.Formula2 = new Formula2($"{validation.MaxValue}");
204+
}
205+
206+
if (validation.AllowedValues.IsNullOrEmptyEnumerable().IsFalse())
207+
dataValidation.Formula1 = new Formula1($"\"{validation.AllowedValues.ListToString(",")}\"");
208+
209+
if (validation.ShowListInDropDown.IsTrue())
210+
dataValidation.ShowDropDown = new BooleanValue(true);
211+
212+
dataValidations.Append(dataValidation);
213+
}
214+
215+
return dataValidations;
216+
}
217+
catch
218+
{
219+
return null;
220+
}
221+
}
118222
}
119223
}

0 commit comments

Comments
 (0)