private void CargaHojaExcel(DataTable tablaExcel, string titulo, string nombreHoja, bool incluirGrafico) { #region --[Estilos]-- IFont fuenteTitulo = excelFile.CreateFont(); fuenteTitulo.FontName = "Calibri"; //fuenteTitulo.FontHeight = (short)FontSize.Large.GetHashCode(); fuenteTitulo.Boldweight = (short)FontBoldWeight.BOLD.GetHashCode(); IFont unaFuente = excelFile.CreateFont(); unaFuente.FontName = "Tahoma"; //unaFuente.FontHeight = (short)FontSize.Medium.GetHashCode(); IFont fuenteEncabezado = excelFile.CreateFont(); fuenteEncabezado.FontName = "Tahoma"; //fuenteEncabezado.FontHeight = (short)FontSize.Medium.GetHashCode(); ; fuenteEncabezado.Boldweight = (short)FontBoldWeight.BOLD.GetHashCode(); ICellStyle unEstiloDecimal = excelFile.CreateCellStyle(); IDataFormat format = excelFile.CreateDataFormat(); unEstiloDecimal.DataFormat = format.GetFormat("0.00"); unEstiloDecimal.SetFont(unaFuente); #endregion #region --[Hoja]-- ISheet hojaExcel = excelFile.CreateSheet(nombreHoja); NPOI.SS.Util.CellRangeAddress rango = new NPOI.SS.Util.CellRangeAddress(0, 0, 0, tablaExcel.Columns.Count - 1); hojaExcel.AddMergedRegion(rango); hojaExcel.AutoSizeColumn(0); hojaExcel.AutoSizeColumn(1); int idxAux = 0; IRow fila = hojaExcel.CreateRow(idxAux); fila.CreateCell(idxAux).SetCellValue(titulo); fila.Cells[idxAux].CellStyle.SetFont(fuenteTitulo); idxAux++; fila = hojaExcel.CreateRow(idxAux); idxAux++; RptIndicadores alumno = null; int idAlumno = 0; string nombre = string.Empty; hojaExcel.AutoSizeColumn(0); //--Agrego los encabezados-- #region --[Encabezados]-- for (int i = 0; i < tablaExcel.Columns.Count; i++) { fila.CreateCell(i).CellStyle.Alignment = HorizontalAlignment.CENTER; nombre = tablaExcel.Columns[i].ColumnName; alumno = new RptIndicadores(); int.TryParse(tablaExcel.Columns[i].ColumnName, out idAlumno); if (idAlumno > 0) { alumno = lista.Find(p => p.idAlumno == Convert.ToInt16(idAlumno)); nombre = alumno.alumnoApellido.Trim() + " " + alumno.alumnoNombre.Trim(); } fila.CreateCell(i).SetCellValue(nombre); fila.Cells[i].CellStyle.SetFont(fuenteEncabezado); hojaExcel.AutoSizeColumn(i); } #endregion //--Agrego los datos hoja-- #region --[Datos]-- decimal valorDato = 0; int cantFilas = 0; try { for (int i = 0; i < tablaExcel.Rows.Count; i++) { fila = hojaExcel.CreateRow(idxAux); idxAux++; cantFilas++; for (int j = 0; j < tablaExcel.Columns.Count; j++) { try { valorDato = decimal.Parse(tablaExcel.Rows[i][j].ToString()); fila.CreateCell(j).SetCellValue(Convert.ToDouble(valorDato)); fila.Cells[j].CellStyle = unEstiloDecimal; fila.Cells[j].SetCellType(CellType.NUMERIC); } catch { fila.CreateCell(j).SetCellValue(tablaExcel.Rows[i][j].ToString()); fila.Cells[j].CellStyle.SetFont(fuenteEncabezado); } } } } catch (Exception ex) { throw ex; } #endregion //Acomodo las columnas for (int j = 0; j < tablaExcel.Columns.Count; j++) { hojaExcel.AutoSizeColumn(j); } hojaExcel.AutoSizeColumn(0); #endregion if (incluirGrafico) { #region --[Grafico]-- //map the path to the img folder //string imagesPath = System.IO.Path.Combine(Server.MapPath("~"), "img"); string imagesPath = System.IO.Path.GetFullPath(NombrePNG); //grab the image file //create an image from the path System.Drawing.Image image = System.Drawing.Image.FromFile(imagesPath); MemoryStream ms = new MemoryStream(); //pull the memory stream from the image (I need this for the byte array later) image.Save(ms, System.Drawing.Imaging.ImageFormat.Png); //the drawing patriarch will hold the anchor and the master information var patriarch = hojaExcel.CreateDrawingPatriarch(); //store the coordinates of which cell and where in the cell the image goes HSSFClientAnchor anchor = new HSSFClientAnchor(20, 0, 40, 20, 3, cantFilas + 3, 4, cantFilas + 10); //types are 0, 2, and 3. 0 resizes within the cell, 2 doesn't anchor.AnchorType = 2; //add the byte array and encode it for the excel file int index = excelFile.AddPicture(ms.ToArray(), PictureType.PNG); var picture = patriarch.CreatePicture(anchor, index); picture.Resize(); picture.LineStyle = HSSFPicture.LINESTYLE_DASHDOTGEL; hojaExcel.ForceFormulaRecalculation = true; #endregion } }
/// <summary> /// Aplicars the metodo. /// </summary> /// <param name="lista">The lista.</param> private void AplicarMetodo(List<RptIndicadores> lista) { try { Promethee valoresCalificacion = new Promethee(), valoresInasistencia = new Promethee(), valoresSancion = new Promethee(); if (criterioCalificacion.habilitarCriterio) valoresCalificacion = criterioCalificacion.obtenerValores(); if (criterioInasistencia.habilitarCriterio) valoresInasistencia = criterioInasistencia.obtenerValores(); if (criterioSancion.habilitarCriterio) valoresSancion = criterioSancion.obtenerValores(); decimal diferenciaCriterio = 0; decimal valorFuncPreferencia = 0; tablaPaso1 = new DataTable("Promethee1"); tablaPaso1.Columns.Add("Alumnos"); if (criterioCalificacion.habilitarCriterio) tablaPaso1.Columns.Add("Calificacion", System.Type.GetType("System.Decimal")); if (criterioInasistencia.habilitarCriterio) tablaPaso1.Columns.Add("Inasistencia", System.Type.GetType("System.Decimal")); if (criterioSancion.habilitarCriterio) tablaPaso1.Columns.Add("Sancion", System.Type.GetType("System.Decimal")); DataRow fila; // Paso 1: determinar como se situan las alternativas con respecto a cada atributo. #region --[Paso 1]-- foreach (RptIndicadores item in lista) { List<RptIndicadores> filtro = lista.FindAll(p => p.idAlumno != item.idAlumno); foreach (RptIndicadores alumno in filtro) { fila = tablaPaso1.NewRow(); fila["Alumnos"] = item.idAlumno.ToString() + "-" + alumno.idAlumno.ToString(); #region --[Promedios]-- if (criterioCalificacion.habilitarCriterio) { valorFuncPreferencia = -1; diferenciaCriterio = 0; if (criterioCalificacion.esMaximzante) { if (item.promedio >= alumno.promedio) { diferenciaCriterio = Math.Abs(item.promedio - alumno.promedio); valorFuncPreferencia = Promethee.obtenerValorFuncPreferencia(valoresCalificacion, diferenciaCriterio); } } else { if (item.promedio <= alumno.promedio) { diferenciaCriterio = Math.Abs(item.promedio - alumno.promedio); valorFuncPreferencia = Promethee.obtenerValorFuncPreferencia(valoresCalificacion, diferenciaCriterio); } } if (valorFuncPreferencia >= 0) fila["Calificacion"] = valorFuncPreferencia; else fila["Calificacion"] = DBNull.Value; } //else fila["Calificacion"] = DBNull.Value; #endregion #region --[Inasistencias]-- if (criterioInasistencia.habilitarCriterio) { valorFuncPreferencia = -1; diferenciaCriterio = 0; if (criterioInasistencia.esMaximzante) { if (item.inasistencias >= alumno.inasistencias) { diferenciaCriterio = Math.Abs(item.inasistencias - alumno.inasistencias); valorFuncPreferencia = Promethee.obtenerValorFuncPreferencia(valoresInasistencia, diferenciaCriterio); } } else { if (item.inasistencias <= alumno.inasistencias) { diferenciaCriterio = Math.Abs(item.inasistencias - alumno.inasistencias); valorFuncPreferencia = Promethee.obtenerValorFuncPreferencia(valoresInasistencia, diferenciaCriterio); } } if (valorFuncPreferencia >= 0) fila["Inasistencia"] = valorFuncPreferencia; else fila["Inasistencia"] = DBNull.Value; } //else fila["Inasistencia"] = DBNull.Value; #endregion #region --[Sanciones]-- if (criterioSancion.habilitarCriterio) { valorFuncPreferencia = -1; diferenciaCriterio = 0; if (criterioSancion.esMaximzante) { if (item.sanciones >= alumno.sanciones) { diferenciaCriterio = Math.Abs(item.sanciones - alumno.sanciones); valorFuncPreferencia = Promethee.obtenerValorFuncPreferencia(valoresSancion, diferenciaCriterio); } } else { if (item.sanciones <= alumno.sanciones) { diferenciaCriterio = Math.Abs(item.sanciones - alumno.sanciones); valorFuncPreferencia = Promethee.obtenerValorFuncPreferencia(valoresSancion, diferenciaCriterio); } } if (valorFuncPreferencia >= 0) fila["Sancion"] = valorFuncPreferencia; else fila["Sancion"] = DBNull.Value; } //else fila["Sancion"] = DBNull.Value; #endregion tablaPaso1.Rows.Add(fila); } } #endregion // Paso 2: Expresar la intensidad de la preferencia de la alternativa Xi comparada con Xk #region --[Paso 2]-- tablaPaso2 = new DataTable("Promethee2"); tablaPaso2.Columns.Add("Alumnos"); DataRow nuevaFila; for (int i = 0; i < lista.Count; i++) { tablaPaso2.Columns.Add(lista[i].idAlumno.ToString(), System.Type.GetType("System.Decimal")); nuevaFila = tablaPaso2.NewRow(); tablaPaso2.Rows.Add(nuevaFila); tablaPaso2.Rows[i]["Alumnos"] = lista[i].idAlumno.ToString(); } tablaPaso2.Columns.Add("FlujoEntrante", System.Type.GetType("System.Decimal")); string[] alternativas; int indexFila = 0; int indexColumna = 0; decimal valorCalificacion = 0; decimal valorInasistencia = 0; decimal valorSancion = 0; decimal sumaPesos = 0; if (criterioCalificacion.habilitarCriterio) sumaPesos += valoresCalificacion.pesoCriterio; if (criterioInasistencia.habilitarCriterio) sumaPesos += valoresInasistencia.pesoCriterio; if (criterioSancion.habilitarCriterio) sumaPesos += valoresSancion.pesoCriterio; int nroFila; decimal valorAcumulado = 0; foreach (DataRow item in tablaPaso1.Rows) { valorAcumulado = 0; alternativas = item[0].ToString().Split('-'); //item 0: fila //item 1: columna int.TryParse(alternativas[0], out indexFila); int.TryParse(alternativas[1], out indexColumna); nroFila = tablaPaso2.Rows.IndexOf(tablaPaso2.Select("Alumnos='" + indexFila.ToString() + "'")[0]); if (criterioCalificacion.habilitarCriterio) { valorCalificacion = (item[1] != DBNull.Value) ? Convert.ToDecimal(item[1]) : 0; if (criterioInasistencia.habilitarCriterio) { valorInasistencia = (item[2] != DBNull.Value) ? Convert.ToDecimal(item[2]) : 0; if (criterioSancion.habilitarCriterio) valorSancion = (item[3] != DBNull.Value) ? Convert.ToDecimal(item[3]) : 0; } else valorSancion = (item[2] != DBNull.Value) ? Convert.ToDecimal(item[2]) : 0; } else { if (criterioInasistencia.habilitarCriterio) { valorInasistencia = (item[1] != DBNull.Value) ? Convert.ToDecimal(item[1]) : 0; if (criterioSancion.habilitarCriterio) valorSancion = (item[2] != DBNull.Value) ? Convert.ToDecimal(item[2]) : 0; } else valorSancion = (item[1] != DBNull.Value) ? Convert.ToDecimal(item[1]) : 0; } if (criterioCalificacion.habilitarCriterio) valorAcumulado += (valorCalificacion * valoresCalificacion.pesoCriterio); if (criterioInasistencia.habilitarCriterio) valorAcumulado += (valorInasistencia * valoresInasistencia.pesoCriterio); if (criterioSancion.habilitarCriterio) valorAcumulado += (valorSancion * valoresSancion.pesoCriterio); tablaPaso2.Rows[nroFila][indexColumna.ToString()] = Math.Round((valorAcumulado / (sumaPesos)), 2); } #endregion // Paso 3: Expresar como Xi supera a las demás alternativas y cómo es superada por las otras. #region --[Paso 3]-- tablaPaso3 = new DataTable("Promethee2"); tablaPaso3 = tablaPaso2.Clone(); tablaPaso3.Columns[0].DataType = System.Type.GetType("System.String"); nuevaFila = tablaPaso3.NewRow(); nuevaFila[0] = "FlujoSaliente"; tablaPaso3.Rows.Add(nuevaFila); decimal acumuladorFila, acumuladorColumna; for (int i = 0; i < tablaPaso2.Rows.Count; i++) { acumuladorFila = 0; for (int j = 1; j < tablaPaso2.Columns.Count - 1; j++) { acumuladorFila += (tablaPaso2.Rows[i][j] != DBNull.Value) ? Convert.ToDecimal(tablaPaso2.Rows[i][j]) : 0; } tablaPaso2.Rows[i][tablaPaso2.Columns.Count - 1] = acumuladorFila; } for (int i = 1; i < tablaPaso2.Columns.Count - 1; i++) { acumuladorColumna = 0; for (int j = 0; j < tablaPaso2.Rows.Count; j++) { acumuladorColumna += (tablaPaso2.Rows[j][i] != DBNull.Value) ? Convert.ToDecimal(tablaPaso2.Rows[j][i]) : 0; } tablaPaso3.Rows[0][i] = acumuladorColumna; } #endregion // Paso 4: Obtener el Preorden Total #region --[Paso 4]-- //tablaPaso2.DefaultView.Sort = "FlujoEntrante DESC"; tablaPaso2.Columns.Add("Ranking", System.Type.GetType("System.Decimal")); for (int i = 0; i < tablaPaso2.Rows.Count; i++) { tablaPaso2.Rows[i][tablaPaso2.Columns.Count - 1] = Convert.ToDecimal(tablaPaso2.Rows[i][tablaPaso2.Columns.Count - 2]) - Convert.ToDecimal(tablaPaso3.Rows[0][i + 1]); } tablaPaso2.DefaultView.Sort = "Ranking DESC"; tablaResultado = tablaPaso2.DefaultView.ToTable(); #endregion for (int i = 0; i < tablaResultado.Rows.Count; i++) { RptIndicadores alumno = new RptIndicadores(); alumno = lista.Find(p => p.idAlumno == Convert.ToInt16(tablaResultado.Rows[i][0].ToString())); tablaResultado.Rows[i][0] = alumno.alumnoApellido.Trim() + " " + alumno.alumnoNombre.Trim(); } tablaResultado.Columns.Remove("FlujoEntrante"); int idTop = 0; int.TryParse(ddlTop.SelectedValue, out idTop); if (idTop > 0) { DataTable tablaFiltro = tablaResultado.Clone(); for (int i = 0; i < idTop; i++) { tablaFiltro.ImportRow(tablaResultado.Rows[i]); } tablaResultado.Clear(); tablaResultado = tablaFiltro.Copy(); } CargarGrilla(); tablaPaso3.Columns.Add("Ranking", System.Type.GetType("System.Decimal")); tablaPaso3.Rows[0][tablaPaso3.Columns.Count - 1] = DBNull.Value; GraficarPodioResultado(); } catch (Exception ex) { throw ex; } }
/// <summary> /// Obteners the datos. /// </summary> /// <param name="idCursoCicloLectivo">The id curso ciclo lectivo.</param> /// <returns></returns> private string obtenerDatos(int idCursoCicloLectivo) { RptIndicadores objFiltroReporte = new RptIndicadores(); objFiltroReporte.idCursoCicloLectivo = idCursoCicloLectivo; BLRptIndicadores objBLIndicadores = new BLRptIndicadores(); lista = objBLIndicadores.GetRptIndicadores(objFiltroReporte); string validacion = criterioCalificacion.ValidarMétodo(); bool datosValidos = true; if (criterioCalificacion.habilitarCriterio) { if (!string.IsNullOrEmpty(validacion)) { datosValidos = false; return validacion; } } validacion = criterioInasistencia.ValidarMétodo(); if (criterioInasistencia.habilitarCriterio) { if (!string.IsNullOrEmpty(validacion)) { datosValidos = false; return validacion; } } validacion = criterioSancion.ValidarMétodo(); if (criterioSancion.habilitarCriterio) { if (!string.IsNullOrEmpty(validacion)) { datosValidos = false; return validacion; } } if (datosValidos) AplicarMetodo(lista); return string.Empty; }
// to set the height of row. /// <summary> /// Handles the RowDataBound event of the gvwResultado control. /// </summary> /// <param name="sender">The source of the event.</param> /// <param name="e">The <see cref="System.Web.UI.WebControls.GridViewRowEventArgs"/> instance containing the event data.</param> protected void gvwResultado_RowDataBound(object sender, GridViewRowEventArgs e) { e.Row.Height = Unit.Pixel(24); e.Row.VerticalAlign = VerticalAlign.Middle; //Permito que solo se ordene por la última columna de la grilla - Flujo Neto if (e.Row.RowType == DataControlRowType.Header) { for (int i = 0; i < e.Row.Cells.Count - 1; i++) //excepto la que queremos dejar disponible. { LinkButton lb = (LinkButton)e.Row.Cells[i].Controls[0]; string title = lb.Text; Label lbl = new Label(); lbl.Text = title; e.Row.Cells[i].Controls.Clear(); e.Row.Cells[i].Controls.Add(lbl); } if (lista != null) { for (int i = 1; i < e.Row.Cells.Count - 1; i++) { Label lb = (Label)e.Row.Cells[i].Controls[0]; RptIndicadores alumno = new RptIndicadores(); alumno = lista.Find(p => p.idAlumno == Convert.ToInt16(lb.Text)); string nombre = alumno.alumnoApellido.Trim() + " " + alumno.alumnoNombre.Trim(); lb.Text = nombre.Replace(" ", "<br />"); } } } if (e.Row.RowType == DataControlRowType.DataRow) { string nombre = e.Row.Cells[0].Text; e.Row.Cells[0].Text = nombre.Replace(" ", "<br />"); } //if (e.Row.RowType == DataControlRowType.Footer) //{ // e.Row.Cells[0].Text = tablaPaso3.Rows[0][0].ToString(); // e.Row.Cells[0].HorizontalAlign = HorizontalAlign.Center; // e.Row.Cells[0].VerticalAlign = VerticalAlign.Middle; // for (int i = 1; i < e.Row.Cells.Count - 1; i++) // { // e.Row.Cells[i].Text = tablaPaso3.Rows[0][i].ToString(); // e.Row.Cells[i].HorizontalAlign = HorizontalAlign.Center; // e.Row.Cells[i].VerticalAlign = VerticalAlign.Middle; // } //} }
/// <summary> /// Generates the data. /// </summary> private void GenerateData() { IFont fuenteTitulo = excelFile.CreateFont(); fuenteTitulo.FontName = "Calibri"; //fuenteTitulo.FontHeight = (short)FontSize.Large.GetHashCode(); fuenteTitulo.Boldweight = (short)FontBoldWeight.BOLD.GetHashCode(); IFont unaFuente = excelFile.CreateFont(); unaFuente.FontName = "Tahoma"; //unaFuente.FontHeight = (short)FontSize.Medium.GetHashCode(); IFont fuenteEncabezado = excelFile.CreateFont(); fuenteEncabezado.FontName = "Tahoma"; //fuenteEncabezado.FontHeight = (short)FontSize.Medium.GetHashCode(); ; fuenteEncabezado.Boldweight = (short)FontBoldWeight.BOLD.GetHashCode(); ICellStyle unEstiloDecimal = excelFile.CreateCellStyle(); IDataFormat format = excelFile.CreateDataFormat(); unEstiloDecimal.DataFormat = format.GetFormat("0.00"); unEstiloDecimal.SetFont(unaFuente); #region --[Hoja Datos]-- ISheet hojaUno = excelFile.CreateSheet("Datos"); IRow filaEncabezado = hojaUno.CreateRow(1); filaEncabezado.CreateCell(0).SetCellValue("Criterio"); filaEncabezado.CreateCell(1).SetCellValue("Peso"); filaEncabezado.Cells[1].CellStyle.SetFont(fuenteTitulo); filaEncabezado.CreateCell(2).SetCellValue("Función de Preferencia"); filaEncabezado.Cells[2].CellStyle.SetFont(fuenteTitulo); filaEncabezado.CreateCell(3).SetCellValue("Optimización"); filaEncabezado.Cells[3].CellStyle.SetFont(fuenteTitulo); int idxUno = 2; IRow filaCriterio = hojaUno.CreateRow(idxUno); if (criterioCalificacion.habilitarCriterio) { filaCriterio.CreateCell(0).SetCellValue("Calificaciones"); filaCriterio.Cells[0].CellStyle.SetFont(fuenteTitulo); filaCriterio.CreateCell(1).SetCellValue(Convert.ToDouble(criterioCalificacion.pesoCriterio)); filaCriterio.Cells[1].CellStyle = unEstiloDecimal; filaCriterio.Cells[1].SetCellType(CellType.NUMERIC); filaCriterio.CreateCell(2).SetCellValue(criterioCalificacion.TipoFuncionPreferencia.ToString()); filaCriterio.CreateCell(3).SetCellValue((criterioCalificacion.esMaximzante) ? "Maximizante" : "Minimizante"); idxUno++; } filaCriterio = hojaUno.CreateRow(idxUno); if (criterioInasistencia.habilitarCriterio) { filaCriterio.CreateCell(0).SetCellValue("Inasistencias"); filaCriterio.Cells[0].CellStyle.SetFont(fuenteTitulo); filaCriterio.CreateCell(1).SetCellValue(Convert.ToDouble(criterioInasistencia.pesoCriterio)); filaCriterio.Cells[1].CellStyle = unEstiloDecimal; filaCriterio.Cells[1].SetCellType(CellType.NUMERIC); filaCriterio.CreateCell(2).SetCellValue(criterioInasistencia.TipoFuncionPreferencia.ToString()); filaCriterio.CreateCell(3).SetCellValue((criterioInasistencia.esMaximzante) ? "Maximizante" : "Minimizante"); idxUno++; } filaCriterio = hojaUno.CreateRow(idxUno); if (criterioSancion.habilitarCriterio) { filaCriterio.CreateCell(0).SetCellValue("Sanciones"); filaCriterio.Cells[0].CellStyle.SetFont(fuenteTitulo); filaCriterio.CreateCell(1).SetCellValue(Convert.ToDouble(criterioSancion.pesoCriterio)); filaCriterio.Cells[1].CellStyle = unEstiloDecimal; filaCriterio.Cells[1].SetCellType(CellType.NUMERIC); filaCriterio.CreateCell(2).SetCellValue(criterioSancion.TipoFuncionPreferencia.ToString()); filaCriterio.CreateCell(3).SetCellValue((criterioSancion.esMaximzante) ? "Maximizante" : "Minimizante"); idxUno++; } hojaUno.AutoSizeColumn(0); hojaUno.AutoSizeColumn(1); hojaUno.AutoSizeColumn(2); hojaUno.AutoSizeColumn(3); #endregion DataTable tabla = tablaPaso1.Copy(); string[] alternativas; int indexFila, indexColumna; RptIndicadores alumno; string nombre = string.Empty; for (int i = 0; i < tabla.Rows.Count; i++) { nombre = string.Empty; alternativas = tabla.Rows[i][0].ToString().Split('-'); int.TryParse(alternativas[0], out indexFila); int.TryParse(alternativas[1], out indexColumna); alumno = new RptIndicadores(); if (indexFila > 0) { alumno = lista.Find(p => p.idAlumno == Convert.ToInt16(indexFila)); nombre = alumno.alumnoApellido.Trim() + " " + alumno.alumnoNombre.Trim(); } if (indexColumna > 0) { alumno = lista.Find(p => p.idAlumno == Convert.ToInt16(indexColumna)); nombre += " - " + alumno.alumnoApellido.Trim() + " " + alumno.alumnoNombre.Trim(); } tabla.Rows[i][0] = nombre; } CargaHojaExcel(tabla, "Resultados Parciales Paso 1", "Paso 1", false); tabla = tablaPaso2.Copy(); for (int i = 0; i < tabla.Rows.Count; i++) { nombre = string.Empty; int.TryParse(tabla.Rows[i][0].ToString(), out indexFila); alumno = new RptIndicadores(); if (indexFila > 0) { alumno = lista.Find(p => p.idAlumno == Convert.ToInt16(indexFila)); nombre = alumno.alumnoApellido.Trim() + " " + alumno.alumnoNombre.Trim(); } tabla.Rows[i][0] = nombre; } decimal acumuladorColumna; DataRow nuevaFila = tabla.NewRow(); nuevaFila[0] = "Flujo Saliente"; for (int i = 1; i < tabla.Columns.Count - 2; i++) { acumuladorColumna = 0; for (int j = 0; j < tabla.Rows.Count; j++) { acumuladorColumna += (tabla.Rows[j][i] != DBNull.Value) ? Convert.ToDecimal(tabla.Rows[j][i]) : 0; } nuevaFila[i] = acumuladorColumna; } //tabla.ImportRow(nuevaFila); tabla.Rows.Add(nuevaFila); CargaHojaExcel(tabla, "Resultados Parciales", "Paso 2", false); CargaHojaExcel(tablaResultado, "Resultados", "Resultados", true); }