Пример #1
0
        static void Main(string[] args)
        {
            var stopwatch = Stopwatch.StartNew();

            var argumento1 = string.Empty;

            if (args.Length > 0)
            {
                argumento1 = args[0];
            }

            var nombreLibro = string.IsNullOrWhiteSpace(argumento1) ? "Formato_Pruebas.xls" : argumento1;
            var libro       = new Workbook();

            libro.LoadDocument(nombreLibro);

            const string nombreHojaFormato = "Reporte de Formatos";

            if (!libro.Worksheets.Contains(nombreHojaFormato))
            {
                Console.WriteLine(
                    "No podemos procesar este formato, no existe la hoja \"{0}\" lo que indica que la estructura del formato ha sido alterada.",
                    nombreHojaFormato);
                return;
            }

            var hojaFormato            = libro.Worksheets[nombreHojaFormato];
            var rangoFormato           = hojaFormato.GetDataRange();
            var maximaCantidadFilas    = rangoFormato.BottomRowIndex;
            var maximaCantidadColumnas = rangoFormato.RightColumnIndex;

            var idFormato     = Genericos.ConvertirCadenaAEntero(ObtenerValorCelda(hojaFormato.Columns[0][0].Value));
            var nombreFormato = ObtenerValorCelda(hojaFormato.Columns[1][2].Value);
            var formato       = new Formato(idFormato, nombreFormato);

            // Procesar Campos del Formato
            for (var columna = 0; columna <= maximaCantidadColumnas; columna++)
            {
                var strIdTipoCampo   = ObtenerValorCelda(hojaFormato.Columns[columna][3].Value);
                var strIdCampo       = ObtenerValorCelda(hojaFormato.Columns[columna][4].Value);
                var celdaNombreCampo = hojaFormato.Columns[columna][6];

                var campo = Campo.FabricarPorTipo(strIdTipoCampo);
                campo.ID       = Genericos.ConvertirCadenaAEntero(strIdCampo);
                campo.Nombre   = ObtenerValorCelda(celdaNombreCampo.Value);
                campo.Posicion = new Posicion(nombreHojaFormato, celdaNombreCampo.LeftColumnIndex, celdaNombreCampo.TopRowIndex);

                // Procesar Registros de los Campos del Formato
                var esTipoCampoHora = campo is Hora;
                for (var fila = 7; fila <= maximaCantidadFilas; fila++)
                {
                    var celda = hojaFormato.Columns[columna][fila];

                    // Si es el primer registro entonces revisamos
                    // si debemos proecesar los registros de los catalogos
                    // y de las tablas.
                    if (fila == 7)
                    {
                        // ToDo: No hacer esto... procesar primero la estructura luego los registros, ya que
                        // ToDo: si no ponen nada sobretodo en los campos tipo tabla que es un muy comun lo dejen vacio
                        if (campo is Catalogo)
                        {
                            ProcesarCatalogo(campo, libro, hojaFormato.DataValidations.GetDataValidation(celda));
                        }

                        if (campo is Tabla)
                        {
                            ProcesarTabla(campo, libro);
                        }
                    }

                    // ReSharper disable once UseObjectOrCollectionInitializer
                    var registro = new Registro();
                    registro.Numero   = fila - 7;
                    registro.Posicion = new Posicion(nombreHojaFormato, celda.LeftColumnIndex, celda.TopRowIndex);
                    registro.Valor    = ObtenerValorCelda(celda.Value, esTipoCampoHora);
                    campo.Registros.Add(registro);
                }

                formato.Campos.Add(campo);
            }

            // Validar Formato
            var listaErrores = formato.Validar();

            // Revisar si tiene errores criticos el formato
            var erroresCriticos         = listaErrores.Where(p => p.Tipo.Equals(TipoError.Critico)).ToList();
            var cantidadErroresCriticos = erroresCriticos.Count;

            if (cantidadErroresCriticos > 0)
            {
                Console.WriteLine(
                    "Se encontraron {0} {1}, verifique que la estructura del formato no haya sido alterada.",
                    cantidadErroresCriticos, cantidadErroresCriticos > 1 ? "errores criticos" : "error critico");
                File.WriteAllText("formato-errores-criticos.txt", string.Join("\n", erroresCriticos));
            }
            else
            {
                var cantidadErroresGraves = listaErrores.Count(p => p.Tipo.Equals(TipoError.Grave));
                Console.WriteLine("== Resumen de Errores Encontrados ==");
                Console.WriteLine("Graves: {0}", cantidadErroresGraves);
                Console.WriteLine("Advertencias: {0}", listaErrores.Count(p => p.Tipo.Equals(TipoError.Advertencia)));
                Console.WriteLine("Informativos: {0}", listaErrores.Count(p => p.Tipo.Equals(TipoError.Informativo)));
                Console.WriteLine("Total de Errores Encontrados: {0}\n", listaErrores.Count);

                File.WriteAllText("formato-errores.txt", string.Join("\n", listaErrores));

                // Generar formato XML
                if (cantidadErroresGraves < 1)
                {
                    Console.WriteLine("Convirtiendo el formato a XML");
                    File.WriteAllText("formato.xml", formato.HaciaXML());
                }

                #if DEBUG
                File.WriteAllText("formato.json", Newtonsoft.Json.JsonConvert.SerializeObject(formato, Newtonsoft.Json.Formatting.Indented));
                #endif
            }

            stopwatch.Stop();
            Console.WriteLine("\nTiempo transcurrido de procesamiento: {0}", stopwatch.Elapsed);

            #if DEBUG
            Console.WriteLine("\nPulse cualquier tecla para finalizar");
            Console.ReadLine();
            #endif
        }