using System; using System.Collections.Generic; using System.Collections.Specialized; using System.Data; using System.Drawing; using System.IO; using System.Linq; using System.Net; using System.Net.Mime; using System.Text; using System.Text.RegularExpressions; using System.Web; using System.Web.Mvc; using Aspose.Cells; using FastReport; using FastReport.Utils; using Kreta.BusinessLogic.Classes; using Kreta.BusinessLogic.Classes.AsposeHelpers; using Kreta.BusinessLogic.HelperClasses; using Kreta.BusinessLogic.Helpers; using Kreta.BusinessLogic.Helpers.Nyomtatvanyok.Iktatas; using Kreta.BusinessLogic.Logic; using Kreta.Core; using Kreta.Enums; using Kreta.Enums.ManualEnums; using Kreta.Resources; using Kreta.Web.Areas.Nyomtatvanyok.Logic; using Kreta.Web.Classes; using Kreta.Web.Helpers; using Kreta.Web.Helpers.Error; using Kreta.Web.Security; namespace Kreta.Web.Areas.Nyomtatvanyok.Controllers { public partial class NyomtatvanyokController : BaseNyomtatvanyokController { protected ActionResult StaticDocumentNyomtatas(string documentName, string nyomtatvanyNeve = "Alap", NyomtatvanyFormatumEnum formatum = NyomtatvanyFormatumEnum.PDF) { var h = new AsposeHelper(); MemoryStream ms; if (!string.IsNullOrWhiteSpace(documentName)) { var sablonPath = Url.Content("~/Resources/AsposeSablonok/" + documentName); sablonPath = System.Web.Hosting.HostingEnvironment.MapPath(sablonPath); using (var stream = System.IO.File.OpenRead(sablonPath)) { ms = (MemoryStream)h.GetStaticDocument(stream, (int)formatum); } string extension; switch (formatum) { case NyomtatvanyFormatumEnum.Word: extension = Constants.ImportExport.FileFormatDocx; break; default: extension = Constants.ImportExport.FileFormatPdf; break; } return new FileContentResult(ms.ToArray(), MediaTypeNames.Application.Octet) { FileDownloadName = HttpUtility.UrlEncode($"{nyomtatvanyNeve}.{extension}", Encoding.UTF8), }; } return null; } protected ActionResult Nyomtatas(DataSet ds, string frxNeve, Dictionary parameterek = null, string nyomtatvanyNeve = "Alap", bool iktatas = false, string iktatasAzonosito = "Iktatas", string headerImage = null, string footerImage = null, int formatumId = (int)NyomtatvanyFormatumEnum.PDF, int? osztalyId = null, DokumentumKategoriaEnum? dokumentumKategoria = null, Enums.DokumentumTipusEnum? dokumentumTipus = null, NameValueCollection kulcsSzavak = null, FoszamDefinicioValueModel foszamDefinicio = null, bool egyediLablecKellOldalszam = true, bool IsAspose = false, System.Reflection.MethodInfo asposeMetodus = null, AsposeHelperOptions asposeHelperOptions = null, Bitmap qrCode = null) { if (ds.IsEmpty()) { throw new StatusError( HttpStatusCode.InternalServerError, CommonResource.Ures); } if (!IsAspose) { return formatumId == (int)NyomtatvanyFormatumEnum.PDF ? PDFNyomtatas(ds, frxNeve, parameterek, nyomtatvanyNeve, iktatas, iktatasAzonosito, headerImage, footerImage, osztalyId, kulcsSzavak, dokumentumKategoria, dokumentumTipus, foszamDefinicio, egyediLablecKellOldalszam, qrCode) : WordNyomtatas(ds, frxNeve, parameterek, nyomtatvanyNeve, iktatas, iktatasAzonosito, osztalyId: osztalyId, dokumentumKategoria: dokumentumKategoria, dokumentumTipus: dokumentumTipus, kulcsSzavak: kulcsSzavak, foszamDefinicio: foszamDefinicio, egyediLablecKellOldalszam: egyediLablecKellOldalszam, qrCode); } else { if (asposeMetodus == null) { throw new ArgumentNullException(nameof(asposeMetodus)); } if (asposeHelperOptions == null) { throw new ArgumentNullException(nameof(asposeHelperOptions)); } var h = new AsposeHelper(ds, asposeHelperOptions); MemoryStream ms; if (!string.IsNullOrWhiteSpace(frxNeve)) { var sablonPath = Url.Content("~/Resources/AsposeSablonok/" + frxNeve); sablonPath = System.Web.Hosting.HostingEnvironment.MapPath(sablonPath); using (var stream = System.IO.File.OpenRead(sablonPath)) { ms = (MemoryStream)asposeMetodus.Invoke(h, new object[] { stream, formatumId }); } } else { ms = (MemoryStream)asposeMetodus.Invoke(h, new object[] { null, formatumId }); } ms.Position = 0; string extension; switch (formatumId) { case (int)NyomtatvanyFormatumEnum.Word: extension = Constants.ImportExport.FileFormatDocx; break; default: extension = Constants.ImportExport.FileFormatPdf; break; } return new FileContentResult(ms.ToArray(), MediaTypeNames.Application.Octet) { FileDownloadName = HttpUtility.UrlEncode($"{nyomtatvanyNeve}.{extension}", Encoding.UTF8), }; } } protected MemoryStream GetMemoryStreamByName(DataSet ds, string frxNeve, Dictionary parameterek = null, string nyomtatvanyNeve = "Alap", string headerImage = null, string footerImage = null, int formatumId = (int)NyomtatvanyFormatumEnum.PDF, bool egyediLablecKellOldalszam = true, Enums.DokumentumTipusEnum? dokumentumTipus = null, bool IsAspose = false, System.Reflection.MethodInfo asposeMetodus = null, AsposeHelperOptions asposeHelperOptions = null) { if (!IsAspose) { const string fileTemplate = "{0}/{1}.frx"; var filePath = Server.MapPath(string.Format(fileTemplate, ApplicationData.NyomtatasiSablonokKonyvtar, frxNeve)); var result = formatumId == (int)NyomtatvanyFormatumEnum.PDF ? GetPdfMemoryStream(ds, parameterek, nyomtatvanyNeve, filePath, egyediLablecKellOldalszam, dokumentumTipus) : GetWordMemoryStream(ds, parameterek, nyomtatvanyNeve, filePath, egyediLablecKellOldalszam, dokumentumTipus); return result; } else { if (asposeMetodus == null) { throw new ArgumentNullException(nameof(asposeMetodus)); } if (asposeHelperOptions == null) { throw new ArgumentNullException(nameof(asposeHelperOptions)); } var h = new AsposeHelper(ds, asposeHelperOptions); if (!string.IsNullOrWhiteSpace(frxNeve)) { var sablonPath = Url.Content("~/Resources/AsposeSablonok/" + frxNeve); sablonPath = System.Web.Hosting.HostingEnvironment.MapPath(sablonPath); return (MemoryStream)asposeMetodus.Invoke(h, new object[] { System.IO.File.OpenRead(sablonPath), formatumId }); } else { return (MemoryStream)asposeMetodus.Invoke(h, new object[] { null, formatumId }); } } } #region PDF generálás protected ActionResult PDFNyomtatas(DataSet ds, string frxNeve, Dictionary parameterek = null, string nyomtatvanyNeve = "Alap", bool iktatas = false, string iktatasAzonosito = "Iktatas", string headerImage = null, string footerImage = null, int? osztalyId = null, NameValueCollection kulcsSzavak = null, DokumentumKategoriaEnum? dokumentumKategoria = null, Enums.DokumentumTipusEnum? dokumentumTipus = null, FoszamDefinicioValueModel foszamDefinicio = null, bool egyediLablecKellOldalszam = true, Bitmap qrCode = null) { Config.WebMode = true; const string _fileTemplate = "{0}/{1}.frx"; var report = new Report(); var mapPath = string.Format(_fileTemplate, ApplicationData.NyomtatasiSablonokKonyvtar, frxNeve); report.Load(System.Web.Hosting.HostingEnvironment.MapPath(mapPath)); var (IsDokumentumFejlecMegjelenit, IsDokumentumLablecMegjelenit) = new NyomtatvanyokHelper(ConnectionTypeExtensions.GetSessionConnectionType()).GetActualIntezmenyAdatok(); var helper = new IntezmenyHelper(ConnectionTypeExtensions.GetSessionConnectionType()); if (!iktatas && !NyomtatvanyokLogic.IsEgyediFejlecLablecTiltott(dokumentumTipus)) { if (IsDokumentumFejlecMegjelenit && IsDokumentumLablecMegjelenit) { Image fejlecImage = helper.GetIntezmenyFejlecDokumentum(); Image lablecImage = helper.GetIntezmenyLablecDokumentum(); NyomtatvanyokLogic.EgyediFejlecLablec(report, fejlecImage, lablecImage, egyediLablecKellOldalszam); } if (IsDokumentumFejlecMegjelenit && !IsDokumentumLablecMegjelenit) { Image fejlecImage = helper.GetIntezmenyFejlecDokumentum(); NyomtatvanyokLogic.EgyediFejlec(report, fejlecImage); } if (IsDokumentumLablecMegjelenit && !IsDokumentumFejlecMegjelenit) { Image lablecImage = helper.GetIntezmenyLablecDokumentum(); NyomtatvanyokLogic.EgyediLablec(report, lablecImage, egyediLablecKellOldalszam); } } if (qrCode != null) { NyomtatvanyokLogic.AddQrCode(report, qrCode); } foreach (DataTable dt in ds.Tables) { report.RegisterData(dt, dt.TableName); } if (parameterek != null) { foreach (var parameter in parameterek) { report.SetParameterValue(parameter.Key, parameter.Value); } } if (report.Report.Prepare()) { FastReport.Export.Pdf.PDFExport pdfExport = new FastReport.Export.Pdf.PDFExport { ShowProgress = false, Subject = "Subject", Title = nyomtatvanyNeve, Compressed = true, AllowPrint = true, EmbeddingFonts = true, Creator = Constants.ImportExport.Creator }; var stream = new MemoryStream(); report.Report.Export(pdfExport, stream); report.Dispose(); pdfExport.Dispose(); stream.Position = 0; if (dokumentumTipus == Enums.DokumentumTipusEnum.MunkaidoElszamololapHonap) { stream = OldalszamHelyettesitesPdf(stream); } var result = File(stream, "application/pdf", $"{nyomtatvanyNeve}.{Constants.ImportExport.FileFormatPdf}"); if (iktatas) { if (!dokumentumKategoria.HasValue || !dokumentumTipus.HasValue) { throw new ApplicationException(ErrorResource.DokumentumIktatasKategoriaTipusSzukseges); } PoszeidonIktatas(result.FileStream, iktatasAzonosito, ClaimData.FelhasznaloId, dokumentumKategoria.Value, dokumentumTipus.Value, osztalyId, kulcsSzavak, foszamDefinicio); return RedirectToAction("Index", Constants.Controllers.IktatottDokumentumok, new { area = Constants.Areas.Nyomtatvanyok }); } return result; } return null; } protected MemoryStream GetPdfMemoryStreamByPath(DataSet ds, string filePath, Dictionary parameterek = null, string pdfNeve = "Alap", bool egyediLablecKellOldalszam = true, Enums.DokumentumTipusEnum? dokumentumTipus = null) { var result = GetPdfMemoryStream(ds, parameterek, pdfNeve, filePath, egyediLablecKellOldalszam, dokumentumTipus); return result; } private MemoryStream GetPdfMemoryStream(DataSet ds, Dictionary parameterek, string pdfNeve, string filePath, bool egyediLablecKellOldalszam, Enums.DokumentumTipusEnum? dokumentumTipus) { Config.WebMode = true; var report = new Report(); report.Load(filePath); var (IsDokumentumFejlecMegjelenit, IsDokumentumLablecMegjelenit) = new NyomtatvanyokHelper(ConnectionTypeExtensions.GetSessionConnectionType()).GetActualIntezmenyAdatok(); var helper = new IntezmenyHelper(ConnectionTypeExtensions.GetSessionConnectionType()); if (!NyomtatvanyokLogic.IsEgyediFejlecLablecTiltott(dokumentumTipus)) { if (IsDokumentumFejlecMegjelenit && IsDokumentumLablecMegjelenit) { Image fejlecImage = helper.GetIntezmenyFejlecDokumentum(); Image lablecImage = helper.GetIntezmenyLablecDokumentum(); NyomtatvanyokLogic.EgyediFejlecLablec(report, fejlecImage, lablecImage, egyediLablecKellOldalszam); } if (IsDokumentumFejlecMegjelenit && !IsDokumentumLablecMegjelenit) { Image fejlecImage = helper.GetIntezmenyFejlecDokumentum(); NyomtatvanyokLogic.EgyediFejlec(report, fejlecImage); } if (IsDokumentumLablecMegjelenit && !IsDokumentumFejlecMegjelenit) { Image lablecImage = helper.GetIntezmenyLablecDokumentum(); NyomtatvanyokLogic.EgyediLablec(report, lablecImage, egyediLablecKellOldalszam); } } foreach (DataTable dt in ds.Tables) { report.RegisterData(dt, dt.TableName); } if (parameterek != null) { foreach (var parameter in parameterek) { report.SetParameterValue(parameter.Key, parameter.Value); } } if (report.Report.Prepare()) { FastReport.Export.Pdf.PDFExport pdfExport = new FastReport.Export.Pdf.PDFExport { ShowProgress = false, Subject = "Subject", Title = pdfNeve, Compressed = true, AllowPrint = true, EmbeddingFonts = true }; var stream = new MemoryStream(); report.Report.Export(pdfExport, stream); report.Dispose(); pdfExport.Dispose(); stream.Position = 0; if (dokumentumTipus == Enums.DokumentumTipusEnum.MunkaidoElszamololapHonap) { stream = OldalszamHelyettesitesPdf(stream); } return stream; } return null; } private MemoryStream OldalszamHelyettesitesPdf(Stream ms) { ms.Position = 0; var ret = new MemoryStream(); Aspose.Pdf.Document doc = new Aspose.Pdf.Document(ms); var fragmentAbsober = new Aspose.Pdf.Text.TextFragmentAbsorber("{osszoldalszam\\d+}"); fragmentAbsober.TextSearchOptions.IsRegularExpressionUsed = true; doc.Pages.Accept(fragmentAbsober); var fragmentCollection = fragmentAbsober.TextFragments; var sumCounts = fragmentCollection.GroupBy(x => x.Text).Select(group => new { group.Key, Count = group.Count() }).ToList(); foreach (var text in fragmentCollection) { text.Text = sumCounts.Single(x => x.Key == text.Text).Count.ToString(); } doc.Save(ret); ms.Dispose(); ret.Position = 0; return ret; } #endregion #region Word generálás protected ActionResult WordNyomtatas(DataSet ds, string frxNeve, Dictionary parameterek = null, string wordNeve = "Alap", bool iktatas = false, string iktatasAzonosito = "Iktatas", int? osztalyId = null, DokumentumKategoriaEnum? dokumentumKategoria = null, Enums.DokumentumTipusEnum? dokumentumTipus = null, NameValueCollection kulcsSzavak = null, FoszamDefinicioValueModel foszamDefinicio = null, bool egyediLablecKellOldalszam = true, Bitmap qrCode = null) { Config.WebMode = true; const string _fileTemplate = "{0}/{1}.frx"; var report = new Report(); report.Load(Server.MapPath(string.Format(_fileTemplate, ApplicationData.NyomtatasiSablonokKonyvtar, frxNeve))); var (IsDokumentumFejlecMegjelenit, IsDokumentumLablecMegjelenit) = new NyomtatvanyokHelper(ConnectionTypeExtensions.GetSessionConnectionType()).GetActualIntezmenyAdatok(); var helper = new IntezmenyHelper(ConnectionTypeExtensions.GetSessionConnectionType()); if (!iktatas && !NyomtatvanyokLogic.IsEgyediFejlecLablecTiltott(dokumentumTipus)) { if (IsDokumentumFejlecMegjelenit && IsDokumentumLablecMegjelenit) { Image fejlecImage = helper.GetIntezmenyFejlecDokumentum(); Image lablecImage = helper.GetIntezmenyLablecDokumentum(); NyomtatvanyokLogic.EgyediFejlecLablec(report, fejlecImage, lablecImage, egyediLablecKellOldalszam); } if (IsDokumentumFejlecMegjelenit && !IsDokumentumLablecMegjelenit) { Image fejlecImage = helper.GetIntezmenyFejlecDokumentum(); NyomtatvanyokLogic.EgyediFejlec(report, fejlecImage); } if (IsDokumentumLablecMegjelenit && !IsDokumentumFejlecMegjelenit) { Image lablecImage = helper.GetIntezmenyLablecDokumentum(); NyomtatvanyokLogic.EgyediLablec(report, lablecImage, egyediLablecKellOldalszam); } } if (qrCode != null) { NyomtatvanyokLogic.AddQrCode(report, qrCode); } foreach (DataTable dt in ds.Tables) { report.RegisterData(dt, dt.TableName); } if (parameterek != null) { foreach (var parameter in parameterek) { report.SetParameterValue(parameter.Key, parameter.Value); } } if (report.Report.Prepare()) { FastReport.Export.RichText.RTFExport textExport = new FastReport.Export.RichText.RTFExport { ShowProgress = false, Creator = Constants.ImportExport.Creator }; var stream = new MemoryStream(); report.Report.Export(textExport, stream); report.Dispose(); textExport.Dispose(); stream.Position = 0; if (dokumentumTipus == Enums.DokumentumTipusEnum.MunkaidoElszamololapHonap) { stream = OldalszamHelyettesitesWord(stream); } var result = File(stream, "application/doc", $"{wordNeve}.{Constants.ImportExport.FileFormatWord}"); if (iktatas) { if (!dokumentumKategoria.HasValue || !dokumentumTipus.HasValue) { throw new ApplicationException(ErrorResource.DokumentumIktatasKategoriaTipusSzukseges); } PoszeidonIktatas(result.FileStream, iktatasAzonosito, ClaimData.FelhasznaloId, dokumentumKategoria: dokumentumKategoria.Value, dokumentumTipus: dokumentumTipus.Value, osztalyId: osztalyId, kulcsSzavak: kulcsSzavak, foszamDefinicio: foszamDefinicio, formatum: Kreta.Core.Constants.ContentTypes.Word); return RedirectToAction("Index", Constants.Controllers.IktatottDokumentumok, new { area = Constants.Areas.Nyomtatvanyok }); } return result; } return null; } private MemoryStream GetWordMemoryStream(DataSet ds, Dictionary parameterek, string wordNeve, string filePath, bool egyediLablecKellOldalszam, Enums.DokumentumTipusEnum? dokumentumTipus) { Config.WebMode = true; var report = new Report(); report.Load(filePath); var (IsDokumentumFejlecMegjelenit, IsDokumentumLablecMegjelenit) = new NyomtatvanyokHelper(ConnectionTypeExtensions.GetSessionConnectionType()).GetActualIntezmenyAdatok(); var helper = new IntezmenyHelper(ConnectionTypeExtensions.GetSessionConnectionType()); if (!NyomtatvanyokLogic.IsEgyediFejlecLablecTiltott(dokumentumTipus)) { if (IsDokumentumFejlecMegjelenit && IsDokumentumLablecMegjelenit) { Image fejlecImage = helper.GetIntezmenyFejlecDokumentum(); Image lablecImage = helper.GetIntezmenyLablecDokumentum(); NyomtatvanyokLogic.EgyediFejlecLablec(report, fejlecImage, lablecImage, egyediLablecKellOldalszam); } if (IsDokumentumFejlecMegjelenit && !IsDokumentumLablecMegjelenit) { Image fejlecImage = helper.GetIntezmenyFejlecDokumentum(); NyomtatvanyokLogic.EgyediFejlec(report, fejlecImage); } if (IsDokumentumLablecMegjelenit && !IsDokumentumFejlecMegjelenit) { Image lablecImage = helper.GetIntezmenyLablecDokumentum(); NyomtatvanyokLogic.EgyediLablec(report, lablecImage, egyediLablecKellOldalszam); } } foreach (DataTable dt in ds.Tables) { report.RegisterData(dt, dt.TableName); } if (parameterek != null) { foreach (var parameter in parameterek) { report.SetParameterValue(parameter.Key, parameter.Value); } } if (report.Report.Prepare()) { FastReport.Export.RichText.RTFExport textExport = new FastReport.Export.RichText.RTFExport { ShowProgress = false, Creator = Constants.ImportExport.Creator }; var stream = new MemoryStream(); report.Report.Export(textExport, stream); report.Dispose(); textExport.Dispose(); stream.Position = 0; if (dokumentumTipus == Enums.DokumentumTipusEnum.MunkaidoElszamololapHonap) { stream = OldalszamHelyettesitesWord(stream); } return stream; } return null; } private MemoryStream OldalszamHelyettesitesWord(Stream ms) { ms.Position = 0; var ret = new MemoryStream(); var loadOptions = new Aspose.Words.LoadOptions(); loadOptions.LoadFormat = Aspose.Words.LoadFormat.Doc; Aspose.Words.Document doc = new Aspose.Words.Document(ms, loadOptions); var runs = doc.GetChildNodes(Aspose.Words.NodeType.Run, true).Where(x => Regex.IsMatch(((Aspose.Words.Run)x).Text, "{osszoldalszam\\d+}")).Cast(); var toCount = runs.GroupBy(x => x.Text.Substring(x.Text.IndexOf("{osszoldalszam"), x.Text.IndexOf("}", x.Text.IndexOf("{osszoldalszam")) - x.Text.IndexOf("{osszoldalszam") + 1)).Select(group => new { group.Key, Count = group.Count() }).ToDictionary(group => group.Key, group => group.Count); foreach (var b in runs) { var key = toCount.Single(x => b.Text.Contains(x.Key)).Key; b.Text = b.Text.Replace(key, toCount[key].ToString()); } var saveFormat = Aspose.Words.SaveFormat.Doc; doc.Save(ret, saveFormat); ms.Dispose(); ret.Position = 0; return ret; } #endregion #region Excel generálás protected ActionResult ExcelNyomtatas(DataSet dataSet, string excelNeve = "Excel", bool iktatas = false, string iktatasAzonosito = "Iktatas", DokumentumKategoriaEnum? dokumentumKategoria = null, Enums.DokumentumTipusEnum? dokumentumTipus = null, int? osztalyId = null, NameValueCollection kulcsSzavak = null, FoszamDefinicioValueModel foszamDefinicio = null, List excelNumericTypeColumns = null, bool lastRowStyleLikeHeader = false, List sheetsWithoutLastRowStyleLikeHeader = null) { var memoryStream = GetExcelMemoryStream(dataSet, excelNumericTypeColumns, lastRowStyleLikeHeader, sheetsWithoutLastRowStyleLikeHeader); var result = File(memoryStream, Core.Constants.ContentTypes.Xlsx, $"{excelNeve}.xlsx"); if (iktatas) { if (!dokumentumKategoria.HasValue || !dokumentumTipus.HasValue) { throw new ApplicationException(ErrorResource.DokumentumIktatasKategoriaTipusSzukseges); } PoszeidonIktatas(result.FileStream, iktatasAzonosito, ClaimData.FelhasznaloId, dokumentumKategoria.Value, dokumentumTipus.Value, osztalyId: osztalyId, kulcsSzavak: kulcsSzavak, foszamDefinicio: foszamDefinicio, formatum: Core.Constants.ContentTypes.Xlsx); return RedirectToAction("Index", Constants.Controllers.IktatottDokumentumok, new { area = Constants.Areas.Nyomtatvanyok }); } return result; } public MemoryStream ExcelNyomtatasByMemoryStream( DataSet dataSet, bool iktatas, string iktatasAzonosito = null, DokumentumKategoriaEnum? dokumentumKategoria = null, Enums.DokumentumTipusEnum? dokumentumTipus = null, bool lastRowStyleLikeHeader = false, List sheetsWithoutLastRowStyleLikeHeader = null) { var memoryStream = GetExcelMemoryStream(dataSet, lastRowStyleLikeHeader: lastRowStyleLikeHeader, sheetsWithoutLastRowStyleLikeHeader: sheetsWithoutLastRowStyleLikeHeader); if (iktatas) { if (!dokumentumKategoria.HasValue || !dokumentumTipus.HasValue) { throw new ApplicationException(ErrorResource.DokumentumIktatasKategoriaTipusSzukseges); } PoszeidonIktatas(memoryStream, iktatasAzonosito, ClaimData.FelhasznaloId, dokumentumKategoria.Value, dokumentumTipus.Value); } return memoryStream; } private static MemoryStream GetExcelMemoryStream(DataSet dataSet, List excelNumericTypeColumns = null, bool lastRowStyleLikeHeader = false, List sheetsWithoutLastRowStyleLikeHeader = null) { if (dataSet.IsEmpty()) { throw new StatusError( HttpStatusCode.InternalServerError, CommonResource.Ures); } MemoryStream memoryStream; using (var workbook = new Workbook()) { var mappedSheetName = new Dictionary(); for (int dataTableIndex = 0; dataTableIndex < dataSet.Tables.Count; dataTableIndex++) { DataTable dataTable = dataSet.Tables[dataTableIndex]; //NOTE: Eltávolítjuk a nem meg felelő charaktereket a sheetName-ből // { '.', '?', '!', '*', '/', '[', ']', '\'', ':' }; string sheetName = new Regex(@"[!*,./:?[\\\]]").Replace(dataTable.TableName, string.Empty); if (string.IsNullOrWhiteSpace(sheetName)) { //NOTE: Ha nincs benne szöveg, akkor bele kell tenni, mert különben elszáll sheetName = "Kréta.NET export"; } //NOTE: Maximum 31 karakter hosszú lehet egy sheetName, ezért levágjuk, hogy max olyan hosszú legyen. sheetName = sheetName.Length > 31 ? sheetName.Substring(0, 31) : sheetName; mappedSheetName.Add(dataTableIndex, sheetName); } //NOTE: módosítjuk az egyező sheetName értékeket foreach (var item in mappedSheetName.GroupBy(x => x.Value).ToDictionary(t => t.Key, t => t.Select(r => r.Key)).Where(x => x.Value.Count() > 1).ToList()) { var egyezoFulekSzama = item.Value.Count(); for (int i = 1; i <= egyezoFulekSzama; i++) { var reNamedSheetName = $"{item.Key.Wrap(0, 31 - egyezoFulekSzama.ToString().Length - 1)}-{i}"; do { //NOTE: ellenőrizni kell a beállítandó sorszámot, hogy már létezik-e, mert csoportonként ismétlődhet a tartalom //és duplikáció miatt elhal a generálás int foundIndex = mappedSheetName.LastOrDefault(x => x.Value.Equals(reNamedSheetName)).Key; if (foundIndex != 0) { string actualIndex = reNamedSheetName.Remove(0, reNamedSheetName.LastIndexOf('-') + 1); int nextIndex = 0; Int32.TryParse(actualIndex, out nextIndex); nextIndex += 1; reNamedSheetName = $"{item.Key.Wrap(0, 31 - nextIndex.ToString().Length - 1)}-{nextIndex}"; } else { break; } } while (true); mappedSheetName[item.Value.ElementAt(i - 1)] = reNamedSheetName; } } for (int dataTableIndex = 0; dataTableIndex < dataSet.Tables.Count; dataTableIndex++) { DataTable dataTable = dataSet.Tables[dataTableIndex]; var sheetName = mappedSheetName[dataTableIndex]; Dictionary headerNameDictionary = new Dictionary(); int columnIndex = 0; foreach (DataColumn dataColumn in dataTable.Columns.Cast()) { headerNameDictionary.Add(columnIndex, dataColumn.ColumnName); columnIndex++; } List simpleExportColumnCos = SimpleExportLogic.GetSimpleExportColumnCos(headerNameDictionary); Worksheet worksheet = SimpleExportLogic.GetWorksheet(workbook, sheetName, simpleExportColumnCos, dataTableIndex); //NOTE: Van-e az adott táblán numerikus oszlop amit nem szövegként kell formázni. var numericTypeColumns = new List(); if (excelNumericTypeColumns.NotNullAndAny()) { //NOTE: Adott táblára. var numericTypeColumnsByTable = excelNumericTypeColumns.Where(c => c.TableIndex == dataTableIndex); if (numericTypeColumnsByTable.Any()) { numericTypeColumns.AddRange(numericTypeColumnsByTable.Select(c => c.ColumnIndex)); } else { //NOTE: Egészre worksheetre. var numericTypeColumnForAll = excelNumericTypeColumns.Where(c => c.IsForAll); if (numericTypeColumnForAll.Any()) { numericTypeColumns.AddRange(numericTypeColumnForAll.Select(c => c.ColumnIndex)); } } } int rowNumber = 1; foreach (DataRow dataRow in dataTable.AsEnumerable()) { for (int columnNumber = 0; columnNumber < headerNameDictionary.Count; columnNumber++) { //NOTE: Ahhoz, hogy az excel jól formázza a numerikus értékeket, olyan típussal kell átadni neki. var stringValue = SDAConvert.ToStringForExcelCell(dataRow[columnNumber]); if (numericTypeColumns.Contains(columnNumber)) { if (int.TryParse(stringValue, out int intValue)) { worksheet.Cells[rowNumber, columnNumber].Value = intValue; } else if (double.TryParse(stringValue, out double doubleValue)) { worksheet.Cells[rowNumber, columnNumber].Value = doubleValue; } else { worksheet.Cells[rowNumber, columnNumber].Value = stringValue; } } else { worksheet.Cells[rowNumber, columnNumber].Value = stringValue; } } if (lastRowStyleLikeHeader && (sheetsWithoutLastRowStyleLikeHeader == null || !sheetsWithoutLastRowStyleLikeHeader.Contains(dataTableIndex)) && dataRow == dataTable.AsEnumerable().Last()) { for (int columnNumber = 0; columnNumber < headerNameDictionary.Count; columnNumber++) { worksheet.Cells[rowNumber, columnNumber].SetStyle(worksheet.Cells[0, columnNumber].GetStyle()); } } rowNumber++; } } memoryStream = SimpleExportLogic.GetWorkbookMemoryStream(workbook); } return memoryStream; } private ActionResult ExcelNyomtatas(MemoryStream stream, string excelNeve, bool iktatas, string iktatasAzonosito, int? osztalyId = null, DokumentumKategoriaEnum? dokumentumKategoria = null, Enums.DokumentumTipusEnum? dokumentumTipus = null, NameValueCollection kulcsSzavak = null, FoszamDefinicioValueModel foszamDefinicio = null) { var result = File(stream, Core.Constants.ContentTypes.Xlsx, $"{excelNeve}.{GetNyomtatvanyFileFormat(NyomtatvanyFormatumEnum.Excel.AsInt())}"); if (iktatas) { if (!dokumentumKategoria.HasValue || !dokumentumTipus.HasValue) { throw new ApplicationException(ErrorResource.DokumentumIktatasKategoriaTipusSzukseges); } PoszeidonIktatas(result.FileStream, iktatasAzonosito, ClaimData.FelhasznaloId, dokumentumKategoria.Value, dokumentumTipus.Value, osztalyId: osztalyId, kulcsSzavak: kulcsSzavak, foszamDefinicio: foszamDefinicio, formatum: Core.Constants.ContentTypes.Xlsx); return RedirectToAction("Index", Constants.Controllers.IktatottDokumentumok, new { area = Constants.Areas.Nyomtatvanyok }); } return result; } #endregion #region Zip generálás #endregion #region Iktatás private (NameValueCollection kulcsSzavak, FoszamDefinicioValueModel foszamDefinicio) KulcsszavakEsFoszamGeneralas(NyomtatvanyModel model, Enums.DokumentumTipusEnum dokumentumTipus, DataSet ds, DokumentumElemiSzintEnum foszamDefinicioSzint) { if ((model.FoszamDefiniciok.Count < 1) || ((model.Kulcsszodefiniciok.Count < 1) && !IsNincsKulcsszoDefinicio(dokumentumTipus))) { throw new ApplicationException(ErrorResource.DokumentumIktatasKulcsszoFoszamDefinicioSzukseges); } KulcsszoHelper kulcsszoHelper = new KulcsszoHelper(ConnectionTypeExtensions.GetSessionConnectionType()); var kulcsSzavak = kulcsszoHelper.GetKulcsszavak(dokumentumTipus, model.Kulcsszodefiniciok, ds); var foszamDefinicio = model.FoszamDefiniciok.FirstOrDefault(x => x.Szint == foszamDefinicioSzint); var foszamDefinicioErtekek = kulcsszoHelper.FillFoszamDefinicioErtekek(kulcsSzavak, foszamDefinicio); return (kulcsSzavak, foszamDefinicio: foszamDefinicioErtekek); } private bool IsNincsKulcsszoDefinicio(Enums.DokumentumTipusEnum dokumentumTipus) { switch (dokumentumTipus) { case Enums.DokumentumTipusEnum.TantargyfelosztasFormazottExcel: case Enums.DokumentumTipusEnum.TantargyfelosztasFormazottPDF: case Enums.DokumentumTipusEnum.TantargyfelosztasKiegeszitettAdatok: case Enums.DokumentumTipusEnum.OsztalyokSzamaRiport: case Enums.DokumentumTipusEnum.CsoportokSzamaRiport: case Enums.DokumentumTipusEnum.FeladatellatasiHelyekRiport: case Enums.DokumentumTipusEnum.TanulokMegoszlasaEvfolyamokEsAgazatokSzerint: case Enums.DokumentumTipusEnum.ElfogadottTantargyfelosztasFormazottExcel: case Enums.DokumentumTipusEnum.ElfogadottTantargyfelosztasFormazottPDF: case Enums.DokumentumTipusEnum.ReszletesAlkalmazottAdatok: case Enums.DokumentumTipusEnum.ReszletesTanuloiAdatok: return true; default: return false; } } private void PoszeidonIktatas(Stream stream, string dokumentumNeve, int iktatoID, DokumentumKategoriaEnum dokumentumKategoria, Enums.DokumentumTipusEnum dokumentumTipus, int? osztalyId = null, NameValueCollection kulcsSzavak = null, FoszamDefinicioValueModel foszamDefinicio = null, string formatum = Core.Constants.ContentTypes.Pdf) { if (string.IsNullOrWhiteSpace(dokumentumNeve)) { throw new BusinessLogic.Exceptions.PosszeidonIktatasException(); } var helper = new PoszeidonHelper(ConnectionTypeExtensions.GetSessionConnectionType(), IktatoRepositoryFactory, IktatoServiceConfiguration); helper.Iktatas(stream, dokumentumNeve, iktatoID, dokumentumKategoria, dokumentumTipus, osztalyId, kulcsSzavak, foszamDefinicio, formatum); } #endregion } }