//------------------Объявления функций: //========= 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ПолучитьЗначениеАтрибутаФайлаПоКоду //----------------------------------------------------------------------
Вступайте в нашу телеграмм-группу Инфостарт