Создаем excel документ (c#)

Есть много библиотек, с помощью которых можно создать excel документ.
В данной заметке я опишу как использовать библиотеку Epplus.

public static class ExcelUtils
{
    public static DataTable ExcelToDataTable(string path)
    {
        // https://calmsen.ru/parsim-excel/
    }

    private static void SetDefaultOptions(Dictionary<string, string> options)
    {
        if (!options.ContainsKey("Worksheet.name")) options["Worksheet.Name"] = "Лист1";
        if (!options.ContainsKey("Worksheet.TabColor")) options["Worksheet.TabColor"] = "Blue";
        if (!options.ContainsKey("Worksheet.DefaultColWidth")) options["Worksheet.DefaultColWidth"] = "24";
        if (!options.ContainsKey("Worksheet.DefaultRowHeight")) options["Worksheet.DefaultRowHeight"] = "12";
        if (!options.ContainsKey("Th.Style.Font.Bold")) options["Th.Style.Font.Bold"] = "true";
        if (!options.ContainsKey("Th.Style.Fill.BackgroundColor")) options["Th.Style.Fill.BackgroundColor"] = "Black";
        if (!options.ContainsKey("Th.Style.Fill.Color")) options["Th.Style.Fill.Color"] = "WhiteSmoke";
        if (!options.ContainsKey("Td.Style.Font.Bold")) options["Td.Style.Font.Bold"] = "false";
        if (!options.ContainsKey("Td.Style.Fill.BackgroundColor")) options["Td.Style.Fill.BackgroundColor"] = "LightSteelBlue";
        if (!options.ContainsKey("Td.Style.Fill.Color")) options["Td.Style.Fill.Color"] = "Black";
    }
    private static void SetWorkSheetStyles(ExcelWorksheet worksheet, Dictionary<string, string> options)
    {
        worksheet.TabColor = (Color)typeof(Color).GetProperty(options["Worksheet.TabColor"]).GetValue(null, null);
        worksheet.DefaultRowHeight = Int32.Parse(options["Worksheet.DefaultRowHeight"]);
        worksheet.DefaultColWidth = Int32.Parse(options["Worksheet.DefaultColWidth"]);
        /*worksheet.HeaderFooter.FirstFooter.LeftAlignedText = string.Format("Generated: {0}", DateTime.Now.ToShortDateString());
        worksheet.Row(1).Height = 20;*/
    }
    private static void SetThStyle(ExcelRange range, Dictionary<string, string> options)
    {
        range.AutoFilter = true;
        range.Style.Font.Bold = Boolean.Parse(options["Th.Style.Font.Bold"]);
        range.Style.Fill.PatternType = ExcelFillStyle.Solid;
        range.Style.Fill.BackgroundColor.SetColor((Color)typeof(Color).GetProperty(options["Th.Style.Fill.BackgroundColor"]).GetValue(null, null));
        range.Style.Font.Color.SetColor((Color)typeof(Color).GetProperty(options["Th.Style.Fill.Color"]).GetValue(null, null));
        range.Style.ShrinkToFit = false;
    }
    private static void SetTdStyle(ExcelRange range, Dictionary<string, string> options)
    {
        range.Style.Font.Bold = Boolean.Parse(options["Td.Style.Font.Bold"]);
        range.Style.Fill.PatternType = ExcelFillStyle.Solid;
         range.Style.Fill.BackgroundColor.SetColor((Color)typeof(Color).GetProperty(options["Td.Style.Fill.BackgroundColor"]).GetValue(null, null));
        range.Style.Font.Color.SetColor((Color)typeof(Color).GetProperty(options["Td.Style.Fill.Color"]).GetValue(null, null));
        range.Style.ShrinkToFit = false;
    }
    public static void DataTableToExcel(DataTable dt, string path, Dictionary<string, string> options = null)
    {
        if (options == null)
            options = new Dictionary<string, string>();

        SetDefaultOptions(options);

        // Create the file using the FileInfo object
        var file = new FileInfo(path);
        // Create the package and make sure you wrap it in a using statement
        using (var package = new ExcelPackage(file))
        {
            // add a new worksheet to the empty workbook
            ExcelWorksheet worksheet = package.Workbook.Worksheets.Add(options["Worksheet.Name"]);

            // Add some formatting to the worksheet
            SetWorkSheetStyles(worksheet, options);

            for (int i = 0; i < dt.Columns.Count; i++)
            {
                worksheet.Cells[1, i + 1].Value = dt.Columns[i].ColumnName;
            }
            // format the first row of the header
            using (var range = worksheet.Cells[1, 1, 1, dt.Columns.Count])
            {
                SetThStyle(range, options);
            }

            for (int i = 0; i < dt.Rows.Count; i++)
            {
                for (int j = 0; j < dt.Columns.Count; j++)
                {
                    worksheet.Cells[i + 2, j + 1].Value = dt.Rows[i][j];

                    // format the ordinal row
                    if (j == dt.Columns.Count - 1)
                    {
                        using (var range = worksheet.Cells[i + 2, 1, i + 2, dt.Columns.Count])
                        {
                            SetTdStyle(range, options);
                        }
                    }
                }
            }

            // Fit the columns according to its content
            for (int i = 0; i < dt.Columns.Count; i++)
                worksheet.Column(i + 1).AutoFit();

            // Set some document properties
            /*package.Workbook.Properties.Title = "Sales list";
            package.Workbook.Properties.Author = "Gustaf Lindqvist @ Ted & Gustaf";
            package.Workbook.Properties.Company = "Ted & Gustaf";*/

            // save our new workbook and we are done!
            package.Save();
        }
    }
}

Используем так:

DataTable table = new DataTable();
table.Columns.Add("UserName", typeof(string));
table.Columns.Add("UserAge", typeof(int));
table.Rows.Add("David", 25);
table.Rows.Add("Sam", 34);

ExcelUtils.DataTableToExcel(table, @"d:\Temp\Users.xlsx");

PS: Перед тем как использовать эту библиотеку я протестировал следующие библиотеки:

  1. OleDbConnection  — excel файл можно создать путем заданного шаблона и затем последующего изменения файла. То есть файл нельзя создать с нуля, можно только редактировать
  2. Microsoft.Office.Interop.Excel позволяет создавать excel документы, но на сервере должен быть установлен office
  3. spreadsheetlight создает excel документы, зависит от библиотеки openxml и почему-то только c версией 2.0
  4. closedxml — создает excel документ и так же зависит от openxml. На стековерфлоу вычитал что она медленнее чем epplus.

Ссылки:

По теме:
Выполняем get запрос по расписанию c#

Напишем простенькую программу, которая будет выполнять get запрос по истечению определенного интервала времени. class Program { private static Timer _timer; Read more

Выполняем действие по расписанию (asp.net, c#)

Раньше я писал программку, которая выполняла get запрос по расписанию, но так же можно написать обычный HttpModule, который будет делать Read more

Выбираем технологии и инструменты для разработки веб приложений

1 Выбор и настройка инструментов для разработки фронтенда (только самые важные): 1.1 Twitter bootstrap — фреймворк позволяет писать качественную верстку Read more

Делаем водяной знак на картинке (c#, .net)

Нанесем несколько раз картинку watermark на другую картинку. public void DrawWatermark(string watermarkImagePath, System.Drawing.Image image) { using (System.Drawing.Image watermarkImage = System.Drawing.Image.FromFile(watermarkImagePath)) Read more

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *