Hola,
en mi aplicación con mvc, recojo los datos de una BD tras realizar unas query y como resultado, tengo la opción de generar un Excel.
Además de este Excel con los datos ordenados y agrupados de una forma específica, quiero que en el mismo documento, se me cree otra PESTAÑA pero con los datos agrupados y ordenados según otras características. Este proceso es automático, quiero decir, el
usuario no tiene la opción de crear el Excel de una u otra forma. El Excel se deberá generar con las dos pestañas.
¿Me explico?
He copidado el codigo por si alguien tiene el mismo problema/duda.
Un saludo
public FileResult GenerarExcel(string usuario, DateTime? fechadesde, DateTime? fechahasta, string proyecto, EnumsAppNameIncidemcias departamento = EnumsAppNameIncidemcias.NoDefinido)
{
//var lista_usuarios = usuario.Split(',').ToList();
var partes = db.ParteHorasIncidenciasAvenir.AsQueryable();
if (!String.IsNullOrEmpty(usuario))
{
partes = partes.Where(c => c.Nom_Usuario.Contains(usuario));
}
if (fechadesde.HasValue && fechahasta.HasValue)
{
partes = partes.Where(c => c.Fecha >= fechadesde.Value && c.Fecha <= fechahasta.Value);
}
if (!departamento.CompararConEnum(EnumsAppNameIncidemcias.Todos) && !departamento.CompararConEnum(EnumsAppNameIncidemcias.NoDefinido))
{
partes = partes.Where(c => c.Nom_Dep == departamento.ToCodigo());
}
if (!String.IsNullOrEmpty(proyecto))
{
partes = partes.Where(c => c.Proyecto == proyecto);
}
var listapartes = partes.ToList();
using (ExcelPackage pck = new ExcelPackage())
{
var partesAgrupados = listapartes.GroupBy(c => c.Nom_Dep);
foreach (var parteagrupado in partesAgrupados)
{
//Create the worksheet
ExcelWorksheet ws = pck.Workbook.Worksheets.Add(parteagrupado.Key);
ws.Cells["A1"].Value = "Fecha";
ws.Cells["B1"].Value = "Nombre";
ws.Cells["C1"].Value = "Unidad de Negocio";
ws.Cells["D1"].Value = "Proyecto";
ws.Cells["E1"].Value = "Tarea";
ws.Cells["F1"].Value = "Descripcion";
ws.Cells["G1"].Value = "Minutos";
ws.Cells["H1"].Value = "Vinculado a Incidencia";
//Format the header for column 1-3
using (ExcelRange rng = ws.Cells["A1:H1"])
{
rng.Style.Font.Bold = true;
rng.Style.Fill.PatternType = ExcelFillStyle.Solid; //Set Pattern for the background to Solid
rng.Style.Fill.BackgroundColor.SetColor(Color.FromArgb(79, 129, 189)); //Set color to dark blue
rng.Style.Font.Color.SetColor(Color.White);
}
var parteagrupadoOrdenado = parteagrupado.OrderByDescending(c => c.Fecha).ThenBy(c => c.Nom_Usuario);
var i = 2;
foreach (var l in parteagrupadoOrdenado)
{
ws.Cells["A" + i].Value = l.Fecha.ToShortDateString();
ws.Cells["B" + i].Value = l.Nom_Usuario;
ws.Cells["C" + i].Value = l.Nom_Dep;
ws.Cells["D" + i].Value = l.Proyecto;
ws.Cells["E" + i].Value = l.Tarea;
ws.Cells["F" + i].Value = l.Descripción;
ws.Cells["G" + i].Value = l.Minutos;
ws.Cells["H" + i].Value = l.id_I;
i++;
}
}
//Write it back to the client
// Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
//Response.AddHeader("content-disposition", "attachment; filename=ParteIncidencias.xlsx");
var memoryStream = pck.GetAsByteArray();
var fileName = "ParteHorasOrdenado.xlsx";
return base.File(memoryStream, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", fileName);
}
}