Все привет, в этой статье опишу исчерпывающие примеры работы с 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:\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 ) ;
Пример как выбрать фаил и загрузив его и узнать количество заполненных строк и колонок в одном конкретном листе по имени.
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 ;
}
Начиная с Excel.Workbook workBook = app.Workbooks.Add(Type.Missing); начинаю получать ошибку CS0236 о том, что инициализатор поля не может обращаться к нестатическому полю, методу или свойству(Main.app)
Что то делаете не так, код рабочий и до сих пор использую. При каких обстоятельствах ошибка возникает?
Такая же ошибка
Версию офиса смотреть надо, либо использовать более продвинутые библиотеки. У меня под 2007 офис было сделано.