Работа с excel на примерах C# с помощью Microsoft.Office.Interop.Excel

Все привет, в этой статье опишу исчерпывающие примеры работы с 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[n, m] as Excel.Range;
//Добавить горизонтальный разрыв (sheet - текущий лист)
sheet.HPageBreaks.Add(razr); 
//VPageBreaks - Добавить вертикальный разрыв

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

app.Workbooks.Open(@"C:\Users\User\Documents\Excel.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);

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

//поиск файла 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-й строке

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

  //поиск файла 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;
            }

 

Обновлено: 24.10.2021 — 15:33

4 комментария

Оставить комментарий
  1. Алексей

    Начиная с Excel.Workbook workBook = app.Workbooks.Add(Type.Missing); начинаю получать ошибку CS0236 о том, что инициализатор поля не может обращаться к нестатическому полю, методу или свойству(Main.app)

    1. Что то делаете не так, код рабочий и до сих пор использую. При каких обстоятельствах ошибка возникает?

    2. Георгий

      Такая же ошибка

      1. Версию офиса смотреть надо, либо использовать более продвинутые библиотеки. У меня под 2007 офис было сделано.

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

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

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.