//------------------Объявления функций:
//========= Excel (OLE) :
// (c) Venger Alex, Odessa, 2007
Функция гл8Excel_СоздатьКнигуСНужнымКолвомЛистов(Excel, РабочаяКнига, КолвоЛистов=1) Экспорт Далее
Функция гл8Excel_ЛистСНомеромСуществует(РабочаяКнига, НомерЛиста=1) Экспорт Далее
Функция гл8Excel_ПереименоватьЛистПоНомеру(РабочаяКнига, НомерЛиста=1, ИмяЛиста) Экспорт Далее
Функция гл8Excel_ЛистСИменемСуществует(РабочаяКнига, ИмяЛиста) Экспорт Далее
Функция гл8Excel_ПереименоватьЛистПоИмени(РабочаяКнига, ИмяЛиста, НовоеИмяЛиста) Экспорт Далее
Функция гл8Excel_ПолучитьЛистПоИмени(РабочаяКнига, ИмяЛиста, РабочийЛист) Экспорт Далее
Функция гл8Excel_ПолучитьЛистПоНомеру(РабочаяКнига, НомерЛиста=1, РабочийЛист) Экспорт Далее
Функция гл8Excel_УстановитьКурсорНаЛисте(РабочийЛист, Row=1, Col=1) Экспорт Далее
Функция гл8Excel_ДобавитьКартинкуНаЛист(Excel, РабочийЛист, Row=1, Col=1, Файл) Экспорт Далее
Функция гл8Excel_ПолучитьКоординатыПоследнейЯчейкиОбластиДанныхЛиста(Excel, Row, Col, Лист, ПозиционироватьКурсор=0) Экспорт Далее
Функция гл8Excel_ДобавитьТЗНаЛист(Excel, Лист, ТЗ, НачСтрокаВыводаТЗвExcel=3, КопироватьЗаголовкиКолонок=1, Заголовок="") Экспорт Далее
//========= 1Сv77 Доп. служебн. :
// (c) Venger Alex, Odessa, 2007
Функция гл8ЭтоФайл(Путь) Экспорт Далее
Функция гл8ПолучитьЗначениеАтрибутаФайлаПоКоду(Путь, КодАтрибута) Экспорт Далее
//------------------Определения функций:
// Excel - ссылка на Excel (OLE). Ссылка должна существовать
// Excel=СоздатьОбъект("Excel.Application");
// ----------------------------------------------------------------------
// (c) Venger Alex, Odessa, 2007
// Создать новую рабочую книгу с нужным количеством листов
// Параметры:
// Excel - ссылка на Excel (OLE). Ссылка должна существовать
// РабочаяКнига - переменная куда передается ссылка на созданную книгу
// КолвоЛистов - нужное количество листов
// Возвращаемое значение, =1 - Ok, =0 - неудачно
Функция гл8Excel_СоздатьКнигуСНужнымКолвомЛистов(Excel, РабочаяКнига, КолвоЛистов=1) Экспорт
Перем Res;
Res=0;
Если ТипЗначения(Excel)=100 Тогда //OLE._Application 100
Если КолвоЛистов > 0 Тогда
Res=1;
//Excel.Visible = 1; // Показать
РабочаяКнига = Excel.Workbooks.Add(); // Добавить рабочую книгу
РабочаяКнига.Activate();
// Удалить все листы, оставить один
Колво=РабочаяКнига.WorkSheets.Count;
Для I = 1 По Колво-1 Цикл
//РабочаяКнига.WorkSheets(I).Select();
Excel.Application.DisplayAlerts = 0;
РабочаяКнига.WorkSheets(I).Delete();
Excel.Application.DisplayAlerts = 1;
КонецЦикла;
// Добавить нужное количество листов
Для I = 1 По КолвоЛистов-1 Цикл
РабочаяКнига.WorkSheets().Add();
КонецЦикла;
// Переименовываем листы по порядку
Для I = 1 По КолвоЛистов Цикл
РабочаяКнига.WorkSheets(I).Name = Строка(I);
КонецЦикла;
КонецЕсли;
КонецЕсли;
Возврат Res;
КонецФункции // гл8Excel_СоздатьКнигуСНужнымКолвомЛистов
// ----------------------------------------------------------------------
// ----------------------------------------------------------------------
// (c) Venger Alex, Odessa, 2007
// Проверить, существует ли лист с заданным номером
// Параметры:
// РабочаяКнига - ссылка на Workbook (OLE). Ссылка должна существовать
// НомерЛиста - номер листа, который проверяем
// Возвращаемое значение, =1 - Да, =0 - Нет
Функция гл8Excel_ЛистСНомеромСуществует(РабочаяКнига, НомерЛиста=1) Экспорт
Перем Res;
Res=0;
Если ТипЗначения(РабочаяКнига)=100 Тогда //OLE._Workbook 100
Если Число(НомерЛиста) > 0 Тогда
КолвоЛистов=РабочаяКнига.WorkSheets.Count;
Если КолвоЛистов >= НомерЛиста Тогда
Res = 1;
КонецЕсли;
КонецЕсли;
КонецЕсли;
Возврат Res;
КонецФункции // гл8Excel_ЛистСНомеромСуществует
// ----------------------------------------------------------------------
// ----------------------------------------------------------------------
// (c) Venger Alex, Odessa, 2007
// Переименовать лист по номеру листа
// Параметры:
// РабочаяКнига - ссылка на Workbook (OLE). Ссылка должна существовать
// НомерЛиста - номер листа, который будем переименовывать
// ИмяЛиста - имя, которое дадим листу
// Возвращаемое значение, =1 - Ok, =0 - неудачно
Функция гл8Excel_ПереименоватьЛистПоНомеру(РабочаяКнига, НомерЛиста=1, ИмяЛиста) Экспорт
Перем Res;
Res=0;
Если ТипЗначения(РабочаяКнига)=100 Тогда //OLE._Workbook 100
Если Число(НомерЛиста) > 0 Тогда
Если ПустаяСтрока(СокрЛП(Строка(ИмяЛиста))) = 0 Тогда
Если гл8Excel_ЛистСНомеромСуществует(РабочаяКнига, НомерЛиста) = 1 Тогда
Res=1;
РабочаяКнига.WorkSheets(Число(НомерЛиста)).Name = СокрЛП(Строка(ИмяЛиста));
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецЕсли;
Возврат Res;
КонецФункции // гл8Excel_ПереименоватьЛистПоНомеру
// ----------------------------------------------------------------------
// ----------------------------------------------------------------------
// (c) Venger Alex, Odessa, 2007
// Проверить, существует ли лист с заданным именем
// Параметры:
// РабочаяКнига - ссылка на Workbook (OLE). Ссылка должна существовать
// ИмяЛиста - имя листа, который проверяем
// Возвращаемое значение, =1 - Да, =0 - Нет
Функция гл8Excel_ЛистСИменемСуществует(РабочаяКнига, ИмяЛиста) Экспорт
Перем Res;
Res=0;
ИмяЛиста = Строка(СокрЛП(ИмяЛиста));
Если ТипЗначения(РабочаяКнига)=100 Тогда //OLE._Workbook 100
Если ПустаяСтрока(ИмяЛиста) = 0 Тогда
КолвоЛистов=РабочаяКнига.WorkSheets.Count;
Для I = 1 По КолвоЛистов Цикл
Если Строка(СокрЛП(РабочаяКнига.WorkSheets(I).Name)) = ИмяЛиста Тогда
Res = 1;
Прервать;
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецЕсли;
Возврат Res;
КонецФункции // гл8Excel_ЛистСИменемСуществует
// ----------------------------------------------------------------------
// ----------------------------------------------------------------------
// (c) Venger Alex, Odessa, 2007
// Переименовать лист по имени листа
// Параметры:
// РабочаяКнига - ссылка на Workbook (OLE). Ссылка должна существовать
// ИмяЛиста - имя листа, который будем переименовывать
// НовоеИмяЛиста - имя, которое дадим листу
// Возвращаемое значение, =1 - Ok, =0 - неудачно
Функция гл8Excel_ПереименоватьЛистПоИмени(РабочаяКнига, ИмяЛиста, НовоеИмяЛиста) Экспорт
Перем Res;
Res=0;
ИмяЛиста = Строка(СокрЛП(ИмяЛиста));
НовоеИмяЛиста = Строка(СокрЛП(НовоеИмяЛиста));
Если ТипЗначения(РабочаяКнига)=100 Тогда //OLE._Workbook 100
Если ПустаяСтрока(ИмяЛиста) = 0 Тогда
Если ПустаяСтрока(НовоеИмяЛиста) = 0 Тогда
Если гл8Excel_ЛистСИменемСуществует(РабочаяКнига, ИмяЛиста) = 1 Тогда
Res=1;
РабочаяКнига.WorkSheets(ИмяЛиста).Name = НовоеИмяЛиста;
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецЕсли;
Возврат Res;
КонецФункции // гл8Excel_ПереименоватьЛистПоИмени
// ----------------------------------------------------------------------
// ----------------------------------------------------------------------
// (c) Venger Alex, Odessa, 2007
// Получить ссылку на Worksheet (OLE) по имени листа
// Параметры:
// РабочаяКнига - ссылка на Workbook (OLE). Ссылка должна существовать
// ИмяЛиста - имя листа, ссылку на который хотим получить
// РабочийЛист - переменная, куда положим ссылку на лист
// Возвращаемое значение, =1 - Ok, =0 - неудачно
Функция гл8Excel_ПолучитьЛистПоИмени(РабочаяКнига, ИмяЛиста, РабочийЛист) Экспорт
Перем Res;
Res=0;
ИмяЛиста = Строка(СокрЛП(ИмяЛиста));
Если ТипЗначения(РабочаяКнига)=100 Тогда //OLE._Workbook 100
Если ПустаяСтрока(ИмяЛиста) = 0 Тогда
Если гл8Excel_ЛистСИменемСуществует(РабочаяКнига, ИмяЛиста) = 1 Тогда
Res=1;
РабочийЛист = РабочаяКнига.WorkSheets(ИмяЛиста);
РабочийЛист.Select();
КонецЕсли;
КонецЕсли;
КонецЕсли;
Возврат Res;
КонецФункции // гл8Excel_ПолучитьЛистПоИмени
// ----------------------------------------------------------------------
// ----------------------------------------------------------------------
// (c) Venger Alex, Odessa, 2007
// Получить ссылку на Worksheet (OLE) по номеру листа
// Параметры:
// РабочаяКнига - ссылка на Workbook (OLE). Ссылка должна существовать
// НомерЛиста - номер листа, ссылку на который хотим получить
// РабочийЛист - переменная, куда положим ссылку на лист
// Возвращаемое значение, =1 - Ok, =0 - неудачно
Функция гл8Excel_ПолучитьЛистПоНомеру(РабочаяКнига, НомерЛиста=1, РабочийЛист) Экспорт
Перем Res;
Res=0;
НомерЛиста = Число(НомерЛиста);
Если ТипЗначения(РабочаяКнига)=100 Тогда //OLE._Workbook 100
Если НомерЛиста > 0 Тогда
Если гл8Excel_ЛистСНомеромСуществует(РабочаяКнига, НомерЛиста) = 1 Тогда
Res=1;
РабочийЛист = РабочаяКнига.WorkSheets(НомерЛиста);
РабочийЛист.Select();
КонецЕсли;
КонецЕсли;
КонецЕсли;
Возврат Res;
КонецФункции // гл8Excel_ПолучитьЛистПоНомеру
// ----------------------------------------------------------------------
// ----------------------------------------------------------------------
// (c) Venger Alex, Odessa, 2007
// Установить курсор в нужном месте на листе
// Параметры:
// РабочийЛист - ссылка на Worksheet (OLE). Ссылка должна существовать
// Row - номер строки, куда устанавливаем курсор
// Col - номер столбца, куда устанавливаем курсор
// Возвращаемое значение, =1 - Ok, =0 - неудачно
Функция гл8Excel_УстановитьКурсорНаЛисте(РабочийЛист, Row=1, Col=1) Экспорт
Перем Res;
Res=0;
Row = Число(Row);
Col = Число(Col);
Если ТипЗначения(РабочийЛист)=100 Тогда //OLE._Worksheet 100
Если (Row > 0) И (Col > 0) Тогда
РабочийЛист.Cells(Row, Col).Select();
Res = 1;
КонецЕсли;
КонецЕсли;
Возврат Res;
КонецФункции // гл8Excel_УстановитьКурсорНаЛисте
// ----------------------------------------------------------------------
// ----------------------------------------------------------------------
// (c) Venger Alex, Odessa, 2007
// Добавить картинку из файла в нужном месте на листе
// Высота строки под картинкой устанавливается равной высоте картинки
// и первая ячейка под картинкой заполняется, чтобы можно было узнать,
// с помощью функции гл8Excel_ПолучитьКоординатыПоследнейЯчейкиОбластиДанныхЛиста
// где конец картинки
// Параметры:
// Excel - ссылка на Excel (OLE). Ссылка должна существовать
// РабочийЛист - ссылка на Worksheet (OLE). Ссылка должна существовать
// Row - номер строки, куда устанавливаем картинку
// Col - номер столбца, куда устанавливаем картинку
// Файл - путь к файлу на диске, который добавляем на лист
// Возвращаемое значение, =1 - Ok, =0 - неудачно
Функция гл8Excel_ДобавитьКартинкуНаЛист(Excel, РабочийЛист, Row=1, Col=1, Файл) Экспорт
Перем Res;
Res=0;
Row = Число(Row);
Col = Число(Col);
Если ТипЗначения(Excel)=100 Тогда //OLE._Application 100
Если ТипЗначения(РабочийЛист)=100 Тогда //OLE._Worksheet 100
Если (Row > 0) И (Col > 0) Тогда
гл8Excel_УстановитьКурсорНаЛисте(РабочийЛист, Row, Col);
Если гл8ЭтоФайл(Файл) = 1 Тогда
// Вставляем картинку в место, где спозиционирован курсор и выделяем ее
РабочийЛист.Pictures.Insert(Файл).Select();
// Узнаем высоту картинки, если больше 400, то уменьшаем до 400
Если Число(Excel.Application.Selection.ShapeRange.Height())>400 Тогда
Excel.Application.Selection.ShapeRange.Height=400;
КонецЕсли;
// Узнаем высоту картинки
PictureHeight=Excel.Application.Selection.ShapeRange.Height();
// Устанавливаем туже высоту, для строки под картинкой
РабочийЛист.Rows(Row).RowHeight = PictureHeight;
// Ячейку под картинкой заполняем и форматируем
РабочийЛист.Cells(Row, Col).Value = "Картинка";
РабочийЛист.Cells(Row, Col).HorizontalAlignment = (-4108); // По центру
РабочийЛист.Cells(Row, Col).VerticalAlignment = (-4108); // По центру
Res = 1;
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецЕсли;
Возврат Res;
КонецФункции // гл8Excel_ДобавитьКартинкуНаЛист
// ----------------------------------------------------------------------
// ----------------------------------------------------------------------
// (c) Venger Alex, Odessa, 2007
// Определить координаты последней ячейки области данных таблицы Excel для заданного листа
// Параметры :
// Excel - ссылка на Excel (OLE). Ссылка должна существовать
// Row,Col - возвращаемые параметры, соответственно Строка(Row) и Столбец(Col)
// Лист - ссылка на Worksheet (OLE). Ссылка должна существовать
// ПозиционироватьКурсор - если >0, то курсор устаканится на найденной ячейке,
// если <=0, то останется там же, где и был
// Функция возвращает 1, если все Ok и 0 в противном случае
// Алгоритм взят: (c) Sergey Popov, Usinsk, Komi, 2003, но лист указывается не по номеру, а по ссылке
Функция гл8Excel_ПолучитьКоординатыПоследнейЯчейкиОбластиДанныхЛиста(Excel, Row, Col, Лист, ПозиционироватьКурсор=0) Экспорт
Перем Res;
Res=0;
Row=0;
Col=0;
Если ТипЗначения(Excel)=100 Тогда //OLE._Application 100
Если ТипЗначения(Лист)=100 Тогда //OLE._Worksheet 100
Если ЧИСЛО(ПозиционироватьКурсор)>0 Тогда
V=ЧИСЛО(Лист.Cells.SpecialCells(11).Select);
Если V=(-1) Тогда //стандарт OLE
Row = Excel.ActiveCell.Row;
Col = Excel.ActiveCell.Column;
Res=1;
КонецЕсли;
Иначе
V=Лист.Range("A1").SpecialCells(11);
Если ТипЗначения(V)=100 Тогда //OLE.Range 100
Row = V.Row;
Col = V.Column;
Res=1;
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецЕсли;
Возврат Res;
КонецФункции // гл8Excel_ПолучитьКоординатыПоследнейЯчейкиОбластиДанныхЛиста
// ----------------------------------------------------------------------
// ----------------------------------------------------------------------
// (c) Venger Alex, Odessa, 2007
// ТаблицаЗначений копируется в Excel.
// Параметры :
// Excel - ссылка на Excel (OLE). Ссылка должна существовать
// Лист - ссылка на Worksheet (OLE). Ссылка должна существовать
// ТЗ - ТаблицаЗначений, которую нужно скопировать в Excel
// НачСтрокаВыводаТЗвExcel - начальная строка в Excel, с которой будут выводиться строки ТЗ
// КопироватьЗаголовкиКолонок - если >0, то будут скопированы Заголовки Колонок ТЗ
// Заголовок - Заголовок, который будет скопирован в Excel перед ТЗ
// Происходит кое-какое форматирование в Excel
// Заголовок - жирным, шрифтом большим, чем все остальное на 1
// Заголовки колонок - выравнивание по вертикали/горизонтали по центру, жирным, ячейки серого цвета
// После вывода ячейки - автоподбор ширины
// Возвращаемое значение, =1 - Ok, =0 - неудачно
// Алгоритм взят: (c) Sergey Popov, Usinsk, Komi, 2003, но указывается лист, на который слить инфу
// Плюс происходит некоторое форматирование ячеек
Функция гл8Excel_ДобавитьТЗНаЛист(Excel, Лист, ТЗ, НачСтрокаВыводаТЗвExcel=3, КопироватьЗаголовкиКолонок=1, Заголовок="") Экспорт
Перем Res;
Перем ЗагКол;
Res=0;
Если ТипЗначения(Excel)=100 Тогда //OLE._Application 100
Если ТипЗначения(Лист)=100 Тогда //OLE._Worksheet 100
Если ВРег(СокрЛП(ТипЗначенияСтр(ТЗ)))=ВРег("ТаблицаЗначений") Тогда
ЗГ= СокрЛП(Заголовок);
КолвоКол = ТЗ.КоличествоКолонок();
КолвоСтр = ТЗ.КоличествоСтрок();
Если КолвоКол>0 Тогда
Res=1;
Если ЧИСЛО(НачСтрокаВыводаТЗвExcel)>1 Тогда
Если СтрДлина(ЗГ)>0 Тогда
Лист.Cells(ЧИСЛО(НачСтрокаВыводаТЗвExcel)-1,1).Value = ЗГ;
// Форматирование ячеек
Лист.Cells(ЧИСЛО(НачСтрокаВыводаТЗвExcel)-1,1).Font.Bold = 1; // Жирным
FontSize = Лист.Cells(ЧИСЛО(НачСтрокаВыводаТЗвExcel)-1,1).Font.Size;
Лист.Cells(ЧИСЛО(НачСтрокаВыводаТЗвExcel)-1,1).Font.Size = FontSize + 1; // Увеличиваем шрифт
КонецЕсли;
КонецЕсли;
Если ЧИСЛО(КопироватьЗаголовкиКолонок)>0 Тогда
i=0;
Пока i<КолвоКол Цикл
i=i+1;
ИдКол=СокрЛП(ТЗ.ПолучитьПараметрыКолонки(ЧИСЛО(i), , , , ЗагКол));
Лист.Cells(ЧИСЛО(НачСтрокаВыводаТЗвExcel),i).Value = "'"+ЗагКол;
// Форматирование ячеек
Лист.Cells(ЧИСЛО(НачСтрокаВыводаТЗвExcel),i).HorizontalAlignment = (-4108); // По центру
Лист.Cells(ЧИСЛО(НачСтрокаВыводаТЗвExcel),i).VerticalAlignment = (-4108); // По центру
Лист.Cells(ЧИСЛО(НачСтрокаВыводаТЗвExcel),i).Font.Bold = 1; // Жирным
Лист.Cells(ЧИСЛО(НачСтрокаВыводаТЗвExcel),i).Interior.ColorIndex = 15; // Серый цвет
Лист.Cells(ЧИСЛО(НачСтрокаВыводаТЗвExcel),i).Interior.Pattern = 1; // Залить цветом
Лист.Columns(i).EntireColumn.AutoFit(); // Автоподбор ширины колонки
КонецЦикла;
КонецЕсли;
Если КолвоСтр>0 Тогда
j=0;
Пока j<КолвоСтр Цикл
j=j+1;
i=0;
Пока i<КолвоКол Цикл
i=i+1;
ИдКол=СокрЛП(ТЗ.ПолучитьПараметрыКолонки(ЧИСЛО(i)));
V=СокрЛП(ТЗ.ПолучитьЗначение(j,ИдКол));
Лист.Cells(j+ЧИСЛО(НачСтрокаВыводаТЗвExcel),i).Value = "'"+V;
// Форматирование ячеек
Лист.Columns(i).EntireColumn.AutoFit(); // Автоподбор ширины колонки
КонецЦикла;
КонецЦикла;
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецЕсли;
Возврат Res;
КонецФункции // гл8Excel_ДобавитьТЗНаЛист
// ----------------------------------------------------------------------
//----------------------------------------------------------------------
// (c) Venger Alex, Odessa, 2007
// Возвращает 1 - если Путь - это файл, 0 - в противном случае
// Если файл не существует возвращает -1
Функция гл8ЭтоФайл(Путь) Экспорт
// 22.10.2007
Перем Res; // Возвращаемое значение, число
Перем ЧтоЭто; // Число, 1 - каталог, 0 - файл, -1 - не существует
ЧтоЭто = гл8ПолучитьЗначениеАтрибутаФайлаПоКоду(Путь, 4);
Если ЧтоЭто = 1 Тогда
Res = 0;
ИначеЕсли ЧтоЭто = 0 Тогда
Res = 1;
ИначеЕсли ЧтоЭто = -1 Тогда
Res = ЧтоЭто;
КонецЕсли;
Возврат Res;
КонецФункции // гл8ЭтоФайл
//----------------------------------------------------------------------
//----------------------------------------------------------------------
// (c) Venger Alex, Odessa, 2007
// Возвращает значение заданного атрибута файла по коду, если файла нет возвращает -1
// Путь - путь к файлу или папке
// КодАтрибута может принимать след. значения:
// 1 - файл только для чтения, функция возвращает 1, если да, 0 - если нет
// 2 - скрытый файл, функция возвращает 1, если да, 0 - если нет
// 3 - системный файл, функция возвращает 1, если да, 0 - если нет
// 4 - каталог, функция возвращает 1, если да, 0 - если нет
// 5 - архивный файл, функция возвращает 1, если да, 0 - если нет
// 6 - обычный файл (все другие атрибуты не установлены), функция возвращает 1, если да, 0 - если нет
// 7 - временный файл, функция возвращает 1, если да, 0 - если нет
// 8 - файл, сжатый каким-либо архиватором, функция возвращает 1, если да, 0 - если нет
// 9 - нет доступа к файлу, функция возвращает 1, если да, 0 - если нет
Функция гл8ПолучитьЗначениеАтрибутаФайлаПоКоду(Путь, КодАтрибута) Экспорт
// 22.10.2007
Перем Res; // Возвращаемое значение, число - значение конкретного атрибута
Перем FileSize, Attrb, TimeCreate, TimeLastOpen, TimeLastWrite, FullFileName;
Если ФС.СуществуетФайл(Путь) = 1 Тогда
ФС.АтрибутыФайла(Путь, FileSize, Attrb, TimeCreate, TimeLastOpen, TimeLastWrite, FullFileName);
Res = Число(Сред(Attrb, Число(КодАтрибута), 1));
Иначе
Res = -1;
КонецЕсли;
Возврат Res;
КонецФункции // гл8ПолучитьЗначениеАтрибутаФайлаПоКоду
//----------------------------------------------------------------------