using ClosedXML.Excel;
using Exferia_Aplicacion.Modelos_Excel;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
using System.Windows.Forms;
using static Exferia_Aplicacion.General.Enumerados;

namespace Exferia_Aplicacion.General
{
    public class Funciones_FicherosExcel
    {

        public static void Generar_DocumentoListado_Excel(List<INTERNO_ExportarExcel_Hoja_Modelo> _lst_INTERNO_ExportarExcel_Hoja_Modelo, string _str_Ruta_FicheroExcel)
        {
            XLWorkbook obj_XLWorkbook = new XLWorkbook();

            try
            {

                foreach (INTERNO_ExportarExcel_Hoja_Modelo mdl_INTERNO_ExportarExcel_Hoja_Modelo in _lst_INTERNO_ExportarExcel_Hoja_Modelo)
                {
                    //Crea la Hoja del Excel ........................................................................
                    string str_HojaDescripcion = mdl_INTERNO_ExportarExcel_Hoja_Modelo.Hoja_Descripcion;
                    if (str_HojaDescripcion.Length>30)
                    {
                        str_HojaDescripcion = str_HojaDescripcion.Substring(0, 30);
                    }

                    //Quitar expreciones regulares ya que dan problemas en los nombre de XML
                    str_HojaDescripcion = Regex.Replace(str_HojaDescripcion, "[^0-9A-Za-z]", "", RegexOptions.None);

                    var obj_worksheet = obj_XLWorkbook.Worksheets.Add(str_HojaDescripcion);

                    int int_Contador_Fila = 2;
                    int int_Contador_ColumnaInicial = 1;

                    //Datos Iniciales ...............................................................................
                    if (mdl_INTERNO_ExportarExcel_Hoja_Modelo.Filas_Titulo!=null && mdl_INTERNO_ExportarExcel_Hoja_Modelo.Filas_Titulo.Count>0)
                    {
                        int int_Columna_Titulo = int_Contador_ColumnaInicial;

                        //Filas
                        foreach (INTERNO_ExportarExcel_Filas_Titulo_Modelo mdl_INTERNO_ExportarExcel_Filas_Titulo_Modelo in mdl_INTERNO_ExportarExcel_Hoja_Modelo.Filas_Titulo)
                        {
                            //Celdas
                            if (mdl_INTERNO_ExportarExcel_Filas_Titulo_Modelo.Celdas!=null && mdl_INTERNO_ExportarExcel_Filas_Titulo_Modelo.Celdas.Count>0)
                            {
                                foreach (INTERNO_ExportarExcel_Titulo_Modelo mdl_INTERNO_ExportarExcel_Titulo_Modelo in mdl_INTERNO_ExportarExcel_Filas_Titulo_Modelo.Celdas)
                                {
                                    obj_worksheet.Cell(int_Contador_Fila, int_Columna_Titulo).Value = mdl_INTERNO_ExportarExcel_Titulo_Modelo.Texto;

                                    //Unir Varias Columnas
                                    if (mdl_INTERNO_ExportarExcel_Titulo_Modelo.Cantidad_Columnas_A_Unir>0)
                                    {
                                        obj_worksheet.Range(int_Contador_Fila, int_Columna_Titulo, int_Contador_Fila, (int_Columna_Titulo + mdl_INTERNO_ExportarExcel_Titulo_Modelo.Cantidad_Columnas_A_Unir)).Merge();
                                    }
                                    
                                    //Sumar una columna o las que se unieron
                                    int_Columna_Titulo += (mdl_INTERNO_ExportarExcel_Titulo_Modelo.Cantidad_Columnas_A_Unir>0? (mdl_INTERNO_ExportarExcel_Titulo_Modelo.Cantidad_Columnas_A_Unir + 1) :  1); 
                                }
                            }

                            int_Columna_Titulo = int_Contador_ColumnaInicial;

                            //Sumar una fila
                            int_Contador_Fila += 1;
                        }

                        //Sumar una fila
                        int_Contador_Fila += 1;
                    }

                    //Crear Cabeceras ...............................................................................
                    int int_Contador = int_Contador_ColumnaInicial;
                    foreach (INTERNO_ExportarExcel_Cabecera_Modelo mdl_INTERNO_ExportarExcel_Cabecera_Modelo in mdl_INTERNO_ExportarExcel_Hoja_Modelo.Cabecera)
                    {
                        obj_worksheet.Cell(int_Contador_Fila, int_Contador).Value = mdl_INTERNO_ExportarExcel_Cabecera_Modelo.Cabecera_Descripcion;

                        //Formato de color al texto y al fondo
                        obj_worksheet.Cell(int_Contador_Fila, int_Contador).Style.Fill.BackgroundColor = XLColor.FromHtml(Funciones.Convertir_Color_Hexadecimal(mdl_INTERNO_ExportarExcel_Cabecera_Modelo.Cabecera_Color_Fondo));
                        obj_worksheet.Cell(int_Contador_Fila, int_Contador).Style.Font.FontColor = XLColor.FromHtml(Funciones.Convertir_Color_Hexadecimal(mdl_INTERNO_ExportarExcel_Cabecera_Modelo.Cabecera_Color_Letra));

                        //Borde
                        obj_worksheet.Cell(int_Contador_Fila, int_Contador).Style.Border.BottomBorder = XLBorderStyleValues.Thin;
                        obj_worksheet.Cell(int_Contador_Fila, int_Contador).Style.Border.BottomBorderColor = XLColor.Black;
                        obj_worksheet.Cell(int_Contador_Fila, int_Contador).Style.Border.TopBorder = XLBorderStyleValues.Thin;
                        obj_worksheet.Cell(int_Contador_Fila, int_Contador).Style.Border.TopBorderColor = XLColor.Black;
                        obj_worksheet.Cell(int_Contador_Fila, int_Contador).Style.Border.LeftBorder = XLBorderStyleValues.Thin;
                        obj_worksheet.Cell(int_Contador_Fila, int_Contador).Style.Border.LeftBorderColor = XLColor.Black;
                        obj_worksheet.Cell(int_Contador_Fila, int_Contador).Style.Border.RightBorder = XLBorderStyleValues.Thin;
                        obj_worksheet.Cell(int_Contador_Fila, int_Contador).Style.Border.RightBorderColor = XLColor.Black;

                        int_Contador++;
                    }

                    //AutoAjustar Columnasss
                    obj_worksheet.Columns("A:Z").AdjustToContents();

                    //Lineas
                    int int_Contador_Columna = int_Contador_ColumnaInicial;
                    if (mdl_INTERNO_ExportarExcel_Hoja_Modelo.Filas != null)
                    {
                        //Recorrer las Filas
                        foreach (INTERNO_ExportarExcel_Filas_Modelo mdl_INTERNO_ExportarExcel_Filas_Modelo in mdl_INTERNO_ExportarExcel_Hoja_Modelo.Filas)
                        {
                            //Recorrer Columnas Visibles
                            foreach (INTERNO_ExportarExcel_Celdas_Modelo mdl_INTERNO_ExportarExcel_Celdas_Modelo in mdl_INTERNO_ExportarExcel_Filas_Modelo.Celdas)
                            {
                                //Tipo fecha
                                if (mdl_INTERNO_ExportarExcel_Celdas_Modelo.Dato_Tipo.Equals(G_ENUM_TIPOSDATOS.DATETIME))
                                {
                                    if (mdl_INTERNO_ExportarExcel_Celdas_Modelo.Dato != null)
                                    {
                                        obj_worksheet.Cell(int_Contador_Fila + 1, int_Contador_Columna).SetValue(mdl_INTERNO_ExportarExcel_Celdas_Modelo.Dato);
                                    }
                                    else
                                    {
                                        obj_worksheet.Cell(int_Contador_Fila + 1, int_Contador_Columna).Value = "";
                                    }

                                    obj_worksheet.Cell(int_Contador_Fila + 1, int_Contador_Columna).Style.NumberFormat.Format = "dd/mm/yyyy";
                                }
                                //Tipo Hora Simple
                                else if (mdl_INTERNO_ExportarExcel_Celdas_Modelo.Dato_Tipo.Equals(G_ENUM_TIPOSDATOS.HORASIMPLE))
                                {
                                    if (mdl_INTERNO_ExportarExcel_Celdas_Modelo.Dato != null)
                                    {
                                        obj_worksheet.Cell(int_Contador_Fila + 1, int_Contador_Columna).SetValue(mdl_INTERNO_ExportarExcel_Celdas_Modelo.Dato);
                                    }
                                    else
                                    {
                                        obj_worksheet.Cell(int_Contador_Fila + 1, int_Contador_Columna).SetValue(new TimeSpan(0, 0, 0));
                                    }

                                    obj_worksheet.Cell(int_Contador_Fila + 1, int_Contador_Columna).Style.NumberFormat.Format = "[hh]:mm;@";
                                }
                                //Tipo Hora Completa
                                else if (mdl_INTERNO_ExportarExcel_Celdas_Modelo.Dato_Tipo.Equals(G_ENUM_TIPOSDATOS.HORACOMPLETA))
                                {
                                    if (mdl_INTERNO_ExportarExcel_Celdas_Modelo.Dato != null)
                                    {
                                        obj_worksheet.Cell(int_Contador_Fila + 1, int_Contador_Columna).SetValue(mdl_INTERNO_ExportarExcel_Celdas_Modelo.Dato);
                                    }
                                    else
                                    {
                                        obj_worksheet.Cell(int_Contador_Fila + 1, int_Contador_Columna).SetValue(new TimeSpan(0, 0, 0));
                                    }

                                    obj_worksheet.Cell(int_Contador_Fila + 1, int_Contador_Columna).Style.NumberFormat.Format = "[hh]:mm:ss;@";
                                }
                                //Tipo booleano
                                else if (mdl_INTERNO_ExportarExcel_Celdas_Modelo.Dato_Tipo.Equals(G_ENUM_TIPOSDATOS.BOOLEAN))
                                {
                                    string str_valor = (mdl_INTERNO_ExportarExcel_Celdas_Modelo.Dato != null && mdl_INTERNO_ExportarExcel_Celdas_Modelo.Dato) ? "X" : "";

                                    obj_worksheet.Cell(int_Contador_Fila + 1, int_Contador_Columna).SetValue(str_valor).SetDataType(XLCellValues.Text);

                                    // Alinear al centro
                                    obj_worksheet.Cell(int_Contador_Fila + 1, int_Contador_Columna).Style.Alignment.Horizontal = XLAlignmentHorizontalValues.Center;
                                }
                                //Tipo decimal
                                else if (mdl_INTERNO_ExportarExcel_Celdas_Modelo.Dato_Tipo.Equals(G_ENUM_TIPOSDATOS.DECIMAL))
                                {

                                    if (mdl_INTERNO_ExportarExcel_Celdas_Modelo.Dato != null)
                                    {
                                        obj_worksheet.Cell(int_Contador_Fila + 1, int_Contador_Columna).SetValue(mdl_INTERNO_ExportarExcel_Celdas_Modelo.Dato);
                                    }
                                    else
                                    {
                                        obj_worksheet.Cell(int_Contador_Fila + 1, int_Contador_Columna).SetValue(0.00m);
                                    }

                                    //Alinear los numeros a la derecha
                                    obj_worksheet.Cell(int_Contador_Fila + 1, int_Contador_Columna).Style.Alignment.Horizontal = XLAlignmentHorizontalValues.Right;
                                }
                                //Tipo int
                                else if (mdl_INTERNO_ExportarExcel_Celdas_Modelo.Dato_Tipo.Equals(G_ENUM_TIPOSDATOS.INT))
                                {
                                    if (mdl_INTERNO_ExportarExcel_Celdas_Modelo.Dato != null)
                                    {
                                        obj_worksheet.Cell(int_Contador_Fila + 1, int_Contador_Columna).SetValue(mdl_INTERNO_ExportarExcel_Celdas_Modelo.Dato);
                                    }
                                    else
                                    {
                                        obj_worksheet.Cell(int_Contador_Fila + 1, int_Contador_Columna).Value = "";
                                    }

                                    //Alinear los numeros a la derecha
                                    obj_worksheet.Cell(int_Contador_Fila + 1, int_Contador_Columna).Style.Alignment.Horizontal = XLAlignmentHorizontalValues.Right;
                                }
                                //Tipo long
                                else if (mdl_INTERNO_ExportarExcel_Celdas_Modelo.Dato_Tipo.Equals(G_ENUM_TIPOSDATOS.LONG))
                                {
                                    if (mdl_INTERNO_ExportarExcel_Celdas_Modelo.Dato != null)
                                    {
                                        obj_worksheet.Cell(int_Contador_Fila + 1, int_Contador_Columna).SetValue(mdl_INTERNO_ExportarExcel_Celdas_Modelo.Dato);
                                    }
                                    else
                                    {
                                        obj_worksheet.Cell(int_Contador_Fila + 1, int_Contador_Columna).Value = "";
                                    }

                                    //Alinear los numeros a la derecha
                                    obj_worksheet.Cell(int_Contador_Fila + 1, int_Contador_Columna).Style.Alignment.Horizontal = XLAlignmentHorizontalValues.Right;
                                }
                                //Tipo long_TExt
                                else if (mdl_INTERNO_ExportarExcel_Celdas_Modelo.Dato_Tipo.Equals(G_ENUM_TIPOSDATOS.LONG_TEXT))
                                {
                                    if (mdl_INTERNO_ExportarExcel_Celdas_Modelo.Dato != null)
                                    {
                                        obj_worksheet.Cell(int_Contador_Fila + 1, int_Contador_Columna).SetValue(mdl_INTERNO_ExportarExcel_Celdas_Modelo.Dato);
                                    }
                                    else
                                    {
                                        obj_worksheet.Cell(int_Contador_Fila + 1, int_Contador_Columna).Value = "";
                                    }

                                    //Alinear los numeros a la derecha
                                    obj_worksheet.Cell(int_Contador_Fila + 1, int_Contador_Columna).Style.Alignment.Horizontal = XLAlignmentHorizontalValues.Right;
                                }
                                //Tipo texto
                                else
                                {
                                    string str_valor = mdl_INTERNO_ExportarExcel_Celdas_Modelo.Dato != null ? mdl_INTERNO_ExportarExcel_Celdas_Modelo.Dato : "";

                                    obj_worksheet.Cell(int_Contador_Fila + 1, int_Contador_Columna).SetValue(str_valor).SetDataType(XLCellValues.Text);

                                    //Alinear los texto a la derecha
                                    obj_worksheet.Cell(int_Contador_Fila + 1, int_Contador_Columna).Style.Alignment.Horizontal = XLAlignmentHorizontalValues.Left;
                                }

                                //Colores
                                obj_worksheet.Cell(int_Contador_Fila + 1, int_Contador_Columna).Style.Font.FontColor = XLColor.FromHtml(Funciones.Convertir_Color_Hexadecimal(mdl_INTERNO_ExportarExcel_Celdas_Modelo.Dato_Color_Letra));
                                obj_worksheet.Cell(int_Contador_Fila + 1, int_Contador_Columna).Style.Fill.BackgroundColor = XLColor.FromHtml(Funciones.Convertir_Color_Hexadecimal(mdl_INTERNO_ExportarExcel_Celdas_Modelo.Dato_Color_Fondo));


                                //Borde
                                obj_worksheet.Cell(int_Contador_Fila + 1, int_Contador_Columna).Style.Border.BottomBorder = XLBorderStyleValues.Thin;
                                obj_worksheet.Cell(int_Contador_Fila + 1, int_Contador_Columna).Style.Border.BottomBorderColor = XLColor.Black;
                                obj_worksheet.Cell(int_Contador_Fila + 1, int_Contador_Columna).Style.Border.TopBorder = XLBorderStyleValues.Thin;
                                obj_worksheet.Cell(int_Contador_Fila + 1, int_Contador_Columna).Style.Border.TopBorderColor = XLColor.Black;
                                obj_worksheet.Cell(int_Contador_Fila + 1, int_Contador_Columna).Style.Border.LeftBorder = XLBorderStyleValues.Thin;
                                obj_worksheet.Cell(int_Contador_Fila + 1, int_Contador_Columna).Style.Border.LeftBorderColor = XLColor.Black;
                                obj_worksheet.Cell(int_Contador_Fila + 1, int_Contador_Columna).Style.Border.RightBorder = XLBorderStyleValues.Thin;
                                obj_worksheet.Cell(int_Contador_Fila + 1, int_Contador_Columna).Style.Border.RightBorderColor = XLColor.Black;

                                //Sumo 1 a la columna
                                int_Contador_Columna += 1;
                            }

                            //Sumo 1 a la fila
                            int_Contador_Fila += 1;

                            //las Columnas se reinicia
                            int_Contador_Columna = int_Contador_ColumnaInicial;
                        }
                    }


                    //Totales  ...............................................................................
                    if (mdl_INTERNO_ExportarExcel_Hoja_Modelo.Total!=null)
                    {
                        //Sumo 1 a la fila
                        int_Contador_Fila += 1;

                        int int_Contador_Total = int_Contador_ColumnaInicial;
                        foreach (INTERNO_ExportarExcel_Celdas_Modelo mdl_INTERNO_ExportarExcel_Celdas_Modelo_TOTAL in mdl_INTERNO_ExportarExcel_Hoja_Modelo.Total.Celdas)
                        {
                            obj_worksheet.Cell(int_Contador_Fila, int_Contador_Total).Value = (mdl_INTERNO_ExportarExcel_Celdas_Modelo_TOTAL.Dato!=null ? mdl_INTERNO_ExportarExcel_Celdas_Modelo_TOTAL.Dato : "");

                            //Formato de color al texto y al fondo
                            if (mdl_INTERNO_ExportarExcel_Celdas_Modelo_TOTAL.Dato != null)
                            {
                                obj_worksheet.Cell(int_Contador_Fila, int_Contador_Total).Style.Fill.BackgroundColor = XLColor.FromHtml(Funciones.Convertir_Color_Hexadecimal(mdl_INTERNO_ExportarExcel_Hoja_Modelo.Total.Color_Fondo));
                                obj_worksheet.Cell(int_Contador_Fila, int_Contador_Total).Style.Font.FontColor = XLColor.FromHtml(Funciones.Convertir_Color_Hexadecimal(mdl_INTERNO_ExportarExcel_Hoja_Modelo.Total.Color_Letra));

                                //Borde
                                obj_worksheet.Cell(int_Contador_Fila, int_Contador_Total).Style.Border.BottomBorder = XLBorderStyleValues.Thin;
                                obj_worksheet.Cell(int_Contador_Fila, int_Contador_Total).Style.Border.BottomBorderColor = XLColor.Black;
                                obj_worksheet.Cell(int_Contador_Fila, int_Contador_Total).Style.Border.TopBorder = XLBorderStyleValues.Thin;
                                obj_worksheet.Cell(int_Contador_Fila, int_Contador_Total).Style.Border.TopBorderColor = XLColor.Black;
                                obj_worksheet.Cell(int_Contador_Fila, int_Contador_Total).Style.Border.LeftBorder = XLBorderStyleValues.Thin;
                                obj_worksheet.Cell(int_Contador_Fila, int_Contador_Total).Style.Border.LeftBorderColor = XLColor.Black;
                                obj_worksheet.Cell(int_Contador_Fila, int_Contador_Total).Style.Border.RightBorder = XLBorderStyleValues.Thin;
                                obj_worksheet.Cell(int_Contador_Fila, int_Contador_Total).Style.Border.RightBorderColor = XLColor.Black;
                            }

                            int_Contador_Total++;
                        }
                    }

                    //Ajusto el Excell al contenido
                    obj_worksheet.Columns().AdjustToContents();
                }

                //Abro un dialog para Guardar ...................................................................
                SaveFileDialog obj_SaveFileDialog = new SaveFileDialog();
                if (_str_Ruta_FicheroExcel.Trim().Length > 0)
                {
                    int int_Posicion_NombreFichero = _str_Ruta_FicheroExcel.LastIndexOf(@"\");

                    obj_SaveFileDialog.InitialDirectory = _str_Ruta_FicheroExcel.Substring(0, int_Posicion_NombreFichero);

                    obj_SaveFileDialog.FileName = _str_Ruta_FicheroExcel.Substring(int_Posicion_NombreFichero + 1, _str_Ruta_FicheroExcel.Length - (int_Posicion_NombreFichero + 1));
                }

                obj_SaveFileDialog.Filter = "Excel (*.xlsx)|*.xlsx";
                obj_SaveFileDialog.Title = "Excel";

                if (obj_SaveFileDialog.ShowDialog() == DialogResult.OK)
                {
                    //Guardo el Excell
                    obj_XLWorkbook.SaveAs(obj_SaveFileDialog.FileName);

                    Mensajes.MostrarMensaje_Ruta(Mensajes.G_STR_MENSAJES_GENERAL_EXPORTAREXCEL_CORRECTO(), obj_SaveFileDialog.FileName);
                }

            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(Funciones_FicherosExcel) + "/" + nameof(Generar_DocumentoListado_Excel));
                Mensajes.MostrarMensaje(Mensajes.G_STR_MENSAJES_GENERAL_ERROR_EXPORTAREXCEL());
            }
            finally
            {
                if (obj_XLWorkbook != null)
                {
                    obj_XLWorkbook.Dispose();
                }
            }
        }

        public static void Generar_DocumentoListado_Excel_SoloLineas(List<INTERNO_ExportarExcel_Hoja_SinCabecera_Modelo> _lst_INTERNO_ExportarExcel_Hoja_SinCabecera_Modelo, string _str_Ruta_FicheroExcel)
        {
            XLWorkbook obj_XLWorkbook = new XLWorkbook();

            try
            {

                foreach (INTERNO_ExportarExcel_Hoja_SinCabecera_Modelo mdl_INTERNO_ExportarExcel_Hoja_SinCabecera_Modelo in _lst_INTERNO_ExportarExcel_Hoja_SinCabecera_Modelo)
                {
                    //Crea la Hoja del Excel ........................................................................
                    string str_HojaDescripcion = mdl_INTERNO_ExportarExcel_Hoja_SinCabecera_Modelo.Hoja_Descripcion;
                    if (str_HojaDescripcion.Length > 30)
                    {
                        str_HojaDescripcion = str_HojaDescripcion.Substring(0, 30);
                    }

                    //Quitar expreciones regulares ya que dan problemas en los nombre de XML
                    str_HojaDescripcion = Regex.Replace(str_HojaDescripcion, "[^0-9A-Za-z_]", "", RegexOptions.None);

                    var obj_worksheet = obj_XLWorkbook.Worksheets.Add(str_HojaDescripcion);

                    int int_Contador_Fila = 0;
                    int int_Contador_ColumnaInicial = 1;

                    //AutoAjustar Columnas
                    obj_worksheet.Columns("A:Z").AdjustToContents();

                    //Lineas
                    int int_Contador_Columna = int_Contador_ColumnaInicial;
                    if (mdl_INTERNO_ExportarExcel_Hoja_SinCabecera_Modelo.Filas != null)
                    {
                        //Recorrer las Filas
                        foreach (INTERNO_ExportarExcel_Filas_Modelo mdl_INTERNO_ExportarExcel_Filas_Modelo in mdl_INTERNO_ExportarExcel_Hoja_SinCabecera_Modelo.Filas)
                        {

                            //Recorrer Columnas Visibles
                            foreach (INTERNO_ExportarExcel_Celdas_Modelo mdl_INTERNO_ExportarExcel_Celdas_Modelo in mdl_INTERNO_ExportarExcel_Filas_Modelo.Celdas)
                            {
                                //Tipo fecha
                                if (mdl_INTERNO_ExportarExcel_Celdas_Modelo.Dato_Tipo.Equals(G_ENUM_TIPOSDATOS.DATETIME))
                                {
                                    if (mdl_INTERNO_ExportarExcel_Celdas_Modelo.Dato != null)
                                    {
                                        obj_worksheet.Cell(int_Contador_Fila + 1, int_Contador_Columna).SetValue(mdl_INTERNO_ExportarExcel_Celdas_Modelo.Dato);
                                    }
                                    else
                                    {
                                        obj_worksheet.Cell(int_Contador_Fila + 1, int_Contador_Columna).Value = "";
                                    }

                                    obj_worksheet.Cell(int_Contador_Fila + 1, int_Contador_Columna).Style.NumberFormat.Format = "dd/mm/yyyy";
                                }
                                //Tipo Hora Simple
                                else if (mdl_INTERNO_ExportarExcel_Celdas_Modelo.Dato_Tipo.Equals(G_ENUM_TIPOSDATOS.HORASIMPLE))
                                {
                                    if (mdl_INTERNO_ExportarExcel_Celdas_Modelo.Dato != null)
                                    {
                                        obj_worksheet.Cell(int_Contador_Fila + 1, int_Contador_Columna).SetValue(mdl_INTERNO_ExportarExcel_Celdas_Modelo.Dato);
                                    }
                                    else
                                    {
                                        obj_worksheet.Cell(int_Contador_Fila + 1, int_Contador_Columna).SetValue(new TimeSpan(0, 0, 0));
                                    }

                                    obj_worksheet.Cell(int_Contador_Fila + 1, int_Contador_Columna).Style.NumberFormat.Format = "[hh]:mm;@";
                                }
                                //Tipo Hora Completa
                                else if (mdl_INTERNO_ExportarExcel_Celdas_Modelo.Dato_Tipo.Equals(G_ENUM_TIPOSDATOS.HORACOMPLETA))
                                {
                                    if (mdl_INTERNO_ExportarExcel_Celdas_Modelo.Dato != null)
                                    {
                                        obj_worksheet.Cell(int_Contador_Fila + 1, int_Contador_Columna).SetValue(mdl_INTERNO_ExportarExcel_Celdas_Modelo.Dato);
                                    }
                                    else
                                    {
                                        obj_worksheet.Cell(int_Contador_Fila + 1, int_Contador_Columna).SetValue(new TimeSpan(0, 0, 0));
                                    }

                                    obj_worksheet.Cell(int_Contador_Fila + 1, int_Contador_Columna).Style.NumberFormat.Format = "[hh]:mm:ss;@";
                                }
                                //Tipo booleano
                                else if (mdl_INTERNO_ExportarExcel_Celdas_Modelo.Dato_Tipo.Equals(G_ENUM_TIPOSDATOS.BOOLEAN))
                                {
                                    string str_valor = (mdl_INTERNO_ExportarExcel_Celdas_Modelo.Dato != null && mdl_INTERNO_ExportarExcel_Celdas_Modelo.Dato) ? "X" : "";

                                    obj_worksheet.Cell(int_Contador_Fila + 1, int_Contador_Columna).SetValue(str_valor).SetDataType(XLCellValues.Text);

                                    // Alinear al centro
                                    obj_worksheet.Cell(int_Contador_Fila + 1, int_Contador_Columna).Style.Alignment.Horizontal = XLAlignmentHorizontalValues.Center;
                                }
                                //Tipo decimal
                                else if (mdl_INTERNO_ExportarExcel_Celdas_Modelo.Dato_Tipo.Equals(G_ENUM_TIPOSDATOS.DECIMAL))
                                {

                                    if (mdl_INTERNO_ExportarExcel_Celdas_Modelo.Dato != null)
                                    {
                                        obj_worksheet.Cell(int_Contador_Fila + 1, int_Contador_Columna).SetValue(mdl_INTERNO_ExportarExcel_Celdas_Modelo.Dato);
                                    }
                                    else
                                    {
                                        obj_worksheet.Cell(int_Contador_Fila + 1, int_Contador_Columna).SetValue(0.00m);
                                    }

                                    //Alinear los numeros a la derecha
                                    obj_worksheet.Cell(int_Contador_Fila + 1, int_Contador_Columna).Style.Alignment.Horizontal = XLAlignmentHorizontalValues.Right;

                                }
                                //Tipo int
                                else if (mdl_INTERNO_ExportarExcel_Celdas_Modelo.Dato_Tipo.Equals(G_ENUM_TIPOSDATOS.INT))
                                {
                                    if (mdl_INTERNO_ExportarExcel_Celdas_Modelo.Dato != null)
                                    {
                                        obj_worksheet.Cell(int_Contador_Fila + 1, int_Contador_Columna).SetValue(mdl_INTERNO_ExportarExcel_Celdas_Modelo.Dato);
                                    }
                                    else
                                    {
                                        obj_worksheet.Cell(int_Contador_Fila + 1, int_Contador_Columna).Value = "";
                                    }

                                    //Alinear los numeros a la derecha
                                    obj_worksheet.Cell(int_Contador_Fila + 1, int_Contador_Columna).Style.Alignment.Horizontal = XLAlignmentHorizontalValues.Right;
                                }
                                //Tipo long
                                else if (mdl_INTERNO_ExportarExcel_Celdas_Modelo.Dato_Tipo.Equals(G_ENUM_TIPOSDATOS.LONG))
                                {
                                    if (mdl_INTERNO_ExportarExcel_Celdas_Modelo.Dato != null)
                                    {
                                        obj_worksheet.Cell(int_Contador_Fila + 1, int_Contador_Columna).SetValue(mdl_INTERNO_ExportarExcel_Celdas_Modelo.Dato);
                                    }
                                    else
                                    {
                                        obj_worksheet.Cell(int_Contador_Fila + 1, int_Contador_Columna).Value = "";
                                    }

                                    //Alinear los numeros a la derecha
                                    obj_worksheet.Cell(int_Contador_Fila + 1, int_Contador_Columna).Style.Alignment.Horizontal = XLAlignmentHorizontalValues.Right;
                                }
                                //Tipo long_TExt
                                else if (mdl_INTERNO_ExportarExcel_Celdas_Modelo.Dato_Tipo.Equals(G_ENUM_TIPOSDATOS.LONG_TEXT))
                                {
                                    if (mdl_INTERNO_ExportarExcel_Celdas_Modelo.Dato != null)
                                    {
                                        obj_worksheet.Cell(int_Contador_Fila + 1, int_Contador_Columna).SetValue(mdl_INTERNO_ExportarExcel_Celdas_Modelo.Dato);
                                    }
                                    else
                                    {
                                        obj_worksheet.Cell(int_Contador_Fila + 1, int_Contador_Columna).Value = "";
                                    }

                                    //Alinear los numeros a la derecha
                                    obj_worksheet.Cell(int_Contador_Fila + 1, int_Contador_Columna).Style.Alignment.Horizontal = XLAlignmentHorizontalValues.Right;
                                }
                                //Tipo texto
                                else
                                {
                                    string str_valor = mdl_INTERNO_ExportarExcel_Celdas_Modelo.Dato != null ? mdl_INTERNO_ExportarExcel_Celdas_Modelo.Dato : "";

                                    obj_worksheet.Cell(int_Contador_Fila + 1, int_Contador_Columna).SetValue(str_valor).SetDataType(XLCellValues.Text);

                                    //Alinear los texto a la derecha
                                    obj_worksheet.Cell(int_Contador_Fila + 1, int_Contador_Columna).Style.Alignment.Horizontal = XLAlignmentHorizontalValues.Left;
                                }

                                //Colores
                                obj_worksheet.Cell(int_Contador_Fila + 1, int_Contador_Columna).Style.Font.FontColor = XLColor.FromHtml(Funciones.Convertir_Color_Hexadecimal(mdl_INTERNO_ExportarExcel_Celdas_Modelo.Dato_Color_Letra));
                                obj_worksheet.Cell(int_Contador_Fila + 1, int_Contador_Columna).Style.Fill.BackgroundColor = XLColor.FromHtml(Funciones.Convertir_Color_Hexadecimal(mdl_INTERNO_ExportarExcel_Celdas_Modelo.Dato_Color_Fondo));


                                //Borde
                                obj_worksheet.Cell(int_Contador_Fila + 1, int_Contador_Columna).Style.Border.BottomBorder = XLBorderStyleValues.Thin;
                                obj_worksheet.Cell(int_Contador_Fila + 1, int_Contador_Columna).Style.Border.BottomBorderColor = XLColor.Black;
                                obj_worksheet.Cell(int_Contador_Fila + 1, int_Contador_Columna).Style.Border.TopBorder = XLBorderStyleValues.Thin;
                                obj_worksheet.Cell(int_Contador_Fila + 1, int_Contador_Columna).Style.Border.TopBorderColor = XLColor.Black;
                                obj_worksheet.Cell(int_Contador_Fila + 1, int_Contador_Columna).Style.Border.LeftBorder = XLBorderStyleValues.Thin;
                                obj_worksheet.Cell(int_Contador_Fila + 1, int_Contador_Columna).Style.Border.LeftBorderColor = XLColor.Black;
                                obj_worksheet.Cell(int_Contador_Fila + 1, int_Contador_Columna).Style.Border.RightBorder = XLBorderStyleValues.Thin;
                                obj_worksheet.Cell(int_Contador_Fila + 1, int_Contador_Columna).Style.Border.RightBorderColor = XLColor.Black;

                                //Sumo 1 a la columna
                                int_Contador_Columna += 1;
                            }

                            //Unir Varias Columnas
                            if (mdl_INTERNO_ExportarExcel_Filas_Modelo.Cantidad_Columnas_A_Unir > 0)
                            {
                                obj_worksheet.Range(int_Contador_Fila + 1, 1, int_Contador_Fila + 1, (mdl_INTERNO_ExportarExcel_Filas_Modelo.Cantidad_Columnas_A_Unir)).Merge();
                            }

                            //Sumo 1 a la fila
                            int_Contador_Fila += 1;

                            //las Columnas se reinicia
                            int_Contador_Columna = int_Contador_ColumnaInicial;
                        }
                    }

                    //Ajusto el Excell al contenido
                    obj_worksheet.Columns().AdjustToContents();
                }

                //Abro un dialog para Guardar ...................................................................
                SaveFileDialog obj_SaveFileDialog = new SaveFileDialog();
                if (_str_Ruta_FicheroExcel.Trim().Length > 0)
                {
                    int int_Posicion_NombreFichero = _str_Ruta_FicheroExcel.LastIndexOf(@"\");

                    obj_SaveFileDialog.InitialDirectory = _str_Ruta_FicheroExcel.Substring(0, int_Posicion_NombreFichero);

                    obj_SaveFileDialog.FileName = _str_Ruta_FicheroExcel.Substring(int_Posicion_NombreFichero + 1, _str_Ruta_FicheroExcel.Length - (int_Posicion_NombreFichero + 1));
                }

                obj_SaveFileDialog.Filter = "Excel (*.xlsx)|*.xlsx";
                obj_SaveFileDialog.Title = "Excel";

                if (obj_SaveFileDialog.ShowDialog() == DialogResult.OK)
                {
                    //Guardo el Excell
                    obj_XLWorkbook.SaveAs(obj_SaveFileDialog.FileName);

                    Mensajes.MostrarMensaje_Ruta(Mensajes.G_STR_MENSAJES_GENERAL_EXPORTAREXCEL_CORRECTO(), obj_SaveFileDialog.FileName);
                }

            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(Funciones_FicherosExcel) + "/" + nameof(Generar_DocumentoListado_Excel_SoloLineas));
                Mensajes.MostrarMensaje(Mensajes.G_STR_MENSAJES_GENERAL_ERROR_EXPORTAREXCEL());
            }
            finally
            {
                if (obj_XLWorkbook != null)
                {
                    obj_XLWorkbook.Dispose();
                }
            }
        }
    }
}
