В очередной раз мне нужно сделать экспорт в 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);
}
}

