private void LoadSelectLists() { ViewBag.AccountList = (Session["ReportAccountList"] ?? (Session["ReportAccountList"] = Factory.GetDisplayList <IAccountDto>().OrderBy(a => a.Value) .Select(a => new SelectListItem { Value = a.Key, Text = a.Value }).ToList())) as List <SelectListItem>; var shopArgs = new ServiceArgs { { "HideFromReports", false } }; ViewBag.ShopList = (Session["ReportShopList"] ?? (Session["ReportShopList"] = Factory.GetDisplayList <IShopDto>(shopArgs).OrderBy(s => s.Value) .Select(s => new SelectListItem { Value = s.Key, Text = s.Value }).ToList())) as List <SelectListItem>; ViewBag.RepairStatusList = Enum.GetValues(typeof(RepairStatuses)).Cast <int>() .Select(s => new SelectListItem { Value = s.ToString(), Text = Enum.GetName(typeof(RepairStatuses), s) }) .ToList(); ViewBag.FieldList = FieldList.Select(prop => new SelectListItem { Value = prop, Text = prop, Selected = true }).ToList(); ViewBag.DateFieldList = DateFieldList.Select(prop => new SelectListItem { Value = prop, Text = prop }).ToList(); }
public async Task <ActionResult> RunReport(GenerateExtractViewModel request) { if (request == null || !ModelState.IsValid) { LoadSelectLists(); return(View("ExtractHome", request)); } // Load User Offset. var offset = Factory.User.UserUtcOffset; // Build Fields. var fields = string.Join(", ", FieldList.Intersect(request.FieldList).Select( s => s.EndsWith("Dt") ? $"Common.udf_GetLocalDateTime({s},'{offset}') [{s}]" : $"[{s}]")); // Build Filters. var filterList = new List <string>(); if (request.AccountGuid.HasValue) { filterList.Add($"AccountGuid = '{ request.AccountGuid?.ToString() }'"); } if (request.ShopGuid.HasValue) { filterList.Add($"ShopGuid = '{ request.ShopGuid?.ToString() }'"); } if (request.RepairStatus.HasValue) { filterList.Add($"RepairStatusId = { request.RepairStatus }"); } if (request.RequestType.HasValue) { filterList.Add($"RequestTypeId = { request.RequestType }"); } filterList.Add($"Common.udf_GetLocalDateTime({ DateFieldList.First(d => d == request.DateFieldFilter) }, '{ offset }') BETWEEN '{ request.StartDate.ToShortDateString() }' AND '{ request.EndDate.ToShortDateString() }'"); var filter = filterList.Count > 0 ? $"WHERE {string.Join(" AND ", filterList)}" : string.Empty; // Build Query. var query = $"SELECT { fields } FROM Reporting.ReportData { (!string.IsNullOrEmpty(filter) ? filter : "") };"; // Load Report Table. var reportTable = new DataTable(); using (var conn = new SqlConnection(MvcApplication.ConnectionString)) { using (var reader = conn.ExecuteReader(query)) { reportTable.Load(reader); } } // Build Excel. using (var package = new ExcelPackage()) { var worksheet = package.Workbook.Worksheets.Add("DataExtract"); worksheet.Cells["A1"].LoadFromDataTable(reportTable, true); int index = 0; List <int> dateIndexes = new List <int>(); foreach (var cell in worksheet.Cells) { if (index == request.FieldList.Count()) { index = 0; } if (cell.Text.Contains("Dt")) { dateIndexes.Add(index); } else if (dateIndexes.Contains(index)) { cell.Style.Numberformat.Format = "MM/dd/yyyy"; } index++; } var stream = new MemoryStream(package.GetAsByteArray()); await new ClientHubMessenger().DownloadCompleted(Factory.User.UserGuid, "/Reporting/Extract", "btnSubmit"); return(File(stream, "pplication/vnd.ms-excel", "AirProDataExtract.xlsx")); } }