public List<AtividadeInfo> ler()
        {
            List<AtividadeInfo> listaRetorno = new List<AtividadeInfo>();

            String colunaDiaDaSemana = leitor.obterColuna("Dia");
            String colunaHorario = leitor.obterColuna("Horário da atividade");
            String colunaDescricao = leitor.obterColuna("Atividade");
            String colunaPeriodicidade = leitor.obterColuna("Periodicidade");
            String colunaTipoAtividade = leitor.obterColuna("Tipo de atividade");

            CelulaLeitorInfo celTxtHora = new CelulaLeitorInfo(colunaHorario, 2);
            while (true)
            {
                double? horaInicio = lerHorario(celTxtHora, 0);
                if (horaInicio == null)
                {
                    break;
                }
                double? horaFim = lerHorario(celTxtHora, 1);

                string descricao = leitor.ler(new CelulaLeitorInfo(colunaDescricao, celTxtHora.Linha));

                string tipoAtividade = leitor.ler(new CelulaLeitorInfo(colunaTipoAtividade, celTxtHora.Linha));

                String textoPeriodicidade = leitor.ler(new CelulaLeitorInfo(colunaPeriodicidade, celTxtHora.Linha));
                Periodicidade? periodicidade = null;
                if (mapaPeriodicidade.ContainsKey(textoPeriodicidade))
                {
                    periodicidade = mapaPeriodicidade[textoPeriodicidade];

                    string textoDiaDaSemana = leitor.ler(new CelulaLeitorInfo(colunaDiaDaSemana, celTxtHora.Linha));
                    DayOfWeek? diaDaSemana = null;
                    foreach (string descricaoDiaDaSemana in mapaDiaDaSemana.Keys)
                    {
                        if (textoDiaDaSemana.ToLower().Contains(descricaoDiaDaSemana.ToLower()))
                        {
                            diaDaSemana = mapaDiaDaSemana[descricaoDiaDaSemana];
                            int? semana = null;
                            if (periodicidade == Periodicidade.Mensal)
                            {
                                for (int i = 1; i < 5; ++i)
                                {
                                    if (textoDiaDaSemana.Contains(i + "º") || textoDiaDaSemana.Contains(i + "ª"))
                                    {
                                        semana = i;
                                    }
                                }
                            }
                            listaRetorno.Add(new AtividadeInfo(diaDaSemana.Value, semana, horaInicio.Value,
                                horaFim.Value, descricao, periodicidade.Value, tipoAtividade));
                            break;
                        }
                    }
                }

                celTxtHora = leitor.proxima(celTxtHora, 0, 1);

            }
            return listaRetorno;
        }
        private void ler(List<ProgramacaoInfo> listaRetorno)
        {
            Dictionary<string, ExpositorInfo> expositores = new Dictionary<string, ExpositorInfo>();
            String colunaData = leitor.obterColuna("Dia");
            String colunaHorario = leitor.obterColuna("Horário da atividade");

            String colunaTitulo1Estudo = leitor.obterColuna("Título 1º estudo");
            String colunaTema1Estudo = leitor.obterColuna("1º estudo");
            String colunaReferencia1Estudo = leitor.obterColuna("Referência 1º estudo");
            String colunaExpositor1Estudo = leitor.obterColuna("Expositor 1º estudo");

            String colunaTitulo2Estudo = leitor.obterColuna("Título 2º estudo");
            String colunaTema2Estudo = leitor.obterColuna("2º estudo");
            String colunaReferencia2Estudo = leitor.obterColuna("Referência 2º estudo");
            String colunaExpositor2Estudo = leitor.obterColuna("Expositor 2º estudo");

            String colunaLocal1e2Estudo = leitor.obterColuna("Dependência 1º e 2º estudos");

            String colunaTemaCiclo = leitor.obterColuna("Ciclo de estudos");
            String colunaExpositorCiclo = leitor.obterColuna("Expositor ciclo de estudos");
            String colunaLocalCiclo = leitor.obterColuna("Dependência ciclo de estudos");

            CelulaLeitorInfo celulaData = new CelulaLeitorInfo(colunaData, 2);
            while (true)
            {
                DateTime? data = celulaData.lerData(leitor);
                if (data == null)
                {
                    break;
                }
                CelulaLeitorInfo celTxtHora = new CelulaLeitorInfo(colunaHorario, celulaData.Linha);
                double horaInicio = lerHorario(celTxtHora, 0);
                double horaFim = lerHorario(celTxtHora, 1);

                lerEstudo(listaRetorno, expositores, data.Value, horaInicio, horaFim, celulaData.Linha,
                    colunaTitulo1Estudo, colunaTema1Estudo, colunaReferencia1Estudo, colunaExpositor1Estudo,
                    colunaLocal1e2Estudo, 1);

                lerEstudo(listaRetorno, expositores, data.Value, horaInicio, horaFim, celulaData.Linha,
                    colunaTitulo2Estudo, colunaTema2Estudo, colunaReferencia2Estudo, colunaExpositor2Estudo,
                    colunaLocal1e2Estudo, 2);

                lerCiclo(listaRetorno, expositores, data.Value, horaInicio, horaFim, celulaData.Linha,
                    colunaTemaCiclo, colunaExpositorCiclo, colunaLocalCiclo);

                celulaData = celulaData.proxima(leitor, 0, 1);
            }
        }
 private double? lerHorario(CelulaLeitorInfo celulaInicio, int indiceAparicaHorario)
 {
     String texto = leitor.ler(celulaInicio);
     if (String.IsNullOrEmpty(texto))
     {
         return null;
     }
     MatchCollection matches = regexHora.Matches(texto);
     string[] horaMinuto = matches[indiceAparicaHorario].Groups[1].Value.Split(':');
     return Convert.ToDouble(horaMinuto[0]) + (Convert.ToDouble(horaMinuto[1])/60.0);
 }
 private double lerHorario(CelulaLeitorInfo celulaInicio, int indiceAparicaHorario)
 {
     String texto = celulaInicio.ler(leitor);
     MatchCollection matches = regexHora.Matches(texto);
     string[] horaMinuto = matches[indiceAparicaHorario].Groups[1].Value.Split(':');
     return Convert.ToDouble(horaMinuto[0]) + (Convert.ToDouble(horaMinuto[1])/60.0);
 }