Гибкий и простой экспорт в Excel для .Net

.Net Core

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

Комментариев нет »

No comments yet.

RSS feed for comments on this post. TrackBack URL

Leave a comment







MarkiMarta.ru. Записки отца-программиста" с 2009 г.
Категория информационной продукции 18+
Яндекс.Метрика