В очередной раз мне нужно сделать экспорт в Excel. И на этот раз есть требования к шаблону - цвета, форматирование и прочее. Не так давно я реализовал экспорт в Excel с помощью пакета XLSX для React, но он был отрисован на клиенте. Это решение хорошо, но имеет много ограничений. В частности, в бесплатной версии нельзя было использовать форматирование. Да и генерировать большие объемы на клиенте не очень хорошо. Поэтому я начал искать другое решение.
Прежде всего, я попытался использовать OpenXMLSDK. Конечно, можно создать файл Excel, но программный код очень большой. Я понял, что потрачу больше недели, чтобы сделать то, что нужно. Слишком долго. Про него у меня уже было ощущение, что пакет был выпущен только для поддержки открытости.
Во вторую очередь я попробовал NPOI. Намного лучше. Очевидно, я могу работать с этим. Пример рендеринга файла Excel с помощью NPOI приведен ниже.
using NPOI.HSSF.Util; using NPOI.SS.UserModel; using NPOI.SS.Util; using NPOI.XSSF.UserModel; .... public void CreateFile(string filename) { using (var fs = new FileStream(filename, FileMode.Create, FileAccess.Write)) { IWorkbook workbook = new XSSFWorkbook(); ISheet sheet1 = workbook.CreateSheet("Sheet1"); sheet1.AddMergedRegion(new CellRangeAddress(0, 0, 0, 10)); var rowIndex = 0; IRow row = sheet1.CreateRow(rowIndex); row.Height = 30 * 80; row.CreateCell(0).SetCellValue("this is content"); sheet1.AutoSizeColumn(0); rowIndex++; var sheet2 = workbook.CreateSheet("Sheet2"); var style1 = workbook.CreateCellStyle(); style1.FillForegroundColor = HSSFColor.Blue.Index2; style1.FillPattern = FillPattern.SolidForeground; var style2 = workbook.CreateCellStyle(); style2.FillForegroundColor = HSSFColor.Yellow.Index2; style2.FillPattern = FillPattern.SolidForeground; var cell2 = sheet2.CreateRow(0).CreateCell(0); cell2.CellStyle = style1; cell2.SetCellValue(0); cell2 = sheet2.CreateRow(1).CreateCell(0); cell2.CellStyle = style2; cell2.SetCellValue(1); var cell3 = sheet2.CreateRow(2).CreateCell(0); var style3 = workbook.CreateCellStyle(); style3.FillForegroundColor = IndexedColors.Red.Index; style3.FillPattern = FillPattern.SolidForeground; cell3.CellStyle = style3; cell3.SetCellValue("Render by red color"); workbook.Write(fs); } }
Наконец, я решил попробовать ClosedXML. Как по мне, это самый гибкий пакет для рендеринга Excel. Функции со стилями легко применять, также можно использовать формулы и фильтры. Пример рендеринга файла Excel с помощью ClosedXML приведен ниже.
using ClosedXML.Excel; .... public void RenderXLSX(string filename) { using (var workbook = new XLWorkbook()) { var worksheet = workbook.Worksheets.Add("Sheet 1"); var worksheet2 = workbook.Worksheets.Add("Sheet 2"); var worksheet3 = workbook.Worksheets.Add("Sheet 3"); var style = workbook.Style; style.Border.LeftBorder = XLBorderStyleValues.Thin; style.Border.LeftBorderColor = XLColor.Black; style.Border.RightBorder = XLBorderStyleValues.Thin; style.Border.RightBorderColor = XLColor.Black; style.Border.TopBorder = XLBorderStyleValues.Thin; style.Border.TopBorderColor = XLColor.Black; style.Border.BottomBorder = XLBorderStyleValues.Thin; style.Border.BottomBorderColor = XLColor.Black; var range = worksheet.Range("A1:D1").Style = style; worksheet.Row(1).Style.Fill.BackgroundColor = XLColor.FromArgb(220, 230, 241); worksheet.Cell("A1").Value = "Hello World!"; worksheet.Cell("A2").FormulaA1 = "=MID(A1, 7, 5)"; var blueRow = worksheet.Row(5); int startRow = 5; for (int i = 0; i < 10; i++) { int currentRow = startRow + i; worksheet.Cell(currentRow, i+ 1).Value = $"Test {i}" ; } workbook.SaveAs(filename); } }