En mi exportación ActionResult pude cargar el modelo en mi ExcelPackage.
Donde tengo problemas es asignar un borde alrededor de cada celda una vez que se aplica LoadFromCollection . Si bien AutoFitColumns se aplica correctamente, el estilo de borde que apliqué solo funciona en Cells["D1"] , pero no en la tabla.
BorderAround coloca con éxito un borde alrededor de toda la tabla, pero prefiero aplicar el borde a las celdas dentro de la tabla. ¿Hay alguna manera de que pueda hacer eso?
// Fill worksheet with data to export var modelCells = worksheet.Cells["D1"]; var border = modelCells.Style.Border.Top.Style = modelCells.Style.Border.Left.Style = modelCells.Style.Border.Right.Style = modelCells.Style.Border.Bottom.Style = ExcelBorderStyle.Medium; modelCells .LoadFromCollection(Collection: exportQuery, PrintHeaders: true) .AutoFitColumns();Si sé la cantidad de columnas que tiene el modelo, puedo contar la cantidad de filas con una función y hacer esto:
var modelRows = exportQuery.Count()+1; string modelRange = "D1:F" + modelRows.ToString(); var modelTable = worksheet.Cells[modelRange]; O, con más contexto. Verifiqué que EPPlus aceptará una variable de cadena en Cells[], lo que me permite seleccionar toda la tabla y aplicar mi estilo de borde y AutoFitColumns{} correctamente. Todo lo que tengo que hacer manualmente es ingresar la columna inicial y la columna final en la variable modelRange .
var modelCells = worksheet.Cells["D1"]; var modelRows = exportQuery.Count()+1; string modelRange = "D1:F" + modelRows.ToString(); var modelTable = worksheet.Cells[modelRange]; // Assign borders modelTable.Style.Border.Top.Style = ExcelBorderStyle.Thin; modelTable.Style.Border.Left.Style = ExcelBorderStyle.Thin; modelTable.Style.Border.Right.Style = ExcelBorderStyle.Thin; modelTable.Style.Border.Bottom.Style = ExcelBorderStyle.Thin; // Fill worksheet with data to export modelCells.LoadFromCollection(Collection: exportQuery, PrintHeaders: true); modelTable.AutoFitColumns();Esto hará el truco: hoja de trabajo.Celdas[hoja de trabajo.Dimensión.Dirección]
using (ExcelPackage excel = new ExcelPackage()) { excel.Workbook.Worksheets.Add(sheetName); excel.SaveAs(excelFile); string headerRange = "A1:" + char.ConvertFromUtf32(dtJobs.Columns.Count + 64) + "1"; // Target a worksheet var worksheet = excel.Workbook.Worksheets[sheetName]; #region design Header //worksheet.Cells[headerRange].Style.Font.Bold = true; worksheet.Cells[headerRange].Style.Font.Size = 11; worksheet.Cells[headerRange].Style.Fill.PatternType = ExcelFillStyle.Solid; worksheet.Cells[headerRange].Style.Fill.BackgroundColor.SetColor(Color.DarkGray); //worksheet.Cells[headerRange].Style.WrapText = true; worksheet.Cells[headerRange].Style.Font.Color.SetColor(Color.White); worksheet.Cells[headerRange].Style.HorizontalAlignment = ExcelHorizontalAlignment.Center; worksheet.Cells[headerRange].Style.VerticalAlignment = ExcelVerticalAlignment.Center; #endregion var excelWorksheet = excel.Workbook.Worksheets[sheetName]; excelWorksheet.Cells[excelWorksheet.Dimension.End.Row, 1].LoadFromDataTable(dtJobs, true); worksheet.Cells[worksheet.Dimension.Address].AutoFitColumns(); worksheet.Cells[worksheet.Dimension.Address].Style.Border.Top.Style = ExcelBorderStyle.Thin; worksheet.Cells[worksheet.Dimension.Address].Style.Border.Left.Style = ExcelBorderStyle.Thin; worksheet.Cells[worksheet.Dimension.Address].Style.Border.Right.Style = ExcelBorderStyle.Thin; worksheet.Cells[worksheet.Dimension.Address].Style.Border.Bottom.Style = ExcelBorderStyle.Thin; excel.SaveAs(excelFile); return filePath; } var package = new ExcelPackage(new MemoryStream()); var ws = package.Workbook.Worksheets.Add("Test"); var modelTable = ws.Cells; modelTable.Style.Border.Top.Style = ExcelBorderStyle.Thin; modelTable.Style.Border.Left.Style = ExcelBorderStyle.Thin; modelTable.Style.Border.Right.Style = ExcelBorderStyle.Thin; modelTable.Style.Border.Bottom.Style = ExcelBorderStyle.Thin; modelTable.AutoFitColumns(); // calculate ws.Calculate(); saveFileDialog_SaveExcel.Filter = "Excel files (*.xlsx)|*.xlsx"; var dialogResult = saveFileDialog_SaveExcel.ShowDialog(); if (dialogResult == DialogResult.OK) { package.SaveAs(new FileInfo(saveFileDialog_SaveExcel.FileName)); }