Форум программистов, компьютерный форум, киберфорум
turbanoff
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  

Excel ЧаВо (FAQ)

Запись от turbanoff размещена 05.07.2013 в 17:59
Показов 11868 Комментарии 1
Метки .net, c-sharp, excel, interop

Во всех примерах предполагается, что прописан синоним для пространства имен 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
XL.Visible = true;

Как сделать так, чтоб работали английские формулы и форматы чисел в ячейках?
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
oWB.Save();

Как закрыть книгу без вопросов о сохранении? Как закрыть все книги?
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/
Метки .net, c-sharp, excel, interop
Размещено в Без категории
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Всего комментариев 1
Комментарии
  1. Старый комментарий
    Аватар для newyork7776
    Запись от newyork7776 размещена 07.06.2015 в 23:52 newyork7776 вне форума
 
Новые блоги и статьи
Установка MinGW GCC 16.2 и CMake
8Observer8 10.08.2026
VK Видео: https:/ / vkvideo. ru/ video-240781534_456239017 YouTube: eY5-5PyI9NM Текстовая версия
Неделя из жизни имитационной модели склада: мои кривые руки растут, откуда надо
anaschu 10.08.2026
Неделя из жизни имитационной модели склада: как я почти написал неправильную логику и что с этим делать Работаю сейчас над учебно-рабочим проектом: строю в AnyLogic имитационную модель процессов. . .
Калькулятор для расчета родства
russiannick 07.08.2026
1. Задача: Создать калькулятор для расчета родства. Родственных связей существует 8 ступеней, такие как: p - отец P - мать q - муж Q - жена b - брат B - сестра s - сын S - дочь
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире. Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
Как ИИ начал спорить и врать (возможно почуяв опасность для себя от индустрии - уход от электроники).
Hrethgir 04.08.2026
Недельный диалог, на фоне событий с НПЗ. Да, из спирта можно получать бензин, и это не сложно. Но потом в схеме я решил избавиться от насоса, при этом полностью сделав контроль подачи спирта в. . .
Термопринтер QR701
Argus19 03.08.2026
Термопринтер QR701 Купил два термопринтера QR701. На сэлф-тесте написано: Language: PC936 (GB18030). Что означает, что принтеры могут печатать только латиницу и китайские иероглифы. Так же. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru