public static _Workbook CriarAbaResumo(_Workbook workbook, IList <SerieHistoricaChuvas> serieHistorica, EstacaoData estacao)
        {
            GC.Collect();
            _Worksheet           worksheet    = workbook.Worksheets[4];
            SerieHistoricaChuvas linhaEstacao = new SerieHistoricaChuvas();

            DateTime dataInicio = estacao.Inicio.HasValue ? estacao.Inicio.Value : serieHistorica.OrderBy(c => c.Data).First().Data;
            DateTime dataFim    = estacao.Fim.HasValue ? estacao.Fim.Value : serieHistorica.OrderByDescending(c => c.Data).First().Data;

            DateTime dataIt = new DateTime(dataInicio.Year, 1, 1);

            long yearsQuantity = dataFim.Year - dataInicio.Year + 1; //Adiciona ano final

            object[,] dados = new object[yearsQuantity, 28];

            int i = 0;

            while (dataIt <= dataFim)//Cria todas as linhas até a data fim.
            {
                dados[i, 0] = dataIt.Date.Year;

                for (int j = 1; j <= 12; j++)
                {
                    //Tenta buscar dados consistidos, senão busca os dados Brutos
                    linhaEstacao = serieHistorica.FirstOrDefault(c => c.Data == dataIt && c.NivelConsistencia == "2");
                    if (linhaEstacao == null)
                    {
                        linhaEstacao = serieHistorica.FirstOrDefault(c => c.Data == dataIt && c.NivelConsistencia == "1");
                    }

                    if (linhaEstacao == null)
                    {
                        dados[i, 14]     = "a";
                        dados[i, j + 14] = "i";
                    }
                    else
                    {
                        dados[i, j]      = linhaEstacao.Total;
                        dados[i, j + 14] = string.IsNullOrWhiteSpace(linhaEstacao.TotalStatus) ? "b" : linhaEstacao.TotalStatus;
                        dados[i, 14]     = linhaEstacao.NivelConsistencia != "2" ? "a" : string.Empty;
                        dados[i, 13]     = linhaEstacao.TotalAnual;
                        dados[i, 27]     = linhaEstacao.TotalAnualStatus;
                    }
                    dataIt = dataIt.AddMonths(1);
                }

                i++;
            }

            Range range = worksheet.Cells[3, 2];

            range       = range.Resize[yearsQuantity, 28];
            range.Value = dados;

            Range range2 = worksheet.Cells[3, 2];

            range = range.Resize[yearsQuantity, 14];
            range.Cells.Borders.LineStyle = XlLineStyle.xlContinuous;
            return(workbook);
        }
        public static _Workbook CriarAbaResumoDiasFalha(_Workbook workbook, IList <SerieHistoricaChuvas> serieHistorica, EstacaoData estacao)
        {
            GC.Collect();
            _Worksheet worksheet = workbook.Worksheets[7];

            DateTime dataInicio = estacao.Inicio.HasValue ? estacao.Inicio.Value : serieHistorica.OrderBy(c => c.Data).First().Data;
            DateTime dataIt     = new DateTime(dataInicio.Year, 1, 1);
            DateTime dataFim    = estacao.Fim.HasValue ? estacao.Fim.Value : serieHistorica.OrderByDescending(c => c.Data).First().Data;

            SerieHistoricaChuvas linhaEstacao = new SerieHistoricaChuvas();

            int totalAnos = dataFim.Year - dataIt.Year; // Dias no mes mais linha referente ao ano.
            int somatorioDias;

            object[,] dados = new object[totalAnos + 2, 27];

            int totalLinhas = totalAnos + 2;

            for (int linha = 0; linha < totalLinhas - 1; linha++)
            {
                somatorioDias = 0;

                for (int coluna = 0; coluna < 14; coluna++)
                {
                    //Somatorio Total
                    if (coluna == 13)
                    {
                        dados[linha, coluna] = somatorioDias;
                    }
                    else
                    {
                        int diasMes = DateTime.DaysInMonth(dataIt.Year, dataIt.Month);

                        linhaEstacao = serieHistorica.FirstOrDefault(c => c.Data == dataIt && c.NivelConsistencia == "2");
                        if (linhaEstacao == null)
                        {
                            linhaEstacao = serieHistorica.FirstOrDefault(c => c.Data == dataIt);
                        }

                        if (coluna == 0)
                        {
                            dados[linha, coluna] = dataIt.Year;
                        }
                        else if (linhaEstacao == null)
                        {
                            dados[linha, coluna]      = diasMes;
                            dados[linha, coluna + 13] = "i";
                        }
                        else
                        {
                            int diasFalha = linhaEstacao.StatusChuvasArray.Where(c => c == "0").Count();
                            int diasChuva = linhaEstacao.StatusChuvasArray.Where(c => c == "1").Count();

                            if (diasMes == diasChuva)
                            {
                                dados[linha, coluna] = 0;
                            }
                            else if (diasMes == diasFalha)
                            {
                                dados[linha, coluna]      = diasFalha;
                                dados[linha, coluna + 13] = "i";
                                somatorioDias            += diasFalha;
                            }
                            else if (diasMes != diasFalha)
                            {
                                if (diasMes > diasFalha)
                                {
                                    dados[linha, coluna]      = diasMes - diasChuva;
                                    dados[linha, coluna + 13] = "a";
                                    somatorioDias            += diasMes - diasChuva;
                                }
                                else
                                {
                                    somatorioDias            += diasMes;
                                    dados[linha, coluna]      = diasMes;
                                    dados[linha, coluna + 13] = "i";
                                }
                            }
                        }
                        if (coluna != 0)
                        {
                            dataIt = dataIt.AddMonths(1);
                        }
                    }
                }
            }

            dados[totalLinhas - 1, 0] = "Médias";

            for (int linhaMedia = 1; linhaMedia <= 13; linhaMedia++)
            {
                int    valor             = 0;
                int    quantidadeValores = 0;
                double somatorio         = 0.0;
                double media             = 0.0;

                for (int colunaSomatorio = 0; colunaSomatorio < totalLinhas - 1; colunaSomatorio++)
                {
                    valor      = !(dados[colunaSomatorio, linhaMedia] == string.Empty) ? Convert.ToInt32(dados[colunaSomatorio, linhaMedia]) : 0;
                    somatorio += valor;
                    if (valor != 0)
                    {
                        quantidadeValores++;
                    }
                }
                media = somatorio / (dataFim.Year - dataInicio.Year + 1);
                dados[totalLinhas - 1, linhaMedia] = media;
            }


            //Imprime os dados
            Range range = worksheet.Cells[3, 2];

            range       = range.Resize[totalLinhas, 27];
            range.Value = dados;

            range = worksheet.Cells[3, 2];
            range = range.Resize[totalLinhas, 14];
            range.Cells.Borders.LineStyle = XlLineStyle.xlContinuous;


            return(workbook);
        }
        public static _Workbook CriarAbaResumoDia(_Workbook workbook, IList <SerieHistoricaChuvas> serieHistorica, EstacaoData estacao)
        {
            GC.Collect();
            _Worksheet worksheet = workbook.Worksheets[5];


            DateTime dataInicio = estacao.Inicio.HasValue ? estacao.Inicio.Value : serieHistorica.OrderBy(c => c.Data).First().Data;
            DateTime dataIt     = new DateTime(dataInicio.Year, 1, 1);
            DateTime dataFim    = estacao.Fim.HasValue ? estacao.Fim.Value : serieHistorica.OrderByDescending(c => c.Data).First().Data;

            int linhasRange = 32;
            int anoIteracao = 0;
            int linhaInicio = 3;

            SerieHistoricaChuvas linhaEstacao = new SerieHistoricaChuvas();

            while (dataIt <= dataFim)//Cria todas as linhas até a data fim.
            {
                object[,] dados = new object[32, 25];

                for (int i = 0; i <= 12; i++)                                        //iteração por mes
                {
                    var diasNoMes = DateTime.DaysInMonth(dataIt.Year, dataIt.Month); // Dias no mes mais linha referente ao ano.

                    linhaEstacao = serieHistorica.FirstOrDefault(c => c.Data == dataIt && c.NivelConsistencia == "2");
                    if (linhaEstacao == null)
                    {
                        linhaEstacao = serieHistorica.FirstOrDefault(c => c.Data == dataIt && c.NivelConsistencia == "1");
                    }

                    //preenche a coluna
                    for (int index = 0; index <= 31; index++) // iteracao por dia
                    {
                        if (i == 0 && index == 0)             //Escreve o Ano
                        {
                            dados[index, i] = dataIt.Year;
                        }
                        if (i != 0 && index == 0) //Escreve o "-"
                        {
                            dados[index, i] = "-";
                        }
                        if (i == 0 && index != 0) //Escreve o dia do mes
                        {
                            dados[index, i] = index;
                        }

                        if (i != 0 && index != 0)     // Escreve dados da chuva para o dia
                        {
                            if (linhaEstacao == null) // nao existe dados para este mes
                            {
                                dados[index, i + 12] = "i";
                            }
                            else if (string.IsNullOrEmpty(linhaEstacao.ChuvasArray[index]) && index > diasNoMes)
                            {
                                dados[index, i] = "-";
                            }
                            else if (string.IsNullOrEmpty(linhaEstacao.ChuvasArray[index]))
                            {
                                dados[index, i + 12] = "b";
                            }
                            else
                            {
                                dados[index, i] = linhaEstacao.ChuvasArray[index];
                            }
                        }
                    }
                    if (i != 0)
                    {
                        dataIt = dataIt.AddMonths(1);
                    }
                }

                linhaInicio = 3 + (linhasRange * anoIteracao);

                //Imprime os dados
                Range range = worksheet.Cells[linhaInicio, 2];
                range       = range.Resize[linhasRange, 25];
                range.Value = dados;

                //Desenha as linhas de borda
                range = range.Resize[linhasRange, 13];
                range.Cells.Borders.LineStyle = XlLineStyle.xlContinuous;

                anoIteracao++;
            }
            return(workbook);
        }