Skip to content

Commit 4c9190f

Browse files
Added CsvService, improved ExportService and now ExcelService is dynamic
1 parent c807f19 commit 4c9190f

File tree

11 files changed

+324
-66
lines changed

11 files changed

+324
-66
lines changed

src/jQueryDatatableServerSideNetCore/Controllers/TestRegistersController.cs

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,11 @@
22
using jQueryDatatableServerSideNetCore.Extensions;
33
using jQueryDatatableServerSideNetCore.Models.AuxiliaryModels;
44
using jQueryDatatableServerSideNetCore.Models.DatabaseModels;
5-
using jQueryDatatableServerSideNetCore.Services;
5+
using jQueryDatatableServerSideNetCore.Services.ExportService;
66
using Microsoft.AspNetCore.Mvc;
77
using Microsoft.EntityFrameworkCore;
88
using Newtonsoft.Json;
99
using RandomGen;
10-
using System;
11-
using System.Linq;
12-
using System.Threading.Tasks;
1310

1411
namespace jQueryDatatableServerSideNetCore.Controllers
1512
{
@@ -154,6 +151,11 @@ public async Task<IActionResult> ExportTable([FromQuery] string format, [FromFor
154151
dataByteArray,
155152
"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
156153
"data.xlsx");
154+
155+
case ExportFormat.Csv:
156+
dataByteArray = _exportService.ExportToCsv(resultList);
157+
158+
return File(dataByteArray, "application/csv", "data.csv");
157159
}
158160

159161
return null;

src/jQueryDatatableServerSideNetCore/Data/ExportFormat.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,5 +8,7 @@ namespace jQueryDatatableServerSideNetCore.Data
88
public class ExportFormat
99
{
1010
public const string Excel = "excel";
11+
public const string Csv = "csv";
12+
public const string CsvDelimiter = ",";
1113
}
1214
}

src/jQueryDatatableServerSideNetCore/Program.cs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
using jQueryDatatableServerSideNetCore.Data;
2-
using jQueryDatatableServerSideNetCore.Services;
2+
using jQueryDatatableServerSideNetCore.Services.CsvService;
3+
using jQueryDatatableServerSideNetCore.Services.ExcelService;
4+
using jQueryDatatableServerSideNetCore.Services.ExportService;
35
using Microsoft.AspNetCore.Identity;
46
using Microsoft.EntityFrameworkCore;
57
using Microsoft.OpenApi.Models;
@@ -23,6 +25,8 @@
2325
});
2426

2527
builder.Services.AddScoped<IExportService, ExportService>();
28+
builder.Services.AddScoped<IExcelService, ExcelService>();
29+
builder.Services.AddScoped<ICsvService, CsvService>();
2630

2731
// Register the Swagger generator, defining 1 or more Swagger documents
2832
builder.Services.AddSwaggerGen(c =>
Lines changed: 142 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,142 @@
1+
using jQueryDatatableServerSideNetCore.Data;
2+
using System.ComponentModel.DataAnnotations;
3+
using System.Reflection;
4+
using System.Text;
5+
6+
namespace jQueryDatatableServerSideNetCore.Services.CsvService
7+
{
8+
public class CsvService : ICsvService
9+
{
10+
public byte[] Write<T>(IList<T> list, bool includeHeader = true)
11+
{
12+
StringBuilder sb = new StringBuilder();
13+
Type type = typeof(T);
14+
PropertyInfo[] properties = type.GetProperties();
15+
16+
if (includeHeader)
17+
{
18+
sb.AppendLine(CreateCsvHeaderLine(properties));
19+
}
20+
21+
foreach (var item in list)
22+
{
23+
sb.AppendLine(CreateCsvLine(item, properties));
24+
}
25+
26+
return Encoding.ASCII.GetBytes(sb.ToString());
27+
}
28+
29+
public string CreateCsvHeaderLine(PropertyInfo[] properties)
30+
{
31+
List<string> propertyValues = new List<string>();
32+
33+
foreach (var prop in properties)
34+
{
35+
string value = prop.Name;
36+
37+
var attribute = prop.GetCustomAttribute(typeof(DisplayAttribute));
38+
if (attribute != null)
39+
{
40+
value = (attribute as DisplayAttribute).Name;
41+
}
42+
43+
CreateCsvStringItem(propertyValues, value);
44+
}
45+
46+
return CreateCsvLine(propertyValues);
47+
}
48+
49+
public string CreateCsvLine<T>(T item, PropertyInfo[] properties)
50+
{
51+
List<string> propertyValues = new List<string>();
52+
53+
foreach (var prop in properties)
54+
{
55+
string stringformatString = string.Empty;
56+
object value = prop.GetValue(item, null);
57+
58+
if (prop.PropertyType == typeof(string))
59+
{
60+
CreateCsvStringItem(propertyValues, value);
61+
}
62+
else if (prop.PropertyType == typeof(string[]))
63+
{
64+
CreateCsvStringArrayItem(propertyValues, value);
65+
}
66+
else if (prop.PropertyType == typeof(List<string>))
67+
{
68+
CreateCsvStringListItem(propertyValues, value);
69+
}
70+
else
71+
{
72+
CreateCsvItem(propertyValues, value);
73+
}
74+
}
75+
76+
return CreateCsvLine(propertyValues);
77+
}
78+
79+
public string CreateCsvLine(IList<string> list)
80+
{
81+
return string.Join(ExportFormat.CsvDelimiter, list);
82+
}
83+
84+
public void CreateCsvItem(List<string> propertyValues, object value)
85+
{
86+
if (value != null)
87+
{
88+
propertyValues.Add(value.ToString());
89+
}
90+
else
91+
{
92+
propertyValues.Add(string.Empty);
93+
}
94+
}
95+
96+
public void CreateCsvStringListItem(List<string> propertyValues, object value)
97+
{
98+
string formatString = "\"{0}\"";
99+
if (value != null)
100+
{
101+
value = CreateCsvLine((List<string>)value);
102+
propertyValues.Add(string.Format(formatString, ProcessStringEscapeSequence(value)));
103+
}
104+
else
105+
{
106+
propertyValues.Add(string.Empty);
107+
}
108+
}
109+
110+
public void CreateCsvStringArrayItem(List<string> propertyValues, object value)
111+
{
112+
string formatString = "\"{0}\"";
113+
if (value != null)
114+
{
115+
value = CreateCsvLine(((string[])value).ToList());
116+
propertyValues.Add(string.Format(formatString, ProcessStringEscapeSequence(value)));
117+
}
118+
else
119+
{
120+
propertyValues.Add(string.Empty);
121+
}
122+
}
123+
124+
public void CreateCsvStringItem(List<string> propertyValues, object value)
125+
{
126+
string formatString = "\"{0}\"";
127+
if (value != null)
128+
{
129+
propertyValues.Add(string.Format(formatString, ProcessStringEscapeSequence(value)));
130+
}
131+
else
132+
{
133+
propertyValues.Add(string.Empty);
134+
}
135+
}
136+
137+
public string ProcessStringEscapeSequence(object value)
138+
{
139+
return value.ToString().Replace("\"", "\"\"");
140+
}
141+
}
142+
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
using System.Reflection;
2+
3+
namespace jQueryDatatableServerSideNetCore.Services.CsvService
4+
{
5+
public interface ICsvService
6+
{
7+
byte[] Write<T>(IList<T> list, bool includeHeader = true);
8+
9+
string CreateCsvHeaderLine(PropertyInfo[] properties);
10+
11+
string CreateCsvLine<T>(T item, PropertyInfo[] properties);
12+
13+
string CreateCsvLine(IList<string> list);
14+
15+
void CreateCsvItem(List<string> propertyValues, object value);
16+
17+
void CreateCsvStringListItem(List<string> propertyValues, object value);
18+
19+
void CreateCsvStringArrayItem(List<string> propertyValues, object value);
20+
21+
void CreateCsvStringItem(List<string> propertyValues, object value);
22+
23+
string ProcessStringEscapeSequence(object value);
24+
}
25+
}
Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
using OfficeOpenXml;
2+
using OfficeOpenXml.Style;
3+
using OfficeOpenXml.Table;
4+
using System.ComponentModel.DataAnnotations;
5+
using System.Reflection;
6+
7+
namespace jQueryDatatableServerSideNetCore.Services.ExcelService
8+
{
9+
public class ExcelService : IExcelService
10+
{
11+
public async Task<byte[]> Write<T>(IList<T> registers)
12+
{
13+
var registersTotalRows = registers.Count;
14+
15+
using (var excelPackage = new ExcelPackage())
16+
{
17+
var excelWorksheet = excelPackage.Workbook.Worksheets.Add("TestRegisters");
18+
19+
Type type = typeof(T);
20+
PropertyInfo[] properties = type.GetProperties();
21+
22+
for (var i = 0; i < properties.Length; i++)
23+
{
24+
string value = properties[i].Name;
25+
26+
var attribute = properties[i].GetCustomAttribute(typeof(DisplayAttribute));
27+
if (attribute != null)
28+
{
29+
value = (attribute as DisplayAttribute).Name;
30+
}
31+
32+
excelWorksheet.Cells[1, i + 1].Value = value;
33+
}
34+
35+
int index = 0;
36+
for (int row = 2; row <= registersTotalRows + 1; row++)
37+
{
38+
for (var i = 0; i < properties.Length; i++)
39+
{
40+
var value = properties[i].GetValue(registers[index], null);
41+
42+
Type propertyType = properties[i].PropertyType;
43+
TypeCode typeCode = Type.GetTypeCode(propertyType);
44+
45+
var columnIndex = i + 1;
46+
47+
switch (typeCode)
48+
{
49+
case TypeCode.String:
50+
excelWorksheet.Cells[row, columnIndex].Value = value;
51+
break;
52+
53+
case TypeCode.Int32:
54+
case TypeCode.Double:
55+
case TypeCode.Decimal:
56+
case TypeCode.Single:
57+
excelWorksheet.Cells[row, columnIndex].Value = value?.ToString();
58+
break;
59+
60+
case TypeCode.Boolean:
61+
excelWorksheet.Cells[row, columnIndex].Value = ((bool)value) ? "Yes" : "No";
62+
break;
63+
64+
case TypeCode.DateTime:
65+
excelWorksheet.Cells[row, columnIndex].Value = ((DateTime)value).ToString("dd/MM/yyyy HH:mm:ss");
66+
break;
67+
68+
default:
69+
excelWorksheet.Cells[row, columnIndex].Value = string.Empty;
70+
break;
71+
}
72+
}
73+
74+
index++;
75+
}
76+
excelWorksheet.Cells.AutoFitColumns();
77+
78+
var excelTable = excelWorksheet.Tables.Add(new ExcelAddressBase(fromRow: 1, fromCol: 1, toRow: registersTotalRows, toColumn: properties.Length), "TestRegisters");
79+
excelTable.ShowHeader = true;
80+
81+
var excelRange = excelWorksheet.Cells[1, 1, excelWorksheet.Dimension.End.Row, excelWorksheet.Dimension.End.Column];
82+
excelRange.Style.Border.BorderAround(ExcelBorderStyle.Thin);
83+
excelTable.TableStyle = TableStyles.Light21;
84+
excelTable.ShowTotal = false;
85+
86+
return await excelPackage.GetAsByteArrayAsync();
87+
}
88+
}
89+
}
90+
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
using System.Reflection;
2+
3+
namespace jQueryDatatableServerSideNetCore.Services.ExcelService
4+
{
5+
public interface IExcelService
6+
{
7+
Task<byte[]> Write<T>(IList<T> registers);
8+
}
9+
}

src/jQueryDatatableServerSideNetCore/Services/ExportService.cs

Lines changed: 0 additions & 60 deletions
This file was deleted.

0 commit comments

Comments
 (0)