С компонент для лист excel

using System;

using System.IO;

using OfficeOpenXml;

using OfficeOpenXml.Style;

class Program

{

    static void Main(string[] args)

    {

        var Articles = new[]

        {

                new {

                    Id = "101", Name = "C++"

                },

                new {

                    Id = "102", Name = "Python"

                },

                new {

                    Id = "103", Name = "Java Script"

                },

                new {

                    Id = "104", Name = "GO"

                },

                new {

                    Id = "105", Name = "Java"

                },

                new {

                    Id = "106", Name = "C#"

                }

            };

        ExcelPackage excel = new ExcelPackage();

        var workSheet = excel.Workbook.Worksheets.Add("Sheet1");

        workSheet.TabColor = System.Drawing.Color.Black;

        workSheet.DefaultRowHeight = 12;

        workSheet.Row(1).Height = 20;

        workSheet.Row(1).Style.HorizontalAlignment = ExcelHorizontalAlignment.Center;

        workSheet.Row(1).Style.Font.Bold = true;

        workSheet.Cells[1, 1].Value = "S.No";

        workSheet.Cells[1, 2].Value = "Id";

        workSheet.Cells[1, 3].Value = "Name";

        int recordIndex = 2;

        foreach (var article in Articles)

        {

            workSheet.Cells[recordIndex, 1].Value = (recordIndex - 1).ToString();

            workSheet.Cells[recordIndex, 2].Value = article.Id;

            workSheet.Cells[recordIndex, 3].Value = article.Name;

            recordIndex++;

        }

        workSheet.Column(1).AutoFit();

        workSheet.Column(2).AutoFit();

        workSheet.Column(3).AutoFit();

        string p_strPath = "H:\geeksforgeeks.xlsx";

        if (File.Exists(p_strPath))

            File.Delete(p_strPath);

        FileStream objFileStrm = File.Create(p_strPath);

        objFileStrm.Close();

        File.WriteAllBytes(p_strPath, excel.GetAsByteArray());

        excel.Dispose();

        Console.ReadKey();

    }

}

Содержание

  • Введение
  • Добавление необходимых ссылок в решение
  • Работа с объектом Application (Excel)
    • Запуск и остановка Microsoft Excel в C#
    • Создание рабочей книги Excel в C#
    • Работа с листами Excel в C#. Hello Excel
  • Итого

уважаемые посетители блога, если Вам понравилась, то, пожалуйста, помогите автору с лечением. Подробности тут.

При разработки различных программ для анализа данных нередко требуется не только обрабатывать большие массивы данных, но и предоставить конечному пользователю удобно оформленный отчёт о работе программного обеспечения. В сегодняшних реалиях экономия килобайт оперативной памяти при разработке программного обеспечения уже не так важна по сравнению с удобством работы программного продукта. Не секрет, что при работе в Windows для наиболее удобного представления табличных данных является Microsoft Excel. В этой и других статьях, посвященных работе с Excel в .NET Core и C# я постараюсь рассмотреть наиболее частые задачи по импорту и экспорту данных между приложением и Microsoft Excel. Сегодня мы рассмотрим как использовать MS Excel в .NET Core, используя технологию COM.

Введение

Разработка программ, взаимодействующих с пакетом Microsoft Office, вне зависимости от среды разработки, будь то Visual Studio С# или Delphi, основана на применении так называемой объектной модели Microsoft Office. Взаимодействие с объектами такой модели базируется на технологии OLE (Object Linking and Embedding, связывание и внедрение объектов), которая, в свою очередь, использует технологический стандарт COM (Component Object Model — модель компонентного объекта).

Существует достаточно много решений, позволяющих работать с Microsoft Excel в Visual Studio .NET о которых мы, вполне возможно, поговорим позднее. Сейчас же мы будем учиться использовать возможности Microsoft Excel, опираясь исключительно на объектную модель Microsoft Office и те возможности, которые она предоставляет разработчикам, так сказать, «из коробки».

Добавление необходимых ссылок в решение

Для подключения в решение библиотек для взаимодействия с Microsoft Excel необходимо добавить добавьте следующие ссылки:

  • Microsoft Excel 16.0 Object Library
  • Microsoft Office 16.0 Object Library

В Visual Studio это делается следующим образом:

1. В «Обозревателе решений» кликаем правой кнопкой мыши по строке «Зависимости» и выбираем пункт «Добавить ссылку на модель COM»

2. В открывшемся окне в строке поиска набираем «Microsoft», выбираем необходимые ссылки, то есть Microsoft Excel 16.0 Object Library и Microsoft Office 16.0 Object Library и жмем «Ok»:

После этого, в обозревателе решений для нашего проекта в зависимостях появятся следующие ссылки:

Зависимости
   COM
      Interop.Microsoft.Office.Core
      Interop.Microsoft.Office.Interop.Excel
   Платформы
      Microsoft.NetCore.App

Теперь, чтобы наше решение для .NET Core могло полноценно использовать возможности Microsoft Excel необходимо указать в решении, что все типы, используемые в объектной модели Microsoft Office будут использоваться в нашей сборке. Чтобы это сделать выбираем в зависимостях нашего решения каждую ссылку из раздела COM и в разделе «Свойства» указываем напротив пункта «Внедрить типы взаимодействия» значение «Да». На рисунке ниже представлен пример для ссылки Interop.Microsoft.Office.Core

Если не выполнить эти действия, то при разработки приложения .NET Core при попытке работы с Excel вы получите следующую ошибку:

System.IO.FileNotFoundException HResult=0x80070002
Сообщение = Could not load file or assembly ‘office, Version=15.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c’. Не удается найти указанный файл.
Источник = <Не удается определить источник исключения>
Трассировка стека: <Не удается определить трассировку стека исключения>

Работа с объектом Application (Excel)

Объект Application представляет всё приложение Microsoft Excel. С помощью этого объекта в C# мы можем запускать и останавливать работу Excel, получать доступ к рабочим книгам Excel и так далее. Посмотрим, как можно взаимодействовать с Excel в C#, используя объект Application.

Запуск и остановка Microsoft Excel в C#

Чтобы продемонстрировать запуск и остановку Excel в C# подключим в наше решение пространство имен Microsoft.Office.Interop.Excel, используя псевдоним:

using Excel = Microsoft.Office.Interop.Excel;

Теперь напишем следующий код для метода Main():

using System;
using Excel = Microsoft.Office.Interop.Excel;
using System.Runtime.InteropServices;

namespace ExcelApp
{
    class Program
    {
        static void Main(string[] args)
        {
            Excel.Application application = new Excel.Application();
            Console.WriteLine("Объект Excel.Application создан");
            Console.ReadKey();
            application.Visible = true;
            Console.WriteLine("Окно Excel видно пользователю");
                        
            Console.ReadKey();
            Console.WriteLine("Закрываем Excel");
           
            application.Quit();
            Marshal.ReleaseComObject(application);
        }
    }
}

Разберемся с тем, что происходит в нашем приложении при запуске. Вначале мы создаем объект application типа Excel.Application (Excel — псевдоним пространства имен Microsoft.Office.Interop.Excel). После выполнения этой строки кода происходит запуск процесса Microsoft Excel. Убедиться в этом можно, открыв диспетчер задач Windows и заглянув в раздел «Фоновые процессы»:

Чтобы показать главное окно Excel пользователю, мы устанавливаем значение true свойству Visible:

application.Visible = true;

И, наконец, для того, чтобы закрыть Excel и освободить память, занятую процессом Excel мы вызываем метод Quit().

application.Quit()

Таким образом, всё, что пока делает наше приложение .NET Core — это запускает процесс Microsoft Excel, показывает окно Excel и закрывает приложение. При этом, стоит обратить внимание на следующий момент: так как чаще всего мы будем взаимодействовать с Excel в C# в фоновом режиме без показа главного окна, то по окончанию взаимодействия необходимо обязательно вызывать метод Quit() объекта Application и вызвать метод объекта Marshal.ReleaseComObject(application) из пространства имен System.Runtime.InteropServices. Если этого не сделать, то после N запусков нашего приложения мы рискуем «забить» оперативную память компьютера неиспользуемыми процессами Excel, так как после остановки нашего приложения и вызова Quit() внешний процесс (Excel) автоматически не завершается. Продемонстрировать это можно, написав всего две строки кода:

static void Main(string[] args)
  {
      Excel.Application application = new Excel.Application();
      application.Quit();
  }

и запустить приложение несколько раз. Например, на рисунке ниже показан диспетчер задач после трех запусков нашего приложения:

Создание рабочей книги Excel в C#

Следующий пример демонстрирует создание новой рабочей книги Excel в C#:

using System;
using Excel = Microsoft.Office.Interop.Excel;
using System.Runtime.InteropServices;

namespace ExcelApp
{
    class Program
    {
        static void Main(string[] args)
        {
            //Объявляем переменную приложения Excel 
            Excel.Application application = null;
            //объявляем переменные для коллекции рабочих книг 
            //и одной рабочей книги
            Excel.Workbooks workbooks = null;
            Excel.Workbook workbook = null;
            try
            {
                //создаем объект Application
                application = new Excel.Application();
                Console.WriteLine("Объект Excel.Application создан");
                Console.ReadKey();
                //показываем окно Excel пользователю
                application.Visible = true;
                Console.WriteLine("Окно Excel видно пользователю");
                //получаем ссылку на коллекцию рабочих книг
                workbooks = application.Workbooks;
                //добавляем новую рабочую книгу в коллекцию
                workbook = workbooks.Add();
                Console.ReadKey();
                Console.WriteLine("Закрываем Excel");
                application.Quit();
            }
            finally
            {
                //освобождаем память, занятую объектами
                Marshal.ReleaseComObject(workbook);
                Marshal.ReleaseComObject(workbooks);
                Marshal.ReleaseComObject(application);

            }
        }
    }
}

На первый взгляд, может показаться, что этот код вполне можно упростить, например, избавившись от «лишних» переменной workbooks,  например так:

workbook = application.Workbooks.Add();

Такой код, безусловно, будет короче и рабочая книга также будет создана, НО при этом, память выделенная для процесса Excel не будет освобождена по причине того, что в приведенной выше строке кода мы на самом деле создаем не один, а два объекта: объект типа Excel.Workbooks и объект типа Excel.Workbook и, соответственно, оба эти объекта нам необходимо освободить после работы с ними.

Исходя из вышеизложенного, можно определить для себя два следующих правила работы с COM в C#:

Никогда не использовать две и более точек при работе с COM

О том, из-за чего процесс Excel может зависать — смотрите в этой статье.

Работа с листами Excel в C#. Hello Excel

В следующем примере демонстрируется то, как получить доступ к первому листу рабочей книги и записи в ячейку A1 строки «Hello Excel«:

using Excel = Microsoft.Office.Interop.Excel;
using System.Runtime.InteropServices;

namespace ExcelApp
{
    class Program
    {
        static void Main(string[] args)
        {
            Excel.Application application = null;
            Excel.Workbooks workbooks = null;
            Excel.Workbook workbook = null;
            Excel.Sheets worksheets = null;
            Excel.Worksheet worksheet = null;
            //переменная для хранения диапазона ячеек
            //в нашем случае - это будет одна ячейка
            Excel.Range cell = null;
            try
            {
                application = new Excel.Application
                {
                    Visible = true
                };
                workbooks = application.Workbooks;
                workbook = workbooks.Add();
                worksheets = workbook.Worksheets; //получаем доступ к коллекции рабочих листов
                worksheet = worksheets.Item[1];//получаем доступ к первому листу
                cell = worksheet.Cells[1, 1];//получаем доступ к ячейке
                cell.Value = "Hello Excel";//пишем строку в ячейку A1
                application.Quit();
            }
            finally
            {
                //освобождаем память, занятую объектами
                Marshal.ReleaseComObject(cell);
                Marshal.ReleaseComObject(worksheet);
                Marshal.ReleaseComObject(worksheets);
                Marshal.ReleaseComObject(workbook);
                Marshal.ReleaseComObject(workbooks);
                Marshal.ReleaseComObject(application);

            }
        }
    }
}

После запуска этого приложения откроется Excel, создастся рабочая книга, на первом листе рабочей книги в ячейке А1 появится строка «Hello Excel» после чего Excel попросит сохранить книгу. После отказа сохранения Excel закроется и память процесса Microsoft Excel будет освобождена.

Итого

Итак, сегодня мы рассмотрели основные моменты по работе с Microsoft Excel в C# и .NET Core: научились создавать процесс Microsoft Excel, создавать рабочую книгу, записывать текст в ячейки листа Excel и корректно освобождать память после работы с Excel в C#. В следующий раз мы продолжим разбираться с темой использования возможностей Excel в .NET Core и более детально познакомимся с объектной моделью Microsoft Office.

уважаемые посетители блога, если Вам понравилась, то, пожалуйста, помогите автору с лечением. Подробности тут.

Оставляю заметку по работе с Excel с помощью C#.

Привожу фрагменты кода, которые искал когда-то сам для работы с Excel документами.

Наработки очень пригодились в работе для формирования отчетности.

Прежде всего нужно подключить библиотеку Microsoft.Office.Interop.Excel.

Подключение Microsoft.Office.Interop.Excel

Visual Studio здесь довольно старой версии. Если у вас версия новая, отличаться будет только вид окна.

Далее создаем псевдоним для работы с Excel:

using Excel = Microsoft.Office.Interop.Excel;

//Объявляем приложение
Excel.Application ex = new Microsoft.Office.Interop.Excel.Application();
//Отобразить Excel
ex.Visible = true;
//Количество листов в рабочей книге
ex.SheetsInNewWorkbook = 2;
//Добавить рабочую книгу
Excel.Workbook workBook = ex.Workbooks.Add(Type.Missing);
//Отключить отображение окон с сообщениями
ex.DisplayAlerts = false;                                       
//Получаем первый лист документа (счет начинается с 1)
Excel.Worksheet sheet = (Excel.Worksheet)ex.Worksheets.get_Item(1);
//Название листа (вкладки снизу)
sheet.Name = "Отчет за 13.12.2017";
//Пример заполнения ячеек
for (int i = 1; i <= 9; i++)
{
  for (int j = 1; j < 9; j++)
  sheet.Cells[i, j] = String.Format("Boom {0} {1}", i, j);
}
//Захватываем диапазон ячеек
Excel.Range range1 = sheet.get_Range(sheet.Cells[1, 1], sheet.Cells[9, 9]);
//Шрифт для диапазона
range1.Cells.Font.Name = "Tahoma";
//Размер шрифта для диапазона
range1.Cells.Font.Size = 10;
//Захватываем другой диапазон ячеек
Excel.Range range2 = sheet.get_Range(sheet.Cells[1, 1], sheet.Cells[9, 2]);
range2.Cells.Font.Name = "Times New Roman";
//Задаем цвет этого диапазона. Необходимо подключить System.Drawing
range2.Cells.Font.Color = ColorTranslator.ToOle(Color.Green);
//Фоновый цвет
range2.Interior.Color = ColorTranslator.ToOle(Color.FromArgb(0xFF, 0xFF, 0xCC));

Расстановка рамок

Расставляем рамки со всех сторон:

range2.Borders.get_Item(Excel.XlBordersIndex.xlEdgeBottom).LineStyle = Excel.XlLineStyle.xlContinuous;
range2.Borders.get_Item(Excel.XlBordersIndex.xlEdgeRight).LineStyle = Excel.XlLineStyle.xlContinuous;
range2.Borders.get_Item(Excel.XlBordersIndex.xlInsideHorizontal).LineStyle = Excel.XlLineStyle.xlContinuous;
range2.Borders.get_Item(Excel.XlBordersIndex.xlInsideVertical).LineStyle = Excel.XlLineStyle.xlContinuous;
range2.Borders.get_Item(Excel.XlBordersIndex.xlEdgeTop).LineStyle = Excel.XlLineStyle.xlContinuous;

Цвет рамки можно установить так:

range2.Borders.Color = ColorTranslator.ToOle(Color.Red);

Выравнивания в диапазоне задаются так:

rangeDate.VerticalAlignment = Excel.XlVAlign.xlVAlignCenter;
rangeDate.HorizontalAlignment = Excel.XlHAlign.xlHAlignLeft;

Формулы

Определим задачу: получить сумму диапазона ячеек A4:A10.

Для начала снова получим диапазон ячеек:

Excel.Range formulaRange = sheet.get_Range(sheet.Cells[4, 1], sheet.Cells[9, 1]);

Далее получим диапазон вида A4:A10 по адресу ячейки ( [4,1]; [9;1] ) описанному выше:

string adder = formulaRange.get_Address(1, 1, Excel.XlReferenceStyle.xlA1, Type.Missing, Type.Missing);

Теперь в переменной adder у нас хранится строковое значение диапазона ( [4,1]; [9;1] ), то есть A4:A10.

Вычисляем формулу:

//Одна ячейка как диапазон
Excel.Range r = sheet.Cells[10, 1] as Excel.Range;
//Оформления
r.Font.Name = "Times New Roman";
r.Font.Bold = true;
r.Font.Color = ColorTranslator.ToOle(Color.Blue);
//Задаем формулу суммы
r.Formula = String.Format("=СУММ({0}", adder);

Выделение ячейки или диапазона ячеек

Так же можно выделить ячейку или диапазон, как если бы мы выделили их мышкой:

sheet.get_Range("J3", "J8").Activate();
//или
sheet.get_Range("J3", "J8").Select();
//Можно вписать одну и ту же ячейку, тогда будет выделена одна ячейка.
sheet.get_Range("J3", "J3").Activate();
sheet.get_Range("J3", "J3").Select();

Авто ширина и авто высота

Чтобы настроить авто ширину и высоту для диапазона, используем такие команды:

range.EntireColumn.AutoFit(); 
range.EntireRow.AutoFit();

Получаем значения из ячеек

Чтобы получить значение из ячейки, используем такой код:

//Получение одной ячейки как ранга
Excel.Range forYach = sheet.Cells[ob + 1, 1] as Excel.Range;
//Получаем значение из ячейки и преобразуем в строку
string yach = forYach.Value2.ToString();

Добавляем лист в рабочую книгу

Чтобы добавить лист и дать ему заголовок, используем следующее:

var sh = workBook.Sheets;
Excel.Worksheet sheetPivot = (Excel.Worksheet)sh.Add(Type.Missing, sh[1], Type.Missing, Type.Missing);
sheetPivot.Name = "Сводная таблица";

Добавление разрыва страницы

//Ячейка, с которой будет разрыв
Excel.Range razr = sheet.Cells[n, m] as Excel.Range;
//Добавить горизонтальный разрыв (sheet - текущий лист)
sheet.HPageBreaks.Add(razr); 
//VPageBreaks - Добавить вертикальный разрыв

Сохраняем документ

ex.Application.ActiveWorkbook.SaveAs("doc.xlsx", Type.Missing,
  Type.Missing, Type.Missing, Type.Missing, Type.Missing, Excel.XlSaveAsAccessMode.xlNoChange,
  Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing);

Как открыть существующий документ Excel

ex.Workbooks.Open(@"C:UsersMyuserDocumentsExcel.xlsx",
  Type.Missing, Type.Missing, Type.Missing, Type.Missing,
  Type.Missing, Type.Missing, Type.Missing, Type.Missing,
  Type.Missing, Type.Missing, Type.Missing, Type.Missing,
  Type.Missing, Type.Missing);

Комментарии

При работе с Excel с помощью C# большую помощь может оказать редактор Visual Basic, встроенный в Excel.

Для этого в настройках ленты надо добавить пункт «Разработчик». Далее начинаем запись макроса, производим действия и останавливаем запись.

Далее заходим в редактор Visual Basic и смотрим код, который туда записался:

Vusial Basic (VBA)

Например:

Sub Макрос1()
'
' Макрос1 Макрос
'
'
    Range("E88").Select
    ActiveSheet.ListObjects.Add(xlSrcRange, Range("$A$1:$F$118"), , xlYes).Name = _
        "Таблица1"
    Range("A1:F118").Select
    ActiveSheet.ListObjects("Таблица1").TableStyle = "TableStyleLight9"
    Range("E18").Select
    ActiveWindow.SmallScroll Down:=84
End Sub

В данном макросе записаны все действия, которые мы выполнили во время его записи. Эти методы и свойства можно использовать в C# коде.

Данный метод так же может оказать помощь в формировании относительных формул, например, выполнить сложение чисел, находящиеся слева от текущей ячейки на 4 столбца, и т.п. Пример:

//Складываем значения предыдущих 12 ячеек слева
rang.Formula = "=СУММ(RC[-12]:RC[-1])";

Так же во время работы может возникнуть ошибка: метод завершен неверно. Это может означать, что не выбран лист, с которым идет работа.

Чтобы выбрать лист, выполните sheetData.Select(Type.Missing); где sheetData это нужный лист.

Все привет, в этой статье опишу исчерпывающие примеры работы с excel на языке C#.

Для начала работы нам необходимо подключить библиотеку COM как на рисунке ниже:

Для этого добавляем ссылку в проект, надеюсь вы знаете как это делается) Выбираем пункт COM ищем библиотеку Microsoft Excel 16.0 Object Library ставим галочку и жмем Ок.

Далее нам не обходимо для сокращения записи и удобства создать алиас.

using Excel = Microsoft.Office.Interop.Excel;

Теперь нам нужно объявить объект Excel задать параметры и приступать к работе.

//Объявляем приложение

            Excel.Application app = new Excel.Application

            {

                //Отобразить Excel

                Visible = true,

                //Количество листов в рабочей книге

                SheetsInNewWorkbook = 2

            };

            //Добавить рабочую книгу

            Excel.Workbook workBook = app.Workbooks.Add(Type.Missing);

            //Отключить отображение окон с сообщениями

            app.DisplayAlerts = false;

            //Получаем первый лист документа (счет начинается с 1)

            Excel.Worksheet sheet = (Excel.Worksheet)app.Worksheets.get_Item(1);

            //Название листа (вкладки снизу)

            sheet.Name = «Имя должно быть не больше 32сим»;

Пример заполнения ячейки:

           //Пример заполнения ячеек №1

            for (int i = 1; i <= 9; i++)

            {

                for (int j = 1; j < 9; j++)

                    sheet.Cells[i, j] = String.Format(«nookery {0} {1}», i, j);

            }

            //Пример №2

            sheet.Range[«A1»].Value = «Пример №2»;

            //Пример №3

            sheet.get_Range(«A2»).Value2 = «Пример №3»;

Захват диапазона ячеек:

            //Захватываем диапазон ячеек Вариант №1

            Excel.Range r1 = sheet.Cells[1, 1];

            Excel.Range r2 = sheet.Cells[9, 9];

            Excel.Range range1 = sheet.get_Range(r1, r2);

            //Захватываем диапазон ячеек Вариант №2

            Excel.Range range2 = sheet.get_Range(«A1»,«H9» );

Оформление, шрифт, размер, цвет, толщина.

            //Шрифт для диапазона

              range.Cells.Font.Name = «Tahoma»;

              range2.Cells.Font.Name = «Times New Roman»;

            //Размер шрифта для диапазона

              range.Cells.Font.Size = 10;

            //Жирный текст

              range.Font.Bold = true;

            //Цвет текста

              range.Font.Color = ColorTranslator.ToOle(Color.Blue);

Объединение ячеек в одну

  //Объединение ячеек с F2 по K2

    Excel.Range range3 = sheet.get_Range(«F2», «K2»);

    range3.Merge(Type.Missing);

Изменяем размеры ячеек по ширине и высоте

//увеличиваем размер по ширине диапазон ячеек

   Excel.Range range2 = sheet.get_Range(«D1», «S1»);

   range2.EntireColumn.ColumnWidth = 10;

//увеличиваем размер по высоте диапазон ячеек

   Excel.Range rowHeight = sheet.get_Range(«A4», «S4»);

   rowHeight.EntireRow.RowHeight = 50;range.EntireColumn.AutoFit();range.EntireColumn.AutoFit(); //авторазмер

Создаем обводку диапазона ячеек

Excel.Range r1 = sheet.Cells[countRow, 2];

Excel.Range r2 = sheet.Cells[countRow, 19];

Excel.Range rangeColor = sheet.get_Range(r1, r2);

rangeColor.Borders.Color = ColorTranslator.ToOle(Color.Black);

Производим выравнивания содержимого диапазона ячеек.

  Excel.Range r = sheet.get_Range(«A1», «S40»);

  //Оформления

  r.Font.Name = «Calibri»;

  r.Cells.Font.Size = 10;

  r.VerticalAlignment = Excel.XlVAlign.xlVAlignCenter;

  r.HorizontalAlignment = Excel.XlHAlign.xlHAlignCenter;

Примеры вычисления формул, все вставки формул были скопированы из самой Excel без изменений. Позиция ячейки взята из счетчика переменно и подставлен к букве ячейки

sheet.Cells[countRow, countColumn] = $«=G{countRow}-F{countRow}»;

sheet.Cells[countRow, countColumn].FormulaLocal = $«=ЕСЛИ((H{countRow}*O{countRow})+(I{countRow}*P{countRow})/100<=0;J{countRow}*O{countRow}/100;((H{countRow}*O{countRow})+(I{countRow}*P{countRow}))/100)»;

sheet.Cells[countRow, countColumn] = $«=K{countRow}+N{countRow}-R{countRow}»;

sheet.Cells[33, 22].FormulaLocal = «=СУММ(V3:V32)»;

Добавляем разрыв страницы.

//Ячейка, с которой будет разрыв

Excel.Range razr = sheet.Cells&#91;n, m] as Excel.Range;

//Добавить горизонтальный разрыв (sheet — текущий лист)

sheet.HPageBreaks.Add(razr);

//VPageBreaks — Добавить вертикальный разрыв

Как открыть фаил Excel

app.Workbooks.Open(@»C:UsersUserDocumentsExcel.xlsx»,

  Type.Missing, Type.Missing, Type.Missing, Type.Missing,

  Type.Missing, Type.Missing, Type.Missing, Type.Missing,

  Type.Missing, Type.Missing, Type.Missing, Type.Missing,

  Type.Missing, Type.Missing);

Сохраняем документ Excel

app.Application.ActiveWorkbook.SaveAs(«MyFile.xlsx», Type.Missing,

  Type.Missing, Type.Missing, Type.Missing, Type.Missing, Excel.XlSaveAsAccessMode.xlNoChange,

  Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing);

Завершение работы с объектом Excel.Application

app.Quit();

System.Runtime.InteropServices.Marshal.ReleaseComObject(app);

Пример как выбрать фаил и загрузив его и узнать количество заполненных строк и колонок в одном конкретном листе по имени.

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

//поиск файла Excel

            OpenFileDialog ofd = new OpenFileDialog();

            ofd.Multiselect =false;

            ofd.DefaultExt = «*.xls;*.xlsx»;

            ofd.Filter = «Microsoft Excel (*.xls*)|*.xls*»;

            ofd.Title = «Выберите документ Excel»;

            if (ofd.ShowDialog() != DialogResult.OK)

            {

                MessageBox.Show(«Вы не выбрали файл для открытия», «Внимание», MessageBoxButtons.OK, MessageBoxIcon.Information);

                return;

            }

            string xlFileName = ofd.FileName; //имя нашего Excel файла

            //рабоата с Excel

            Excel.Range Rng;            

            Excel.Workbook xlWB;

            Excel.Worksheet xlSht;

            int iLastRow, iLastCol;

            Excel.Application xlApp = new Excel.Application(); //создаём приложение Excel

            xlWB = xlApp.Workbooks.Open(xlFileName); //открываем наш файл          

            xlSht = xlWB.Worksheets[«Лист1»]; //или так xlSht = xlWB.ActiveSheet //активный лист

            iLastRow = xlSht.Cells[xlSht.Rows.Count, «A»].End[Excel.XlDirection.xlUp].Row; //последняя заполненная строка в столбце А

            iLastCol = xlSht.Cells[1, xlSht.Columns.Count].End[Excel.XlDirection.xlToLeft].Column; //последний заполненный столбец в 1-й строке

Получаем список всех загруженных книг «листов» из файла

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

  //поиск файла Excel

            OpenFileDialog ofd = new OpenFileDialog();

            ofd.Multiselect = false;

            ofd.DefaultExt = «*.xls;*.xlsx»;

            ofd.Filter = «Microsoft Excel (*.xls*)|*.xls*»;

            ofd.Title = «Выберите документ Excel»;

            if (ofd.ShowDialog() != DialogResult.OK)

            {

                MessageBox.Show(«Вы не выбрали файл для открытия», «Внимание», MessageBoxButtons.OK, MessageBoxIcon.Information);

                return;

            }

            string xlFileName = ofd.FileName; //имя нашего Excel файла

Excel.Workbook xlWB = ex.Workbooks.Open(xlFileName);

///загружаем список всех книг

            foreach (object item in xlWB.Sheets)

            {

                Excel.Worksheet sheet = (Excel.Worksheet)item;

            }

В этой статье мы рассмотрим способы для выгрузки данных в xls/xlsx файл. Для примера был создан небольшой тестовый проект для демонстрации возможностей библиотек. Допустим у нас есть класс студент

public class Student

    {

        public int ID { get; set; }

        public string Name { get; set; }

        public int Age { get; set; }

        public bool Gender { get; set; }

        public string phone { get; set; }

        public int Eng { get; set; }

        public int Math { get; set; }

    }

Создадим функцию которая будет создавать фейковые данные студентов

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

        /// <summary>

        /// Generate Random Student Data

        /// </summary>

        /// <param name=»count»>count</param>

        /// <returns>List<Student></returns>

        private List<Student> GenerateRandomData(int count)

        {

            Random rnd = new Random();

            List<Student> students = new List<Student>();

            for (int i = 0; i < count; i++)

            {

                students.Add(new Student()

                {

                    Name = «name» + i.ToString(),

                    Age = rnd.Next(10, 60),

                    Gender = rnd.NextDouble() >= 0.5,

                    ID = i,

                    phone = «8987654321»,

                    Eng = rnd.Next(0, 100),

                    Math = rnd.Next(0, 100)

                });

            }

            return students;

        }

Теперь рассмотрим  способы выгрузить эти данные в excel.

Содержание

  1. NPOI
  2. Общие характеристики NPOI:
  3. Как использовать
  4. EPPlus
  5. Общие характеристики
  6. Как использовать
  7. ClosedXML
  8. Как использовать
  9. ClosedXML.Report
  10. ‎Функции‎
  11. Как использовать
  12. OleDB
  13. Провайдеры данных
  14. Extended Properties
  15. Как использовать

NPOI

Этот проект является .NET версией проекта POI Java. С помощью NPOI вы можете легко читать/записывать файлы Office 2003/2007.

Общие характеристики NPOI:

a. Это абсолютно бесплатно для использования

b. Охват большинства функций Excel (стиль ячеек, формат данных, формула и т. д.)

c. Поддерживаемые форматы: xls, xlsx, docx.

d. Разработан для ориентации на интерфейс (взгляните на NPOI. Пространство имен SS)

e. Поддержка не только экспорта, но и импорта

f. Реальные успешные кейсы по всему миру

г. огромное количество базовых примеров

h. Работает как на Windows, так и на Linux

Подробно узнать о проекте можно по ссылке 

Ниже указан способ выполнить экспорт с помощью NPOI

Как использовать

Установим библиотеку через NuGet

Библиотеки для экспорта данных в Excel

Подключим в код

using NPOI.XSSF.UserModel;
using NPOI.SS.UserModel;

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

List<Student> students = GenerateRandomData(100);

XSSFWorkbook workbook = new XSSFWorkbook();

ISheet sheet = workbook.CreateSheet(«Primer_NPOI»);

//create the header row

IRow headerRow = sheet.CreateRow(0);

int count = 0;

foreach (var item in typeof(Student).GetProperties())

{

   headerRow.CreateCell(count++).SetCellValue(item.Name);

}

//set the value

for (int i = 1; i < students.Count() + 1; i++)

{

   IRow row = sheet.CreateRow(i);

   count = 0;

   row.CreateCell(count++).SetCellValue(students[i 1].ID);

   row.CreateCell(count++).SetCellValue(students[i 1].Name);

   row.CreateCell(count++).SetCellValue(students[i 1].Age);

   row.CreateCell(count++).SetCellValue(students[i 1].Gender ? «М» : «Ж»);

   row.CreateCell(count++).SetCellValue(students[i 1].phone);

   row.CreateCell(count++).SetCellValue(students[i 1].Eng);

   row.CreateCell(count).SetCellValue(students[i 1].Math);

}

try

{

    //save file

    SaveFileDialog saveDialog = new SaveFileDialog()

    {

       DefaultExt = «.xlsx»,

       FileName = «Primer_NPOI»,

       Filter = «Excel |*.xlsx»

    };

    if (saveDialog.ShowDialog() == true)

    {

       using (FileStream MS = new FileStream(saveDialog.FileName,FileMode.Create))

       {

          workbook.Write(MS);

       }

      }

    }

catch (Exception ex)

{

   StatusText.Text = ex.Message;

}

  • Создание, чтение и изменение книг Office Open XML (xslx и xlsm)
  • Поддерживает как .NET Framework, так и .NET Core. Нет различий в наборе функций между фреймворками.
  • Предоставляет простой в использовании, строго типизированный программный интерфейс, который тесно связан с хорошо известным API Excel VBA.
  • Только управляемый код, без зависимостей от Microsoft Excel
  • Закаленная в боях кодовая база после многих лет работы в качестве самой скачиваемой в мире библиотеки .NET для управления электронными таблицами. Качество, обеспечиваемое тысячами юнит-тестов.
  • Исходный код EPPlus в открытом доступе на Github , распространяется под некоммерческой лицензией Polyform

Как использовать

Установка

Библиотеки для экспорта данных в Excel

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

List<Student> students = GenerateRandomData(100);

using (ExcelPackage p = new ExcelPackage())

{

ExcelWorksheet sheet = p.Workbook.Worksheets.Add(«EPPlus_Test»);

//create the header row

int count = 1;

foreach (var item in typeof(Student).GetProperties())

{

    sheet.Cells[1, count].Style.Fill.PatternType = ExcelFillStyle.Solid;

    sheet.Cells[1, count].Style.Fill.BackgroundColor.SetColor(Color.Yellow);

    sheet.Cells[1, count++].Value = item.Name;

}

//set the value

for (int i = 2; i < students.Count() + 2; i++)

{

    count = 1;

    sheet.Cells[i, count++].Value = students[i 2].ID;

    sheet.Cells[i, count++].Value = students[i 2].Name;

    sheet.Cells[i, count++].Value = students[i 2].Age;

    sheet.Cells[i, count++].Value = students[i 2].Gender ? «М» : «Ж»;

    sheet.Cells[i, count++].Value = students[i 2].phone;

    sheet.Cells[i, count++].Value = students[i 2].Eng;

    sheet.Cells[i, count].Value = students[i 2].Math;

    sheet.Cells[i, count].Style.Fill.PatternType = ExcelFillStyle.Solid;

    sheet.Cells[i, count].Style.Fill.BackgroundColor.SetColor(students[i 2].Math < 60 ? Color.Red : Color.Transparent);

}

sheet.Column(4).AutoFit();

//condition format

var ruleIcon = sheet.ConditionalFormatting.AddThreeIconSet(new ExcelAddress(2, 5, 10, 5), eExcelconditionalFormatting3IconsSetType.Signs);

var colorformat = sheet.ConditionalFormatting.AddDatabar(new ExcelAddress(2, 6, 10, 6), Color.Blue);

//add chart

ExcelWorksheet sheet2 = p.Workbook.Worksheets.Add(«chart»);

ExcelChart chart = sheet2.Drawings.AddChart(«NewChart», eChartType.Area3D);

chart.Title.Text = «Title»;

chart.Series.Add(sheet.Cells[2, 6, 6, 6], sheet.Cells[2, 1, 6, 1]);

chart.SetPosition(4, 1, 1, 0);

chart.SetSize(800, 400);

chart.View3D.DepthPercent = 60;

chart.View3D.Perspective = 15;

chart.View3D.RotX = 20;

chart.View3D.RotY = 15;

try

{

    //save file

    SaveFileDialog saveDialog = new SaveFileDialog()

    {

        DefaultExt = «.xlsx»,

        FileName = «EPPlus_Test»,

        Filter = «Excel |*.xlsx»

    };

    if (saveDialog.ShowDialog() == true)

    {

        File.WriteAllBytes(saveDialog.FileName, p.GetAsByteArray());

        //p.SaveAs(new FileInfo(saveDialog.FileName));

    }

}

catch (Exception ex)

{

    StatusText.Text = ex.Message;

}

}

}

ClosedXML

‎ClosedXML — это библиотека .NET для чтения, обработки и записи файлов Excel 2007+ (.xlsx, XLSM). Он направлен на предоставление интуитивно понятного и удобного интерфейса для работы с базовым ‎‎OpenXML‎‎ API.‎

Ссылка на проект

‎Для получения дополнительной информации см. вики‎

Как использовать

Библиотеки для экспорта данных в Excel

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

List<Student> students = GenerateRandomData(100);

XLWorkbook workbook = new XLWorkbook();

var sheet = workbook.Worksheets.Add(«ClosedXML_Test»);

int count = 1;

foreach (var item in typeof(Student).GetProperties())

{

    sheet.Cell(1, count).Style.Fill.PatternType = XLFillPatternValues.Solid;

    sheet.Cell(1, count).Style.Fill.BackgroundColor = XLColor.Yellow;

    sheet.Cell(1, count++).Value = item.Name;

}

for (int i = 2; i < students.Count() + 2; i++)

{

    count = 1;

    sheet.Cell(i, count++).Value = students[i 2].ID;

    sheet.Cell(i, count++).Value = students[i 2].Name;

    sheet.Cell(i, count++).Value = students[i 2].Age;

    sheet.Cell(i, count++).Value = students[i 2].Gender ? «М» : «Ж»;

    sheet.Cell(i, count++).Value = students[i 2].phone;

    sheet.Cell(i, count++).Value = students[i 2].Eng;

    sheet.Cell(i, count).Value = students[i 2].Math;

    sheet.Cell(i, count).Style.Fill.PatternType = XLFillPatternValues.None;

    sheet.Cell(i, count).Style.Fill.BackgroundColor = students[i 2].Math < 60 ? XLColor.Red : XLColor.Transparent;

}

sheet.Column(4).AdjustToContents();

//condition format

sheet.Range(2, 6, 10, 6).AddConditionalFormat().DataBar(XLColor.Orange).LowestValue().HighestValue();

sheet.Range(2, 3, 10, 3).AddConditionalFormat().IconSet(XLIconSetStyle.ThreeTrafficLights2)

    .AddValue(XLCFIconSetOperator.EqualOrGreaterThan, 45, XLCFContentType.Number)

    .AddValue(XLCFIconSetOperator.EqualOrGreaterThan, 20, XLCFContentType.Number)

    .AddValue(XLCFIconSetOperator.EqualOrGreaterThan, 10, XLCFContentType.Number);

try

{

    //save file

    SaveFileDialog saveDialog = new SaveFileDialog()

    {

        DefaultExt = «.xlsx»,

        FileName = «ClosedXML»,

        Filter = «Excel |*.xlsx»

    };

    if (saveDialog.ShowDialog() == true)

    {

        workbook.SaveAs(saveDialog.FileName);

    }

}

catch (Exception ex)

{

    StatusText.Text = ex.Message;

}

ClosedXML.Report

‎ClosedXML.Report — это инструмент для создания отчетов и анализа данных в приложениях .NET с помощью Microsoft Excel. Это . NET-библиотека для создания отчетов Microsoft Excel без необходимости установки Excel на компьютере, на котором выполняется код. С помощью ClosedXML.Report можно легко экспортировать любые данные из классов .NET в Excel с помощью XLSX-шаблона.‎

‎Функции‎

  • ‎Копирование форматирования ячеек‎
  • ‎Условное форматирование
  • ‎Вертикальные и горизонтальные таблицы и поддиапазоны‎
  • ‎Возможность реализации формул Excel‎
  • ‎Использование динамически вычисляемых формул с синтаксисом C # и Linq‎
  • ‎Операции с табличными данными: сортировка, группировка, суммарные функции.‎
  • ‎Сводные таблицы‎
  • ‎Поддиапазоны‎

Библиотеки для экспорта данных в Excel

Библиотеки для экспорта данных в Excel

Как использовать

ClosedXML/ClosedXML.Report: ClosedXML.Report is a tool for report generation with which you can easily export any data from your .NET classes to Excel using a XLSX-template. (github.com)

OleDB

Провайдеры данных

Для работы с Excel 2003 (.Xls) можно использовать провайдер Microsoft Jet OLE DB 4.0.

SELECT * FROM OPENROWSET(

‘Microsoft.Jet.OLEDB.4.0’,

‘Excel 12.0;Database=d:tmpTimeSheets.xlsx;HDR=YES;IMEX=1’,

‘SELECT * FROM [Sheet1$]’);

Для работы с Excel 2007 (.Xlsx) — Microsoft ACE OLEDB 12.0.

SELECT * FROM OPENROWSET (

    ‘Microsoft.ACE.OLEDB.12.0’,

    ‘Excel 12.0;Database=d:tmpTimeSheets.xlsx;HDR=YES;IMEX=1’,

    ‘SELECT * FROM [Sheet1$]’);

В Windows 10 открыть настройки источников данных ODBC можно написав «Источники данных ODBC» или через Панель управления Администрирование.

Extended Properties

  • HDR=YES|NO. HDR=YES означает, что первую строку листа, следует рассматривать как заголовки колонок. Т.о. значение из первой строки можно использовать как имена полей в sql запросах (любых: select, insert, update, delete).
  • IMEX=1|3. 1 — открыть соединение для чтения. 3 — для записи.

Как использовать

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

List<Student> students = GenerateRandomData(100);

try

{

    SaveFileDialog saveDialog = new SaveFileDialog()

    {

        DefaultExt = «.xlsx»,

        FileName = «Sample»,

        Filter = «Excel |*.xlsx»

    };

    if (saveDialog.ShowDialog() == true)

    {

        string Connstring = $«Provider=Microsoft.ACE.OLEDB.12.0;Data Source={saveDialog.FileName};Extended Properties=’Excel 12.0 Xml;HDR=YES;'»;

        using (OleDbConnection Conn = new OleDbConnection(Connstring))

        {

            await Conn.OpenAsync();

            //create sheet

            string sql = «CREATE TABLE Test (ID int,Name VarChar,Age int,Gender VarChar,phone VarChar,Eng int,Math int)»;

            using (OleDbCommand cmd = new OleDbCommand(sql, Conn))

            {

                await cmd.ExecuteNonQueryAsync();

                //insert data

                cmd.CommandText = «Insert into Test values (@ID,@Name,@Age,@Gender,@phone,@Eng,@Math)»;

                for (int i = 0; i < students.Count; i++)

                {

                    cmd.Parameters.Clear();

                    cmd.Parameters.Add(«@ID», OleDbType.Integer).Value = students[i].ID;

                    cmd.Parameters.Add(«@Name», OleDbType.VarChar).Value = students[i].Name;

                    cmd.Parameters.Add(«@Age», OleDbType.Integer).Value = students[i].Age;

                    cmd.Parameters.Add(«@Gender», OleDbType.VarChar).Value = students[i].Gender ? «М» : «Ж»;

                    cmd.Parameters.Add(«@phone», OleDbType.VarChar).Value = students[i].phone;

                    cmd.Parameters.Add(«@Eng», OleDbType.Integer).Value = students[i].Eng;

                    cmd.Parameters.Add(«@Math», OleDbType.Integer).Value = students[i].Math;

                    await cmd.ExecuteNonQueryAsync();

                }

            }

        }

    }

}

catch (Exception ex)

{

    StatusText.Text = ex.Message;

}

Скачать проект

Понравилась статья? Поделить с друзьями:
  • С какой точностью можно изменять масштаб отображения документа в word
  • С какого знака начинается ввод формулы в ячейку excel
  • С excel не выгружает в xml
  • С какой точностью может быть установлен размер шрифта в ms word
  • С какого знака начинается ввод формулы в microsoft excel