public async Task GenerateReport( SupplementaryDataWrapper supplementaryDataWrapper, SourceFileModel sourceFile, ZipArchive archive, CancellationToken cancellationToken) { var ukPrn = Convert.ToInt32(sourceFile.UKPRN); var sourceFiles = await _supplementaryDataService.GetImportFiles(sourceFile.UKPRN, cancellationToken); var supplementaryData = await _supplementaryDataService.GetSupplementaryData(sourceFiles, cancellationToken); var ilrYearlyFileData = await _ilrService.GetIlrFileDetails(ukPrn, cancellationToken); var fm70YearlyData = (await _ilrService.GetYearlyIlrData(ukPrn, cancellationToken)).ToList(); FundingSummaryHeaderModel fundingSummaryHeaderModel = PopulateReportHeader(sourceFile, ilrYearlyFileData, ukPrn, cancellationToken); var workbook = new Workbook(); workbook.Worksheets.Clear(); foreach (var file in sourceFiles) { var fundingYear = FileNameHelper.GetFundingYearFromFileName(file.FileName); var thisYearsFm70Data = fm70YearlyData.Where(d => d.FundingYear == fundingYear); var fundingSummaryModels = PopulateReportData(thisYearsFm70Data, supplementaryData[file.SourceFileId]).ToList(); ApplyFundingYearToEmptyFundingYears(fundingSummaryModels, fundingYear); FundingSummaryFooterModel fundingSummaryFooterModel = PopulateReportFooter(cancellationToken); FundingSummaryModel rowOfData = fundingSummaryModels.FirstOrDefault(x => x.DeliverableCode == "ST01" && x.YearlyValues.Any()); var yearAndDataLengthModels = new List <YearAndDataLengthModel>(); if (rowOfData != null) { int valCount = rowOfData.YearlyValues.Sum(x => x.Values.Length); _reportWidth = valCount + rowOfData.Totals.Count + 2; foreach (FundingSummaryReportYearlyValueModel fundingSummaryReportYearlyValueModel in rowOfData.YearlyValues) { yearAndDataLengthModels.Add(new YearAndDataLengthModel( fundingSummaryReportYearlyValueModel.FundingYear, fundingSummaryReportYearlyValueModel.Values.Length)); } } _cachedHeaders = GetHeaderEntries(yearAndDataLengthModels); _cellStyles = _excelStyleProvider.GetFundingSummaryStyles(workbook); Worksheet sheet = workbook.Worksheets.Add(file.ConRefNumber); workbook = GetWorkbookReport(workbook, sheet, fundingSummaryHeaderModel, fundingSummaryModels, fundingSummaryFooterModel); ApplyAdditionalFormatting(workbook, rowOfData); } string externalFileName = GetExternalFilename(sourceFile.UKPRN, sourceFile.JobId ?? 0, sourceFile.SuppliedDate ?? DateTime.MinValue); string fileName = GetFilename(sourceFile.UKPRN, sourceFile.JobId ?? 0, sourceFile.SuppliedDate ?? DateTime.MinValue); using (var ms = new MemoryStream()) { workbook.Save(ms, SaveFormat.Xlsx); await _storage.SaveAsync($"{externalFileName}.xlsx", ms, cancellationToken); await WriteZipEntry(archive, $"{fileName}.xlsx", ms, cancellationToken); } }