Validating dates

1

I'm doing a ExcelToEntityList function, that is, importing Excel data into a list, but I need to validate the start and end dates.

Am I doing it right?

The function:

  public List<ProdutosConfiguracaoTaxas> ExcelToEntityList(ExcelPackage package, out bool hadErrors)
    {
        hadErrors = false;
        List<ProdutosConfiguracaoTaxas> taxes = new List<ProdutosConfiguracaoTaxas>();
        ExcelWorksheet workSheet = package.Workbook.Worksheets.First();
        DataTable table = new DataTable();
        foreach (ExcelRangeBase firstRowCell in workSheet.Cells[1, 1, 1, workSheet.Dimension.End.Column])
        {
            table.Columns.Add(firstRowCell.Text);
        }
        for (int rowNumber = 2; rowNumber <= workSheet.Dimension.End.Row; rowNumber++)
        {
            ProdutosConfiguracaoTaxas tax = new ProdutosConfiguracaoTaxas();
            ExcelRangeBase row = workSheet.Cells[rowNumber, 1, rowNumber, workSheet.Dimension.End.Column];

            DateTime DtInicio, DtFim;

            DataRow newRow = table.NewRow();
            bool value = false;
            foreach (ExcelRangeBase cell in row)
            {
                newRow[cell.Start.Column - 1] = cell.Text;
                if (!string.IsNullOrEmpty(cell.Text))
                {
                    value = true;
                }
            }

            if (!value) { return taxes; }

            try
            {
                string dateString;

                var formats = new[] { "dd/MM/yyyy", "yyyy-MM-dd" };
                if (DateTime.TryParseExact(dateString, formats, CultureInfo.InvariantCulture, DateTimeStyles.None, out DtInicio))
                {
                    tax.Data_Incio = ITCore.ExtensionsMethods.ToDateTime((string)newRow[2]);
                }
                else
                {

                }

                tax.NumeroPrestacoes = (int)newRow[0];
                tax.TAN = (int)newRow[1];


                tax.Data_Fim = ITCore.ExtensionsMethods.ToDateTime((string)newRow[3]);
            }
            catch (Exception)
            {
                hadErrors = true;
            }

            taxes.Add(tax);
        }
        return taxes;
    }

Part I'm doing the dates validation:

        try
            {
                string dateString;

                var formats = new[] { "dd/MM/yyyy", "yyyy-MM-dd" };
                if (DateTime.TryParseExact(dateString, formats, CultureInfo.InvariantCulture, DateTimeStyles.None, out DtInicio))
                {
                    tax.Data_Incio = ITCore.ExtensionsMethods.ToDateTime((string)newRow[2]);
                }
                else
                {

                }

                tax.NumeroPrestacoes = (int)newRow[0];
                tax.TAN = (int)newRow[1];


                tax.Data_Fim = ITCore.ExtensionsMethods.ToDateTime((string)newRow[3]);
            }
            catch (Exception)
    
asked by anonymous 17.02.2017 / 13:18

1 answer

2

I assume you are using EPPlus .

As far as I understand, you are trying to throw Excel data into a DataTable (because it creates DataTables and DataRows there), but at the same time creates a list of a class that receives the given Excel and returns it. It's weird, but we can adjust.

You are already using the right functions. Just understand what they're for. At the beginning of your question, you have already parsed . Missing to assign:

            var formats = new[] { "dd/MM/yyyy", "yyyy-MM-dd" };
            if (DateTime.TryParseExact(dateString, formats, CultureInfo.InvariantCulture, DateTimeStyles.None, out DtInicio))
            {
                tax.Data_Incio = DtInicio;
            }

DateTime.TryParseExact does all the work for you and returns two values:

  • If the result of the function execution succeeded or failed;
  • The result of converting the value from String to DateTime , into the DtInicio variable passed by reference.
  • That's all. The rest is done. Taking advantage, I'll edit your code a bit with some suggestions.

    // Mudei o retorno porque não precisamos voltar necessariamente um List.
    // Pode ser também uma Collection ou uma função geradora.
    public IEnumerable<ProdutosConfiguracaoTaxas> ExcelToEntityList(ExcelPackage package, out bool hadErrors)
    {
        hadErrors = false;
    
        // Tirei isso porque vou acumular o retorno da função, 
        // Então isto não é mais necessário.
        // var taxes = new List<ProdutosConfiguracaoTaxas>();
    
        var workSheet = package.Workbook.Worksheets.First();
    
        // Não vai ser usado.
        // DataTable table = new DataTable();
    
        // Você está devolvendo uma lista de objetos. Não precisa povoar uma 
        // DataTable pra isso. 
        // foreach (ExcelRangeBase firstRowCell in workSheet.Cells[1, 1, 1, workSheet.Dimension.End.Column])
        // {
        //     table.Columns.Add(firstRowCell.Text);
        // }
        for (int rowNumber = 2; rowNumber <= workSheet.Dimension.End.Row; rowNumber++)
        {
            var tax = new ProdutosConfiguracaoTaxas();
            ExcelRangeBase row = workSheet.Cells[rowNumber, 1, rowNumber, workSheet.Dimension.End.Column];
    
            DateTime DtInicio, DtFim;
    
            // Isto também não precisa (já que não tem mais DataTable).
            // DataRow newRow = table.NewRow();
            bool value = false;
            foreach (ExcelRangeBase cell in row)
            {
                newRow[cell.Start.Column - 1] = cell.Text;
                if (!string.IsNullOrEmpty(cell.Text))
                {
                    value = true;
                }
            }
    
            if (!value) { return taxes; }
    
            try
            {
                string dateString;
    
                var formats = new[] { "dd/MM/yyyy", "yyyy-MM-dd" };
                if (DateTime.TryParseExact(dateString, formats, CultureInfo.InvariantCulture, DateTimeStyles.None, out DtInicio))
                {
                    tax.Data_Incio = DtInicio;
                }
                // Tirei o else porque ele não faz nada, então não precisa existir.
                // else
                // {
    
                // }
    
                // Como não temos mais a DataRow, mudei de newRow para row.
                tax.NumeroPrestacoes = (int)row[0];
                tax.TAN = (int)row[1];
    
                tax.Data_Fim = ITCore.ExtensionsMethods.ToDateTime((string)row[3]);
            }
            catch (Exception)
            {
                hadErrors = true;
            }
    
            // Tirei isso porque não estou mais usando a lista de Tax.
            // taxes.Add(tax);
        }
    
        // yield return acumula taxes no retorno. Quando o loop terminar, 
        // uma enumeração de tax será retornada. 
        yield return taxes;
    }
    
        
    17.02.2017 / 17:16