Во всех примерах предполагается, что прописан синоним для пространства имен Microsoft.Office.Interop.Excel;
| C# | 1
| using Excel = Microsoft.Office.Interop.Excel; |
|
Все примеры проверялись в Visual Studio 2010, .NET 3.5., Microsoft.Office.Interop.Excel.dll отсюда. Для тех кому лень устанавливать - здесь.
Основной список типов, используемых при работе с Excel:- Excel.Application - объект представляющий собой инстанс процесса Excel.exe
- Excel.Workbook - представляет собой отдельную рабочую книгу Excel (отдельный xls/xlsx файл)
- Excel.Worksheet - рабочий лист книги
- Excel.Range - набор ячеек. Обычно вся работа с Excel заключается в получении записи значений в переменные типа Range
Excel.Application
Как загрузить новый экземпляр Excel или подключиться к запущенному экземпляру EXCEL.EXE? Как отсоединиться от Excel и закрыть его экземпляр?
| C# | 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
| private static Excel.Application StartExcel(bool asNewInstance)
{
Excel.Application oXL = null;
if (!(asNewInstance))
{
try
{
oXL = System.Runtime.InteropServices.Marshal.GetActiveObject("Excel.Application")
as Excel.Application;
}
catch
{
// XL = null;
}
}
if (oXL == null) oXL = new Excel.Application();
if (oXL.Workbooks.Count == 0) oXL.Workbooks.Add(Type.Missing);
oXL.Visible = true;
return oXL;
} |
|
| C# | 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
| private static void FinishExcel(Excel.Application oXL)
{
if (oXL != null)
{
oXL.ScreenUpdating = true;
if (!oXL.Interactive) oXL.Interactive = true;
oXL.UserControl = true;
if (oXL.Workbooks.Count == 0)
{
oXL.Quit();
}
else
{
if (!oXL.Visible) oXL.Visible = true;
oXL.ActiveWorkbook.Saved = true;
}
// System.Runtime.InteropServices.Marshal.ReleaseComObject(oXL);
oXL = null;
GC.GetTotalMemory(true); // вызов сборщика мусора
// Пока не закрыть приложение EXCEL.EXE будет висеть в процессах
}
} |
|
Как сделать, чтобы Excel работал быстрее?
| C# | 1
2
3
4
5
| oXL.Visible = false;
oXL.ScreenUpdating = false;
oXL.ErrorCheckingOptions.BackgroundChecking = false;
oXL.ErrorCheckingOptions.NumberAsText = false;
oXL.ErrorCheckingOptions.InconsistentFormula = false; |
|
Как вывести приложение Excel на передний план?
Как сделать так, чтоб работали английские формулы и форматы чисел в ячейках?
| C# | 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
| int savedCult = Thread.CurrentThread.CurrentCulture.LCID;
try
{
// установим английскую "культуру"
Thread.CurrentThread.CurrentCulture = new CultureInfo(0x0409, false);
Thread.CurrentThread.CurrentUICulture = new CultureInfo(0x0409, false);
// здесь работаем с Excel'ем, при чем работают английские формулы, DataFormat
// и колонтитулы в PageSetup
Console.ReadKey();
}
finally
{
// восстановим пользовательскую "культуру" для отображения всех данных в
// привычных глазу форматах
Thread.CurrentThread.CurrentCulture = new CultureInfo(savedCult, true);
Thread.CurrentThread.CurrentUICulture = new CultureInfo(savedCult, true);
} |
|
Экспорт в Excel длится довольно долго. Как можно уведомлять пользователя о ходе выполнения работы?
Чтобы пользователь не подумалб что во время экспорта данных в Excel ваша программа и Excel "висит", лучше уведомлять его о ходе работы. Т.к. обновление экрана занимает довольно много времени и так довольно длительного процесса экспорта (хотя все же стоит подумать, как этот процесс оптимизировать и ускорить), то лучшим выходом из этой ситуации является показ этапов работы в свойстве ExcelApplication.StatusBar: | C# | 1
2
3
4
5
| XL.DisplayStatusBar = true;
//
XL.StatusBar = "Текст в статусбаре";
//
XL.StatusBar = false; // "Готово" |
|
Worksbooks и Worksheets
Как добавить новую книгу?
| C# | 1
| Excel.Workbook oWB = oXL.Workbooks.Add(); |
|
Как задать количество листов в новой книге?
| C# | 1
| oXL.SheetsInNewWorkbook = N; |
|
Где N = 1..255
Как открыть книгу, имеющуюся на диске?
| C# | 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
| Excel.Workbook oWB = oXL.Workbooks.Open(
"D:/Книга1.xlsx", // FileName
false, // UpdateLinks
false, // ReadOnly
Type.Missing, // Format
Type.Missing, // Password
Type.Missing, // WriteResPassword
Type.Missing, // IgnoreReadOnlyRecommended
Type.Missing, // Origin
Type.Missing, // Delimiter
true, // Editable
Type.Missing, // Notify
Type.Missing, // Converter
false, // AddToMru
Type.Missing, // Local
Type.Missing // CorruptLoad
); |
|
Как закрыть книгу без вопросов о сохранении? Как закрыть все книги?
| C# | 1
2
3
4
5
| //закрыть книгу без сохранения внесенных в нее изменений
oWB.Close(false);
// закрыть все книги без сохранения изменений
oXL.DisplayAlerts = false;
oXL.Workbooks.Close(); |
|
Как узнать имена всех открытых книг?
| C# | 1
2
3
4
| foreach (Excel.Workbook WB in oXL.Workbooks)
{
Console.WriteLine(WB.FullName);
} |
|
Как добавить новый лист в книгу? Как удалить лист?
| C# | 1
2
| Excel.Worksheet oSheet = (Excel.Worksheet) oWB.Worksheets.Add();
oSheet.Delete(); |
|
Нужно ли делать лист активным, чтобы записать в него данные?
Не нужно — переключение (активация) листов только замедлит экспорт данных. Получите ссылку на любой лист в книге (активной или нет) и работайте c ней, как с активной. Активизировать лист нужно только в случае необходимости, например, при вставке из буфера обмена, предварительном просмотре и др.
Как скопировать/переместить лист в одной книге? В другую книгу?
| C# | 1
2
3
4
| //Скопировать лист в конец
oSheet.Copy(Type.Missing, oWB.Worksheets[oWB.Worksheets.Count]);
//Переместить лист перед листом №4
oSheet.Move(oWB.Worksheets[4]); |
|
Если oWB - другая книга, то произойдет перемещение/копирование в другую книгу
Как спрятать рабочий лист?
| C# | 1
| oSheet.Visible = Excel.XlSheetVisibility.xlSheetHidden; |
|
Cells, Range, Rows и Columns
Как определить область выделенных ячеек и ее границы?
| C# | 1
2
3
4
5
6
| Excel.Range selection = (Excel.Range) oXL.Selection;
Excel.Areas areas = selection.Areas;
foreach (Excel.Range range in areas)
{
Console.WriteLine(range.Address);
} |
|
Как записывать значения в ячейку (Value, Value2, Text, Formula)?
Начиная с версии Excel XP (10.0), свойство Value имеет параметр. Отличие Value2 от Value в том, что Value2 не поддерживает "форматирования на лету" для типов Currency, Double и Date. Свойство Text (только чтение для Range) возвращает текст в ячейке. Свойство Formula выполняет те же функции, что и Value, с поддержкой "форматирования на лету", а также позволяет записывать в ячейку формулы со ссылками в стиле A1 (в идеале английские, но что на практике, смотрите здесь). Для стиля R1C1 используется свойство FormulaR1C1.
| C# | 1
2
3
| oSheet.Range["A1"].Value = 1;
oSheet.Range["A2"].Value2 = 12;
oSheet.Range["A3"].Formula = 13.4; |
|
При записи в свойство Formula, если это не формула, следите, чтобы текст не начинался с символов "=", "+", "-", "*", "/". Или просто к тексту прибавляйте в начало знак апострофа (код символа 39):
Что такое UsedRange?
UsedRange — прямоугольная область, включающая все заполненные ячейки и незаполненные, в промежутках между заполненными ячейками, на листе. Координаты области не обязательно начинаются в ячейке A1.
Как объединить ячейки?
| C# | 1
2
3
4
5
6
| //Получить Range из ячеек, которые нужно объединить, и вызвать Merge
Excel.Range oRange = oSheet.Range["A1", "A3"];
oRange.Merge();
//Метод Merge принимает параметр boolean - объединять ли построчно или нет(по умолчанию нет)
Excel.Range r = oSheet.Range["B1", "C4"];
r.Merge(true); |
|
Как изменить цвет фона и шрифта ячейки?
Смотрите свойства Font и Interior объекта Range
Как сделать автоперенос строк в ячейке?
| C# | 1
2
| oRange.WrapText = true;
//Внимание - данный способ не работает для объединенный ячеек |
|
PS. Копипаста с http://citforum.ru/programming/windows/excel_faq/
|