Skip to content

Commit 2a21f02

Browse files
Added ExportTable Implementation
1 parent b12973c commit 2a21f02

File tree

4 files changed

+102
-6
lines changed

4 files changed

+102
-6
lines changed

src/jQueryDatatableServerSideNetCore/Controllers/TestRegistersController.cs

Lines changed: 68 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,27 @@
11
using jQueryDatatableServerSideNetCore.Data;
2+
using jQueryDatatableServerSideNetCore.Extensions;
23
using jQueryDatatableServerSideNetCore.Models.AuxiliaryModels;
4+
using jQueryDatatableServerSideNetCore.Models.DatabaseModels;
5+
using jQueryDatatableServerSideNetCore.Services;
36
using Microsoft.AspNetCore.Mvc;
7+
using Microsoft.EntityFrameworkCore;
8+
using Newtonsoft.Json;
9+
using RandomGen;
410
using System;
511
using System.Linq;
612
using System.Threading.Tasks;
7-
using jQueryDatatableServerSideNetCore.Extensions;
8-
using jQueryDatatableServerSideNetCore.Models.DatabaseModels;
9-
using Microsoft.EntityFrameworkCore;
10-
using RandomGen;
1113

1214
namespace jQueryDatatableServerSideNetCore.Controllers
1315
{
1416
public class TestRegistersController : Controller
1517
{
1618
private readonly ApplicationDbContext _context;
19+
private readonly IExportService _exportService;
1720

18-
public TestRegistersController(ApplicationDbContext context)
21+
public TestRegistersController(ApplicationDbContext context, IExportService exportService)
1922
{
2023
_context = context;
24+
_exportService = exportService;
2125
}
2226

2327
// GET: TestRegisters
@@ -29,7 +33,7 @@ public async Task<IActionResult> Index()
2933
}
3034

3135
[HttpPost]
32-
public async Task<IActionResult> LoadTable([FromBody]DtParameters dtParameters)
36+
public async Task<IActionResult> LoadTable([FromBody] DtParameters dtParameters)
3337
{
3438
var searchBy = dtParameters.Search?.Value;
3539

@@ -76,6 +80,64 @@ public async Task<IActionResult> LoadTable([FromBody]DtParameters dtParameters)
7680
});
7781
}
7882

83+
[HttpPost]
84+
public async Task<IActionResult> ExportTable([FromQuery] string format)
85+
{
86+
var rawDtParametersData = HttpContext.Request.Form["dtParameters"];
87+
88+
var dtParameters = new DtParameters();
89+
if (!string.IsNullOrEmpty(rawDtParametersData))
90+
{
91+
dtParameters = JsonConvert.DeserializeObject<DtParameters>(rawDtParametersData);
92+
}
93+
94+
var searchBy = dtParameters.Search?.Value;
95+
96+
// if we have an empty search then just order the results by Id ascending
97+
var orderCriteria = "Id";
98+
var orderAscendingDirection = true;
99+
100+
if (dtParameters.Order != null)
101+
{
102+
// in this example we just default sort on the 1st column
103+
orderCriteria = dtParameters.Columns[dtParameters.Order[0].Column].Data;
104+
orderAscendingDirection = dtParameters.Order[0].Dir.ToString().ToLower() == "asc";
105+
}
106+
107+
var result = _context.TestRegisters.AsQueryable();
108+
109+
if (!string.IsNullOrEmpty(searchBy))
110+
{
111+
result = result.Where(r => r.Name != null && r.Name.ToUpper().Contains(searchBy.ToUpper()) ||
112+
r.FirstSurname != null && r.FirstSurname.ToUpper().Contains(searchBy.ToUpper()) ||
113+
r.SecondSurname != null && r.SecondSurname.ToUpper().Contains(searchBy.ToUpper()) ||
114+
r.Street != null && r.Street.ToUpper().Contains(searchBy.ToUpper()) ||
115+
r.Phone != null && r.Phone.ToUpper().Contains(searchBy.ToUpper()) ||
116+
r.ZipCode != null && r.ZipCode.ToUpper().Contains(searchBy.ToUpper()) ||
117+
r.Country != null && r.Country.ToUpper().Contains(searchBy.ToUpper()) ||
118+
r.Notes != null && r.Notes.ToUpper().Contains(searchBy.ToUpper()));
119+
}
120+
121+
result = orderAscendingDirection ? result.OrderByDynamic(orderCriteria, DtOrderDir.Asc) : result.OrderByDynamic(orderCriteria, DtOrderDir.Desc);
122+
123+
var resultList = await result.ToListAsync();
124+
125+
byte[] dataByteArray;
126+
127+
switch (format)
128+
{
129+
case ExportFormat.Excel:
130+
dataByteArray = await _exportService.ExportToExcel(resultList);
131+
132+
return File(
133+
dataByteArray,
134+
"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
135+
"data.xlsx");
136+
}
137+
138+
return null;
139+
}
140+
79141
public async Task SeedData()
80142
{
81143
if (!_context.TestRegisters.Any())

src/jQueryDatatableServerSideNetCore/Views/TestRegisters/Index.cshtml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,9 @@
55
Layout = "~/Views/Shared/_Layout.cshtml";
66
}
77

8+
<form id="export-to-file-form" method="POST" enctype="application/x-www-form-urlencoded">
9+
</form>
10+
811
<div class="row">
912
<div class="col-md-12">
1013
<table id="test-registers" class="table">

src/jQueryDatatableServerSideNetCore/jQueryDatatableServerSideNetCore.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77

88

99
<ItemGroup>
10+
<PackageReference Include="EPPlus" Version="5.8.0" />
1011
<PackageReference Include="Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore" Version="3.1.6" />
1112
<PackageReference Include="Microsoft.AspNetCore.Identity.EntityFrameworkCore" Version="3.1.6" />
1213
<PackageReference Include="Microsoft.AspNetCore.Identity.UI" Version="3.1.6" />

src/jQueryDatatableServerSideNetCore/wwwroot/js/app.js

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,16 @@ $(document).ready(function () {
1313
serverSide: true,
1414
// Paging Setups
1515
paging: true,
16+
// Custom Export Buttons
17+
dom: 'Bfrtip',
18+
buttons: [
19+
{
20+
text: 'Excel',
21+
action: function () {
22+
exportToExcel();
23+
}
24+
}
25+
],
1626
// Searching Setups
1727
searching: { regex: true },
1828
// Ajax Filter
@@ -89,4 +99,24 @@ function edit(rowContext) {
8999
var data = table.row($(rowContext).parents("tr")).data();
90100
alert("Example showing row edit with id: " + data["id"] + ", name: " + data["name"]);
91101
}
102+
}
103+
104+
function renderDownloadForm(format) {
105+
$('#export-to-file-form').attr('action', '/TestRegisters/ExportTable?format=' + format);
106+
107+
// Get jQuery DataTables AJAX params
108+
var datatableParams = $('#test-registers').DataTable().ajax.params();
109+
110+
var searchModelInput = $("<input>")
111+
.attr("type", "hidden")
112+
.attr("name", "dtParameters")
113+
.val(datatableParams);
114+
115+
$('#export-to-file-form').append(searchModelInput);
116+
}
117+
118+
function exportToExcel() {
119+
renderDownloadForm("excel");
120+
121+
$("#export-to-file-form").submit();
92122
}

0 commit comments

Comments
 (0)