Try your search with a different keyword or use * as a wildcard.
using System.Drawing;
using ClosedXML.Excel;
using Microsoft.AspNetCore.Mvc.Rendering;
using Nop.Core.Domain.Catalog;
using Nop.Core.Domain.Localization;
namespace Nop.Services.ExportImport.Help;
/// 
/// Class for working with PropertyByName object list
///  
/// Object type 
/// Language 
public partial class PropertyManager where L : Language
{
    /// 
    /// Default properties
    ///  
    protected readonly Dictionary> _defaultProperties;
    /// 
    /// Localized properties
    ///  
    protected readonly Dictionary> _localizedProperties;
    /// 
    /// Catalog settings
    ///  
    protected readonly CatalogSettings _catalogSettings;
    /// 
    /// Languages
    ///  
    protected readonly IList _languages;
    /// 
    /// Ctor
    ///  
    /// Default access properties
    /// Catalog settings
    /// Localized access properties
    /// Languages
    public PropertyManager(IEnumerable> defaultProperties, CatalogSettings catalogSettings, IEnumerable> localizedProperties = null, IList languages = null)
    {
        _defaultProperties = new Dictionary>();
        _catalogSettings = catalogSettings;
        _localizedProperties = new Dictionary>();
        _languages = new List();
        if (languages != null)
            _languages = languages;
        var poz = 1;
        foreach (var propertyByName in defaultProperties.Where(p => !p.Ignore))
        {
            propertyByName.PropertyOrderPosition = poz;
            poz++;
            _defaultProperties.Add(propertyByName.PropertyName, propertyByName);
        }
        if (_languages.Count >= 2 && localizedProperties != null)
        {
            var lpoz = 1;
            foreach (var propertyByName in localizedProperties.Where(p => !p.Ignore))
            {
                propertyByName.PropertyOrderPosition = lpoz;
                lpoz++;
                _localizedProperties.Add(propertyByName.PropertyName, propertyByName);
            }
        }
    }
    /// 
    /// Export objects to XLSX
    ///  
    /// Type of object 
    /// The objects to export
    /// 
    /// A task that represents the asynchronous operation
    /// The task result contains the 
    ///  
    public virtual async Task ExportToXlsxAsync(IEnumerable itemsToExport)
    {
        await using var stream = new MemoryStream();
        // ok, we can run the real code of the sample now
        using (var workbook = new XLWorkbook())
        {
            // uncomment this line if you want the XML written out to the outputDir
            //xlPackage.DebugMode = true; 
            // get handles to the worksheets
            var worksheet = workbook.Worksheets.Add(typeof(T).Name);
            var fWorksheet = workbook.Worksheets.Add("DataForFilters");
            fWorksheet.Visibility = XLWorksheetVisibility.VeryHidden;
            //create Headers and format them 
            WriteDefaultCaption(worksheet);
            var lwss = new Dictionary();
            if (_languages.Count >= 2)
            {
                foreach (var language in _languages)
                {
                    var lws = workbook.Worksheets.Add(language.UniqueSeoCode);
                    lwss.Add(language, lws);
                    WriteLocalizedCaption(lws);
                }
            }
            var row = 2;
            foreach (var items in itemsToExport)
            {
                CurrentObject = items;
                await WriteDefaultToXlsxAsync(worksheet, row, fWorksheet: fWorksheet);
                foreach (var lws in lwss)
                {
                    CurrentLanguage = lws.Key;
                    await WriteLocalizedToXlsxAsync(lws.Value, row, fWorksheet: fWorksheet);
                }
                row++;
            }
            workbook.SaveAs(stream);
        }
        CurrentObject = default;
        return stream.ToArray();
    }
    /// 
    /// Current object to access
    ///  
    public T CurrentObject { get; set; }
    /// 
    /// Current language to access
    ///  
    public L CurrentLanguage { get; set; }
    /// 
    /// Return property index
    ///  
    /// Property name
    /// 
    /// Remove object by property name
    ///  
    /// Property name
    public void Remove(string propertyName)
    {
        _defaultProperties.Remove(propertyName);
    }
    /// 
    /// Write default object data to XLSX worksheet
    ///  
    /// Data worksheet
    /// Row index
    /// Cell offset
    /// Filters worksheet
    /// A task that represents the asynchronous operation 
    public virtual async Task WriteDefaultToXlsxAsync(IXLWorksheet worksheet, int row, int cellOffset = 0, IXLWorksheet fWorksheet = null)
    {
        if (CurrentObject == null)
            return;
        var xlRrow = worksheet.Row(row);
        xlRrow.Style.Alignment.WrapText = false;
        foreach (var prop in _defaultProperties.Values)
        {
            var cell = xlRrow.Cell(prop.PropertyOrderPosition + cellOffset);
            if (prop.IsDropDownCell && _catalogSettings.ExportImportRelatedEntitiesByName)
            {
                var dropDownElements = prop.GetDropDownElements();
                if (!dropDownElements.Any())
                {
                    cell.Value = string.Empty;
                    continue;
                }
                cell.Value = prop.GetItemText(await prop.GetProperty(CurrentObject, CurrentLanguage));
                if (!UseDropdownLists)
                    continue;
                var validator = cell.GetDataValidation();
                validator.InCellDropdown = true;
                validator.IgnoreBlanks = prop.AllowBlank;
                if (fWorksheet == null)
                    continue;
                var fRow = 1;
                foreach (var dropDownElement in dropDownElements)
                {
                    var fCell = fWorksheet.Row(fRow++).Cell(prop.PropertyOrderPosition);
                    if (!fCell.IsEmpty() && fCell.Value.ToString() == dropDownElement)
                        break;
                    fCell.Value = dropDownElement;
                }
                validator.List(fWorksheet.Range(1, prop.PropertyOrderPosition, dropDownElements.Length, prop.PropertyOrderPosition), true);
            }
            else
            {
                var value = await prop.GetProperty(CurrentObject, CurrentLanguage);
                cell.SetValue((XLCellValue)value?.ToString());
            }
            cell.Style.Alignment.WrapText = false;
        }
    }
    /// 
    /// Write localized data to XLSX worksheet
    ///  
    /// Data worksheet
    /// Row index
    /// Cell offset
    /// Filters worksheet
    /// A task that represents the asynchronous operation 
    public virtual async Task WriteLocalizedToXlsxAsync(IXLWorksheet worksheet, int row, int cellOffset = 0, IXLWorksheet fWorksheet = null)
    {
        if (CurrentObject == null)
            return;
        var xlRrow = worksheet.Row(row);
        xlRrow.Style.Alignment.WrapText = false;
        foreach (var prop in _localizedProperties.Values)
        {
            var cell = xlRrow.Cell(prop.PropertyOrderPosition + cellOffset);
            if (prop.IsDropDownCell && _catalogSettings.ExportImportRelatedEntitiesByName)
            {
                var dropDownElements = prop.GetDropDownElements();
                if (!dropDownElements.Any())
                {
                    cell.Value = string.Empty;
                    continue;
                }
                cell.Value = prop.GetItemText(await prop.GetProperty(CurrentObject, CurrentLanguage));
                if (!UseDropdownLists)
                    continue;
                var validator = cell.GetDataValidation();
                validator.InCellDropdown = true;
                validator.IgnoreBlanks = prop.AllowBlank;
                if (fWorksheet == null)
                    continue;
                var fRow = 1;
                foreach (var dropDownElement in dropDownElements)
                {
                    var fCell = fWorksheet.Row(fRow++).Cell(prop.PropertyOrderPosition);
                    if (!fCell.IsEmpty() && fCell.Value.ToString() == dropDownElement)
                        break;
                    fCell.Value = dropDownElement;
                }
                validator.List(fWorksheet.Range(1, prop.PropertyOrderPosition, dropDownElements.Length, prop.PropertyOrderPosition), true);
            }
            else
            {
                var value = await prop.GetProperty(CurrentObject, CurrentLanguage);
                cell.SetValue((XLCellValue)value?.ToString());
            }
            cell.Style.Alignment.WrapText = false;
        }
    }
    /// 
    /// Read object data from default XLSX worksheet
    ///  
    /// worksheet
    /// Row index
    /// /// Cell offset
    public virtual void ReadDefaultFromXlsx(IXLWorksheet worksheet, int row, int cellOffset = 0)
    {
        if (worksheet?.Cells() == null)
            return;
        foreach (var prop in _defaultProperties.Values)
        {
            prop.PropertyValue = worksheet.Row(row).Cell(prop.PropertyOrderPosition + cellOffset).Value;
        }
    }
    /// 
    /// Read object data from localized XLSX worksheet
    ///  
    /// worksheet
    /// Row index
    /// /// Cell offset
    public virtual void ReadLocalizedFromXlsx(IXLWorksheet worksheet, int row, int cellOffset = 0)
    {
        if (worksheet?.Cells() == null)
            return;
        foreach (var prop in _localizedProperties.Values)
        {
            prop.PropertyValue = worksheet.Row(row).Cell(prop.PropertyOrderPosition + cellOffset).Value;
        }
    }
    /// 
    /// Write caption (first row) to default XLSX worksheet
    ///  
    /// worksheet
    /// Row number
    /// Cell offset
    public virtual void WriteDefaultCaption(IXLWorksheet worksheet, int row = 1, int cellOffset = 0)
    {
        foreach (var caption in _defaultProperties.Values)
        {
            var cell = worksheet.Row(row).Cell(caption.PropertyOrderPosition + cellOffset);
            cell.Value = caption.ToString();
            SetCaptionStyle(cell);
        }
    }
    /// 
    /// Write caption (first row) to localized XLSX worksheet
    ///  
    /// worksheet
    /// Row number
    /// Cell offset
    public virtual void WriteLocalizedCaption(IXLWorksheet worksheet, int row = 1, int cellOffset = 0)
    {
        foreach (var caption in _localizedProperties.Values)
        {
            var cell = worksheet.Row(row).Cell(caption.PropertyOrderPosition + cellOffset);
            cell.Value = caption.ToString();
            SetCaptionStyle(cell);
        }
    }
    /// 
    /// Set caption style to excel cell
    ///  
    /// Excel cell
    public void SetCaptionStyle(IXLCell cell)
    {
        cell.Style.Fill.PatternType = XLFillPatternValues.Solid;
        cell.Style.Fill.BackgroundColor = XLColor.FromColor(Color.FromArgb(184, 204, 228));
        cell.Style.Font.Bold = true;
    }
    /// 
    /// Count of default properties
    ///  
    public int Count => _defaultProperties.Count;
    /// 
    /// Get default property by name
    ///  
    /// 
    ///  GetDefaultProperty(string propertyName)
    {
        return _defaultProperties.TryGetValue(propertyName, out var value) ? value : null;
    }
    /// 
    /// Get localized property by name
    ///  
    /// 
    ///  GetLocalizedProperty(string propertyName)
    {
        return _localizedProperties.TryGetValue(propertyName, out var value) ? value : null;
    }
    /// 
    /// Get default property array
    ///  
    public PropertyByName[] GetDefaultProperties => _defaultProperties.Values.ToArray();
    /// 
    /// Get localized property array
    ///  
    public PropertyByName[] GetLocalizedProperties => _localizedProperties.Values.ToArray();
    /// 
    /// Set SelectList
    ///  
    /// Property name
    /// SelectList
    public void SetSelectList(string propertyName, SelectList list)
    {
        var tempProperty = GetDefaultProperty(propertyName);
        if (tempProperty != null)
            tempProperty.DropDownElements = list;
    }
    /// 
    /// Is caption
    ///  
    public bool IsCaption => _defaultProperties.Values.All(p => p.IsCaption);
    /// 
    /// Gets a value indicating whether need create dropdown list for export
    ///  
    public bool UseDropdownLists => _catalogSettings.ExportImportUseDropdownlistsForAssociatedEntities && _catalogSettings.ExportImportRelatedEntitiesByName;
}