none
Como puedo validar los encabezados de un excel contra un JSON ? RRS feed

  • Pregunta

  • Mi codigo lee un archivo excel y recibe una cadena Json pero no encuentra la manera de poder validar los encabezados que tiene un excel contra una cadena Json validando los datos que tiene la celda y la posición en la que esta, si esto es correcto se va poder leer.

    La cadena Json viene de esta manera:

    @"{""Data"":[{""Columna"":""Fecha"",""Posicion"":""3""}, {""Columna"":""Nombre"",""Posicion"":""1""}, {""Columna"":""Lugar"",""Posicion"":""2""}  ]}";

    El archivo viene de esta manera.

    Orden 1          Orden 2      Orden 3

    Nombre           Lugar        Fecha -------- Encabezado 

    Datouno          datos         datos

    Datodos          datos          datos 

    Mi código para leer el excel es el siguiente se uso el paquete ClosedXML.

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Data.OleDb;
    using System.Data;
    
    using ClosedXML.Excel;
    
    namespace cargaBash
    {
        class Program
        {
            static void Main(string[] args)
            {
    
               
                string fileName = @"D:\Carpeta1\Archivo.xlsx";
                
                int hoja = 1;
                using (XLWorkbook workBook = new XLWorkbook(fileName))
                {
                   
                    IXLWorksheet workSheet = workBook.Worksheet(hoja);
    
                  
                    DataTable dt = new DataTable();
    
                
                    bool firstRow = true;
                    foreach (IXLRow row in workSheet.Rows())
                    {
                        
                        if (firstRow)
                        {
                            foreach (IXLCell cell in row.Cells())
                            {
                                dt.Columns.Add(cell.Value.ToString());
                            }
                            firstRow = false;
                        }
                        else
                        {
                            dt.Rows.Add();
                            int i = 0;
    
                            foreach (IXLCell cell in row.Cells(row.FirstCellUsed().Address.ColumnNumber, row.LastCellUsed().Address.ColumnNumber))
                            {
                                dt.Rows[dt.Rows.Count - 1][i] = cell.Value.ToString();
                                i++;
                            }
                        }
                    }
    
                    foreach (DataRow row in dt.Rows) 
                    {
                        Console.WriteLine("--- Row ---"); 
    
                        
                        foreach (var item in row.ItemArray)
                        {
    
                        
                        }
    
                    }
    
                }
    
            }
        }
    }
    
     

    Utilice esto para comparar mi JSON contra el encabezado y si lo compara pero no como quiero, ya  que es el orden y los datos que tiene  la celda y asi como viene el Json me marca error.

     // Comparar orden de las columnas
                    for (int i = 0; i < dtExcel.Columns.Count; i++)
                    {
                        if (dtExcel.Columns[i].ColumnName != jsonOrden.data[i].Columna || Convert.ToInt32(jsonOrden.data[i].Posicion) != dtExcel.Columns[i].Ordinal + 1)
                        {
                            validacion = "No corresponden las columnas";
                            return false;
                        }
                    }

    Espero puedan ayudarme se los agradecería mucho

    jueves, 3 de diciembre de 2020 16:09

Respuestas

  • Por que no probás a iterar por los campos del Json. No conozco Json, pero imagino que debe tener una propiedad que te de la cantidad de campos, quizas: jsonOrden.data.Count. si fuera así el codigo podria ser:

    // Comparar orden de las columnas
                    for (int i = 0; i < jsonOrden.data.Count; i++)
                    {
                        if (dtExcel.Columns[i].ColumnName != jsonOrden.data[i].Columna || Convert.ToInt32(jsonOrden.data[i].Posicion) != dtExcel.Columns[i].Ordinal + 1)
                        {
                            validacion = "No corresponden las columnas";
                            return false;
                        }
                    }

    • Propuesto como respuesta EricRRModerator jueves, 10 de diciembre de 2020 18:56
    • Marcado como respuesta FFer Dom jueves, 17 de diciembre de 2020 17:39
    sábado, 5 de diciembre de 2020 19:37

Todas las respuestas

  • Por que no probás a iterar por los campos del Json. No conozco Json, pero imagino que debe tener una propiedad que te de la cantidad de campos, quizas: jsonOrden.data.Count. si fuera así el codigo podria ser:

    // Comparar orden de las columnas
                    for (int i = 0; i < jsonOrden.data.Count; i++)
                    {
                        if (dtExcel.Columns[i].ColumnName != jsonOrden.data[i].Columna || Convert.ToInt32(jsonOrden.data[i].Posicion) != dtExcel.Columns[i].Ordinal + 1)
                        {
                            validacion = "No corresponden las columnas";
                            return false;
                        }
                    }

    • Propuesto como respuesta EricRRModerator jueves, 10 de diciembre de 2020 18:56
    • Marcado como respuesta FFer Dom jueves, 17 de diciembre de 2020 17:39
    sábado, 5 de diciembre de 2020 19:37
  • Qué tipo de datos es

    jsonOrden y data y
    jsonOrden.data[i]
    sábado, 5 de diciembre de 2020 22:14
  • Hola FFer,

    ¿Alguna novedad sobre la consulta realizada? ¿Han sido útiles las respuestas proporcionadas?

    Espero su respuesta.

    Gracias por usar los foros de MSDN.

    Eric Ruiz

    ____________________________

    Por favor recuerde "Marcar como respuesta" las respuestas que hayan resuelto su problema, es una forma común de reconocer a aquellos que han ayudado, y hace que sea más fácil para los otros visitantes encontrar la solución más tarde.

    Si tiene algún cumplido o reclamo sobre el soporte de MSDN siéntase en la libertad de contactar MSDNFSF@microsoft.com.

    martes, 8 de diciembre de 2020 15:12
    Moderador