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 }