Обертка функций Excel на русском. Ускорение процесса разработки.

Устали переключаться с русского на английский и обратно при работе с таблицами Excel из 1С?
Сборка наиболее необходимых функций и методов работы с Excel, обернутых в функции 1С на русском языке.

В один прекрасный момент, при разработке отчета с выводом в Excel, меня достало переключаться между языками для вызова методов Excel.

Теряется куча времени.

Обернул их в функции 1С написанные на русском языке.

Пример:

// Описание:
//  Возвращает структуру со ссылкой на ячейку
//
// Параметры:
//  Лист - лист книги Excel куда нужно вставить значение
//  Строка - номер строки листа
//  Колонка - номер колонки листа
//
// Возвращаемое значение:
//   Структура:
//  * Ячейка - ссылка на ячейку, куда было помещено значение, для дальнейшего использования
//      * Строка - строка ячейки
//  * Колонка - колонка ячейки.
//
Функция Екс_ПолучитьЯчейку(Лист,Строка,Колонка)
текЯчейка = новый Структура;
текЯчейка.Вставить("Ячейка",Лист.Cells(Строка,Колонка));
текЯчейка.Вставить("Строка",Строка);
текЯчейка.Вставить("Колонка",Колонка);
Возврат текЯчейка;
КонецФункции

 

Написал в основном только те функции и методы, которые мне были необходимы. После этого разработка пошла намного быстрее. Не нужно отвлекаться на переключение языка и вспоминать правильное написание той или иной функции Excel.

Были использованы как свои разработки, так и разработки и описания с сайта. Просматривал много информации, поэтому вспомнить все источники не смогу (прошу прощения 🙂 )

один из многих:

шпаргалка по Excel

1. Код функций ниже:

#Область ПроцедурыЕксель

Процедура Екс_ВставитьМакросВКнигу(КнигаЕксель, ТекстМакроса)
//Пишем макросы в книгу
VBComponents = КнигаЕксель.VBProject.VBComponents;
Кол = VBComponents.Count();
Модуль = VBComponents.Add(1);
Модуль.CodeModule.InsertLines(1,ТекстМакроса);
КонецПроцедуры

Процедура Екс_ВставитьКнопкиУправленияНаЛистExcel(Лист, Заголовок, Макрос, Верхний_УголХ, ВерхнийУголУ, Ширина, Высота, РазмерШрифта, ЦветНадписи)
//Создание Кнопки
Кнопка1=Лист.Buttons.Add(Верхний_УголХ, ВерхнийУголУ, Ширина, Высота);
//первые 2 цифарки (420.5, 12.5, , ) это координаты точки
//вторые 2 цифарки размеры кнопки длина ширина (, , 89.5, 17.5)
Кнопка1.Caption=Заголовок;
Кнопка1.OnAction = Макрос;
Кнопка1.Font.Size = РазмерШрифта;
Кнопка1.Font.Color = ЦветНадписи;
Кнопка1.AutoSize = 1;
КонецПроцедуры

//
// Начертание - 0 - нормальный, 1 - полужирный, 2 - наклонный, 3 - полужирнй/наклонный
Процедура Екс_УстановитьФорматЯчейки(Ячейка, Шрифт = Неопределено,Размер = Неопределено,Начертание = Неопределено,Цвет = Неопределено,Перенос = Ложь,Формат = "@", Рамка = 0)
Если не Шрифт = Неопределено тогда
Ячейка.Font.Name = Шрифт;
КонецЕсли;
Если не Размер = Неопределено тогда
Ячейка.Font.Size = Размер;
КонецЕсли;
Если не Начертание = Неопределено тогда
Если Начертание = 0 тогда
Ячейка.Font.Bold = 0;
Ячейка.Font.Italic = 0;
ИначеЕсли Начертание = 1 тогда
Ячейка.Font.Bold = 1;
Ячейка.Font.Italic = 0;
ИначеЕсли Начертание = 2 тогда
Ячейка.Font.Bold = 0;
Ячейка.Font.Italic = 1;
ИначеЕсли Начертание = 3 тогда
Ячейка.Font.Bold = 1;
Ячейка.Font.Italic = 1;
КонецЕсли;
КонецЕсли;
Если не Цвет = Неопределено тогда
Ячейка.Font.Color = Цвет;
КонецЕсли;
Если не Перенос = Неопределено тогда
Ячейка.WrapText = Перенос;
КонецЕсли;


КонецПроцедуры

Функция Екс_ПолучитьЦветExcelRGB(R,G,B)
Возврат B*256*256 + G * 256 + R;
КонецФункции

// Описание:
//  Вставляет значение в указанный лист и ячейку
//  можно вставить текстовое значение, число, гиперссылку, формулу
//
// Параметры:
//  Лист - лист книги Excel куда нужно вставить значение
//  Строка - номер строки листа
//  Колонка - номер колонки листа
//  Значение - значение помещаемое в ячейку листа (строка, колонка)
//  ТипЗначения - Строка - может принимать следующие значения:
//  * "Текст"
//  * "Ссылка"
//  * "Число"
//  * "Формула"
//  ЛистНазначения - лист книги Excel куда будет вести гиперссылка
//
// Возвращаемое значение:
//   Структура:
//  * Ячейка - ссылка на ячейку, куда было помещено значение, для дальнейшего использования
//      * Строка - строка ячейки
//  * Колонка - колонка ячейки.
//
Функция Екс_ВставитьВЯчейку(Лист,Строка,Колонка,Значение, ТипЗначения = "Текст", ЛистНазначения = Неопределено)

текЯчейка = новый Структура;
текЯчейка.Вставить("Ячейка",Лист.Cells(Строка,Колонка));
текЯчейка.Вставить("Строка",Строка);
текЯчейка.Вставить("Колонка",Колонка);

Если ТипЗначения = "Текст" тогда //по умолчанию текст
текЯчейка.Ячейка.Value = Значение;
ИначеЕсли ТипЗначения = "Ссылка" и не ЛистНазначения = Неопределено тогда
//тип ссылка и есть лист назначения
Лист.Hyperlinks.Add(текЯчейка.Ячейка,,"'"+ЛистНазначения.name+"'!R1C1",,Значение);

ИначеЕсли ТипЗначения = "Число" тогда
//
ИначеЕсли ТипЗначения = "Формула" тогда
//
КонецЕсли;
Возврат текЯчейка;
КонецФункции //ВставитьВЯчейку()

// Описание:
//  Возвращает структуру со ссылкой на ячейку
//
// Параметры:
//  Лист - лист книги Excel куда нужно вставить значение
//  Строка - номер строки листа
//  Колонка - номер колонки листа
//
// Возвращаемое значение:
//   Структура:
//  * Ячейка - ссылка на ячейку, куда было помещено значение, для дальнейшего использования
//      * Строка - строка ячейки
//  * Колонка - колонка ячейки.
//
Функция Екс_ПолучитьЯчейку(Лист,Строка,Колонка)
текЯчейка = новый Структура;
текЯчейка.Вставить("Ячейка",Лист.Cells(Строка,Колонка));
текЯчейка.Вставить("Строка",Строка);
текЯчейка.Вставить("Колонка",Колонка);
Возврат текЯчейка;
КонецФункции

// Объединяет указанную Ячеками область на Листе Excel
Процедура Екс_ОбъединитьЯчейки(Лист,Строка1,Колонка1,Строка2,Колонка2)
Лист.Range(Лист.Cells(Строка1,Колонка1),Лист.Cells(Строка2,Колонка2)).Merge();
КонецПроцедуры

Функция Екс_ПолучитьЛист(КнигаExcel, ИмяНомерЛиста)
Возврат КнигаExcel.WorkSheets(ИмяНомерЛиста);
КонецФункции

Функция ЕксельПолучитьКнигу(ОбъектЕксель, ИмяФайлаЕксель)
Возврат ОбъектЕксель.Workbooks.Open(ИмяФайлаЕксель);
КонецФункции

Функция ЕксельСоздатьОбъект()
Возврат Новый COMОбъект("Excel.Application");
КонецФункции

Процедура Екс_ЗакрытьКнигу(Книга)
Попытка
Книга.Close();
Исключение
КонецПопытки;
КонецПроцедуры

Процедура Екс_ЗакрытьЕксель(ОбъектЕксель)
Попытка
ОбъектЕксель.Quit();
Исключение
КонецПопытки;
КонецПроцедуры

Функция Екс_КоличествоЛистовВКниге(КнигаExcel)
Возврат КнигаExcel.Worksheets.Count;
КонецФункции

Функция ЕксельДобавитьЛистВКнигу(КнигаExcel,ТекущийЛист,ИмяНовогоЛиста)
НовыйЛист = КнигаExcel.WorkSheets.Add(,ТекущийЛист);
НовыйЛист.name = ИмяНовогоЛиста;
Возврат НовыйЛист;
КонецФункции

Процедура Екс_УстановитьВысотуСтроки(Ячейка, ВысотаСтроки)
Ячейка.RowHeight = ВысотаСтроки;
КонецПроцедуры

Функция Екс_ПолучитьИмяЛистаПоНомеру(Книга, НомерЛиста)
Возврат Книга.WorkSheets(НомерЛиста).name;
КонецФункции

Функция Екс_ПолучитьНомерЛистаПоИмени(Книга, ИмяЛиста)
Возврат Книга.WorkSheets(ИмяЛиста).Index;
КонецФункции

Функция Екс_ПоследняяСтрокаВЛисте(Лист)
Возврат Лист.UsedRange.Rows.Count;
КонецФункции

Процедура Екс_ЗафиксироватьОбласть(ОбъектЕксель,Лист,Строка = Неопределено, Колонка = Неопределено)
Лист.Activate();
Если не Строка = Неопределено тогда
ОбъектЕксель.ActiveWindow.SplitRow = Строка;

КонецЕсли;
Если не Колонка = Неопределено тогда
ОбъектЕксель.ActiveWindow.SplitColumn = Колонка;
КонецЕсли;
ОбъектЕксель.ActiveWindow.FreezePanes = 1;
КонецПроцедуры

Функция Екс_ЯчейкаОбъединена(Ячейка)
Возврат Ячейка.MergeCells;
КонецФункции

Функция Екс_ПолучитьЗначениеВЯчейке(Лист,Строка,Колонка)
Возврат Лист.Cells(Строка,Колонка).Value;
КонецФункции

Процедура Екс_УстановитьСнятьЗащитуСЯчейки(Ячейка,Защита = 0)
Попытка
Ячейка.Locked = Защита;
Исключение
КонецПопытки;
КонецПроцедуры

#КонецОбласти

 

2. Пример использования:

Ексель = ЕксельСоздатьОбъект();
КнигаЕксель = ЕксельПолучитьКнигу(Ексель,ИмяФайла);
ЛистЕксель = Екс_ПолучитьЛист(КнигаЕксель,1);
ЛистНавигации = Екс_ПолучитьЛист(Книга,"Навигация");

текСтрока = 5;
текКолонка = 10;
ЗначЯчейки = Екс_ПолучитьЗначениеВЯчейке(ЛистЕксель,текСтрока,текКолонка);

текЯчейка = Екс_ВставитьВЯчейку(ЛистЕксель,текСтрока,1,"Вариант 1.");
//В текЯчейка вернулась структура ТекЯчейка.Ячейка, ТекЯчейка.Строка, ТекЯчейка.Колонка
Екс_УстановитьФорматЯчейки(текЯчейка.Ячейка,,15,1,Красный);
Екс_УстановитьВысотуСтроки(текЯчейка.Ячейка,16);
Екс_ОбъединитьЯчейки(ЛистЕксель,текЯчейка.Строка,текЯчейка.Колонка,текЯчейка.Строка,текЯчейка.Колонка+5);


 

6 Comments

  1. ZloyProger

    Плюсик в карму автору) Ещё бы знать по какой такой неведомой причине ком-объект экселя начинает «вредничать» и методы то срабатывают, то не срабатывают (помню маялся с определением последней строки — то искал, то не искал, в конце концов пришлось захардкодить :-()… Из-за этого отказался от чтения экселя, сразу как табличный документ читаю и там уже своё, родное ЖКК (правда только на небольших файлах, на больших и ком-объект экселя не спасает, там уже надо через ADO).

    Reply
  2. aspirator23

    Спасибо за функции. «цифАрки» — это из старославянского?

    Reply
  3. user717498

    Необходимо дополнить процедурой установки параметров страницы Excel для печати

    Процедура УстановитьПараметрыСтраницыДляПечати(Excel,Книга,НомерЛиста)

    //до обращения к процедуре должно быть прописано

    //Excel= новый COMОбъект(«Excel.Application»);

    //Книга = Excel.WorkBooks.Open(ИмяФайла);

    //НомерЛиста = 1;

    Лист = Книга.WorkSheets(НомерЛиста);

    Лист.PageSetup.LeftMargin = Excel.CentimetersToPoints(2); //отступ слева 2 см

    Лист.PageSetup.RightMargin = Excel.CentimetersToPoints(5/10); //отступ справа 0.5 см

    Лист.PageSetup.TopMargin = Excel.CentimetersToPoints(1); //отступ сверху 1 см

    Лист.PageSetup.BottomMargin = Excel.CentimetersToPoints(1); //отступ снизу 1 см

    Лист.PageSetup.HeaderMargin = Excel.CentimetersToPoints(0); //верхний колонтитул 0 см

    Лист.PageSetup.FooterMargin = Excel.CentimetersToPoints(5/10); //нижний колонтитул 0.5 см

    Лист.PageSetup.Orientation = 1; //портрет, если 2 — ландшафт

    Лист.PageSetup.Zoom = 100; //100% масшстаб,

    //если по ширине страницы, то Лист.PageSetup.Zoom = False;

    //и добавить 2 строки:

    //Лист.PageSetup.FitToPagesWide = 1; — по ширине страницы

    //Лист.PageSetup.FitToPagesTall = False;

    Лист.PageSetup.RightFooter = «&p»;//номер страницы в правом нижнем колонитутле (варинат «стр. &p»)где p это англ «пи»

    //вариант для верхнего колонитула Лист.PageSetup.RightHeader = «&p»;

    КонецПроцедуры

    Reply
  4. DmitryKotov

    (3) За добавку функций огромное спасибо.

    У меня была мысль собрать это все в расширение

    Ваша процедура в обертке будет выглядеть так (например) :

    Получаем лист

    Лист = Екс_ПолучитьЛист(КнигаExcel, ИмяНомерЛиста);

    Процедура УстановитьПараметрыСтраницыДляПечати(Лист, ОтступСлева, ОтступСправа и т.д.) (а можно и структуру отступов и других параметров передать)

    Лист.PageSetup.LeftMargin = Excel.CentimetersToPoints(ОтступСлева); //отступ слева 2 см (или СтруктураОтступов.ОтступСлева

    Лист.PageSetup.RightMargin = Excel.CentimetersToPoints(ОтступСправа); //отступ справа 0.5 см

    ….

    и т.д.

    ….

    Если ЕстьFooter (если передали нижний колонтитул, то делаем

    Лист.PageSetup.RightFooter = «&p»;//номер страницы в правом нижнем колонитутле (варинат «стр. &p»)где p это англ «пи»

    //вариант для верхнего колонитула Лист.PageSetup.RightHeader = «&p»;

    КонецПроцедуры

    Reply
  5. DmitryKotov

    (2) 🙂

    что-то вроде того 🙂

    копи-паст с какой-то статьи

    Reply
  6. DmitryKotov

    (3) добавлю чуть-позже

    Reply

Leave a Comment

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