БЛАНКСШАБЛОНОМ [29.12.2007] "Процедуры и функции для работы с MS Excel через Yoksel.exe";
--Установка COM-сервера Yoksel.dll:regsvr32 Yoksel.dll
--Деинсталяция COM-сервера Yoksel.dll:regsvr32 /u Yoksel.dll

--                Параметры командной строки
--“Параметр     “Сокращенный “Аргумент              “ Описание
--“             “вариант     “                      “
--Ґ¤¤¤¤¤¤¤¤¤¤¤¤¤Ґ¤¤¤¤¤¤¤¤¤¤¤¤Ґ¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤Ґ¤¤¤¤¤¤¤¤¤
--“help         “-?          “нет                   “ Вывод справки по командам.
--“open         “-o          “Имя файла             “ Открывает указанный файл. Опцию --open можно не указывать. Любое имя файла будет интерпретироваться как параметр опции --open.
--“close        “-c          “нет                   “ Закрывает приложение после выполнения всех запрошенных действий.
--“sheet        “нет         “Порядковый номер листа“ Открывает лист Excel с данным порядковым номером в книге, открытой по запросу через параметр --open.
--“print        “-p          “нет                   “ Выводит на печать все открываемые документы.
--“output_file  “нет         “Имя файла             “ Файл, куда следует сохранить открытый документ.
--“output_format“нет         “Название формата      “ Формат, в котором следует сохранить открытый документ. Возможные значения: mxl, xls, bmp, jpg, png.

-- примеры:
-- Открыть файл test.mxl и распечатать его:Yoksel.exe --open test.mxl --print
-- Сокращенный вариант:Yoksel.exe test.mxl --print
-- Открыть лист номер 2 из книги "C:/Мои документы/План.xls", распечатать его и закрыть Йоксель:Yoksel.exe --open "C:/Мои документы/План.xls" --sheet 2 --print --close
-- Открыть файл test.mxl, сохранить его в формате PNG и закрыть Йоксель:Yoksel.exe test.mxl --output_file test.png --output_format png --close
-- Открыть файл test.mxl, сохранить его в формате Excel, распечатать и закрыть Йоксель:Yoksel.exe test.mxl --output_file text.xls --output_format xls --print --close
-- Открыть лист номер 1 книги test.xls и сохранить его в формате mxl:Yoksel.exe test.xls --sheet 1 --output_file test.mxl --output_format mxl

-- Форматные строки

--Общий формат  "@"
--длина дробной части - 2 цифры, длина не фиксирована - если длина дробной части меньше 2, то будет отображено столько символов, сколько есть;
--разделитель дробной части - "." (точка);
--разделитель триад - " " (пробел).

--Числовой формат  "Nm.n", где
--m - общая длина представления в цифрах (длина целой части + длина дробной части),
--n - длина дробной части.
--Например: "Ч10.2". Общая длина, естественно, должна быть больше или равна длине дробной части.
--Если это не выполнено, то для форматирования числа будет использован формат по умолчанию.
--Если длина дробной части числа превышает заданную в формате,
--то число округляется до требуемого количества знаков после запятой по стандартным математическим правилам.
--Перед общей длиной числа может стоять последовательность "(0)".
--Это означает, что если длина числа меньше заданной, то представление числа будет дополняться слева нулями, чтобы достигнуть заданной длины.
--Например, для формата "Ч(0)6.2" число 34 будет отформатировано как "0034".
--Если же длина числа больше заданной, то число будет отображаться как есть. В отличие от 1С:Предприятия 7.7 в Йокселе принято правило, что число не должно искажаться, если оно длинее, чем задано в формате.
--Т.е. число 123456 для формата "Ч3.2" отобразится как "9.9", а в Йокселе как "123456".
--Перед длиной дробной части может стоять символ "0". Например: "Ч10.02".
--Это означает, что длина дробной части фиксирована и, если длина дробной части меньше, чем заданная,
--то число будет дополнено нулями справа до достижения требуемой длины.
--Например, для формата "Ч.02" число 34.6 будет выглядеть как "34.60", а число 5 как "5.00".
--Сразу после длины дробной части может следовать произвольный символ - символ-разделитель дробной части.
--Например, для формата "Ч.2-" число 123.45 будет отформатировано как "123-45".
--Сразу после разделителя дробной части может следовать другой произвольный символ - символ разделитель триад.
--Если этот символ присутствует, то при форматировании это включает режим группировки цифр целой части числа по 3 цифры в группе.
--Группы будут отделяться друг от друга символом, указанным в форматной строке.
--Например, для формата "Ч.02. " число 123456789 будет отформатировано как "123 456 789.00".
--После символов разделителей триад и дробной части или вместо них может идти последовательность ">m", где m - произвольное число.
--Эта последовательность включает арифметический "сдвиг" при форматировании.
--Если число m - положительно, то перед форматированием заданное число сдвигается вправо на заданное количество десятичных позиций (делится на 10 в степени m).
--Если m - отрицательно, то число сдвигается влево (умножается на 10 в степени -m). Пример:
--"Ч10.2>2" преобразует число 123.45 в "1.23";
--"Ч10.2>-2" преобразует число 123.45 в "12345";
var Yoksel_status:i;-- 0=не проверялся; 1=Yoksel доступен; -1=Yoksel не доступен
var Excel_status:i;-- 0=не проверялся; 1=Excel доступен; -1=Excel не доступен
Func ОбъектДоступен(ИмяОбъекта:s):l;
var xlsApp:AutoObject;
var ll:l;
   try
    xlsApp=CreateAutoObject(ИмяОбъекта);
    ClearVariable(xlsApp); -- освободить объект
    ll=true;
   except
    ll=false;
   end;
   ^ll;
end;
Func YokselReady:l;
var ll:l;
  if Yoksel_status=0:
     ll=ОбъектДоступен('Yoksel');
     if ll  :Yoksel_status=1;
      | true:Yoksel_status=-1;
     fi;
  fi;
  ^Yoksel_status=1;
end;
Func ExcelReady:l;
var ll:l;
  if Excel_status=0:
     ll=ОбъектДоступен('Excel.Application');
     if ll  :Excel_status=1;
      | true:Excel_status=-1;
     fi;
  fi;
  ^Excel_status=1;
end;

-- Yoksel
-- Yoksel   =CreateAutoObject('Yoksel'); -- доступ к Yoksel

--ОбластьТабличногоДокумента
--SpreadsheetDocument =AsAutoObject(Yoksel.CreateSpreadsheetDocument);
--SpreadsheetDocument =AsAutoObject(Yoksel.ОбластьТабличногоДокумента);

--AreaColumn          =AsAutoObject(SpreadsheetDocument.Area(0,Num,0,Num));
--AreaRow             =AsAutoObject(SpreadsheetDocument.Area(Num,0,Num,0));
--AreaCell            =AsAutoObject(SpreadsheetDocument.Area(X,Y));
--AreaRange           =AsAutoObject(SpreadsheetDocument.Area(Y1,X1,Y2,X2));
--  xlsColumn=AsAutoObject(objSheet.Area(0 ,Num,0 ,Num));

--СВОЙСТВА для ОбластьТабличногоДокумента:
--ВертикальноеПоложение=TextVerticalAlign
var КлеткаВыравниваниеВертикаль_верх :i =0;
var КлеткаВыравниваниеВертикаль_центр:i =1;
var КлеткаВыравниваниеВертикаль_низ  :i =2;
--SpreadsheetDocument.TextVerticalAlign=1;

--ГоризонтальноеПоложение=TextHorizontalAlign  - совпадает с CellAlignment из ТБ!
var КлеткаВыравнивание_лево   :i =0;
var КлеткаВыравнивание_право  :i =1;
var КлеткаВыравнивание_центр  :i =2;
var КлеткаВыравнивание_ширина :i =3;
--SpreadsheetDocument.TextHorizontalAlign=2;

--ВидимостьКолонки=ColumnVisibility
var СтбВидим_нет :i =0; -- ColVisible = false
var СтбВидим_да  :i =1; -- ColVisible = true

--ВидимостьСтроки=RowVisibility   
var СтрВидим_нет :i =0; -- RowVisible = false
var СтрВидим_да  :i =1; -- RowVisible = true

--Зачеркнутый=Strikeout
var сфЗачерк_нет :i =0; --
var сфЗачерк_да  :i =1; --  для CellFontStyle|КлеткаСтильШрифта добавочное значение константы ТБ fsStrikeout|сфЗачерк

--Курсив=Italic
var сфНаклон_нет :i =0; --
var сфНаклон_да  :i =1; --  для CellFontStyle|КлеткаСтильШрифта добавочное значение константы ТБ fsItalic|сфНаклон

--Подчеркнутый=Underline
var сфПодчерк_нет :i =0; --
var сфПодчерк_да  :i =1; --  для CellFontStyle|КлеткаСтильШрифта добавочное значение константы ТБ fsUnderline|сфПодчерк

--Полужирный=Bold
var сфЖирность_нет :i=0; --
var сфЖирность_да  :i=1; --  для CellFontStyle|КлеткаСтильШрифта добавочное значение константы ТБ fsBold|сфЖирность

--РазмерШрифта=FontHeight  Высота шрифта в пунктах. Чтение и запись. Допускаются дробные значения. в ТБ аналог CellFontSize|КлеткаРазмерШрифта
--AreaRange.FontHeight=20

--НаборСимволов=Charset
--0 - ANSI,
--1 - Прибалтийский,
--2 - Китайский (традиционное письмо),
--3 - По умолчанию для системы,
--4 - Центральная Европа,
--5 - Китайский (упрощенное письмо),
--6 - Греческий,
--7 - Корейский,
--8 - Mac,
--9 - OEM,
--10 - Кириллица,
--11 - Японский,
--12 - Символьный,
--13 - Турецкий,
--14 - Вьетнамский,
--15 - JOHAB,
--16 - Арабский,
--17 - Иврит,
--18 - Тайский.

--Стили рамок
--0 - нет рамки,
--1 - точечная,
--2 - точечная серая,
--3 - тонкая штрих-две точки,
--4 - тонкая штрих-точка,
--5 - тонкая, короткие штрихи,
--6 - тонкая, длинные штрихи,
--7 - тонкая сплошная,
--8 - средняя, штрих-две точки,
--9 - средняя, штрих-точка,
--10 - средняя, штрих-две точки, косая,
--11 - средняя, штрихи,
--12 - средняя, сплошная,
--13 - толстая сплошная,
--14 - двойная.

--Объединение=MergedCells аналог CellLinks ТБ
--0-разъединить
--1-объединить
--AreaRange.MergedCells=1

--Значение=Value
--AreaRange.Value=НовоеЗначение; НовоеЗначение=пустое значение,число,дата,строка.

--Текст=Text
--AreaRange.Text=НовоеЗначение; НовоеЗначение=строка

-- Число=Number  Чтение/запись числового значения ячейки при помощи текстового представления числа без потери точности.
-- При этом в свойство "Число" записывается текстовое представление требуемого числа - например, "23.11".
-- При передаче чисел в текстовом значении должны быть только цифры без разделителей триад. В качестве разделителя дробной части используется точка: ".".
--AreaRange.Number=НовоеЗначение НовоеЗначение="12345.123456789"

--Шрифт=Font Название шрифта, которым будет отображаться текст в ячейках. Чтение и запись.
--AreaRange.Font='Times New Roman'


--Узор=Pattern  Стиль узора фона ячеек. Чтение и запись. Допустимы числовые значения от 0 до 25.
--ЦветТекста=TextColor  Цвет текста в ячейках. Чтение и запись. Представляет собой числовое значение цвета в формате RGB.
--ЦветУзора=PatternColor Цвет для отображения узора фона. Чтение и запись. Представляет собой числовое значение цвета в формате RGB.
--ЦветФона=BackgroundColor Цвет фона ячеек. Чтение и запись. Представляет собой числовое значение цвета в формате RGB.

--Контроль=TextControl Режим контроля текста в ячейке. Чтение и запись. Свойство определяет, что необходимо делать, если текст не помещается в ячейке. Возможные значения:
var TextControl_авто             :i = 0;
var TextControl_обрезать         :i = 1;-- =CellWrap|КлеткаСвертка false для ТБ
var TextControl_забивать         :i = 2;
var TextControl_переносить       :i = 3;-- =CellWrap|КлеткаСвертка true для ТБ
var TextControl_красный          :i = 4;
var TextControl_забивать_красный :i = 5;
--AreaRange.TextControl=TextControl_переносить

--ОриентацияТекста=TextOrientation Угол поворота текста в градусах. Чтение и запись.
--AreaRange.TextOrientation=90



--МЕТОДЫ для ОбластьТабличногоДокумента:

--АвтоподборШириныКолонки=AutoSetupColumnWidth  Подстройка ширины колонки под содержимое. Вызов метода аналогичен двойному клику по разделителю колонок в Excel.
--AreaRange.AutoSetupColumnWidth=0  --будут проанализированы все строки колонок области, даже если область включает только часть строки листа.
--AreaRange.AutoSetupColumnWidth=1  --будут проанализированы только строки, входящие в область.

--ВысотаСтроки=RowHeight  Получает/устанавливает высоту строк, проходящих через область.
--Высота строки в пунктах.
---1 или не указывать параметр, то высота изменяться не будет.
-- 0 высота строки будет установлена в "Авто" и будет определяться содержимым.

--Рамка=Border
--Рамка(РамкаСлева, РамкаСверху, РамкаСправа, РамкаСнизу);

--РамкаОбвести=BorderOutline
--РамкаОбвести(РамкаСлева, РамкаСверху, РамкаСправа, РамкаСнизу);

--ШиринаСтолбца=ColumnWidth Устанавливает ширину столбцов, проходящих через область.





var формат_деньги:s='Ч.02. ';
var формат_число:s='Ч.9. ';
var Exel_nn[]:n;
var Exel_ss[]:s;
Proc УстановитьШиринуСтолбца (objSheet :AutoObject; Num :Integer; Val :Numeric);
  var xlsColumn,xlsRange :AutoObject;
  Val=Val/16;
  xlsColumn=AsAutoObject(objSheet.Area(1 ,Num,1 ,Num));
  try
--    xlsColumn.Текст="Прайс-лист";
    xlsRange=xlsColumn;
    xlsColumn.ColumnWidth(Val);
--    xlsColumn.TextControl=TextControl_переносить;
    ClearVariable(xlsRange);
  except
    ClearVariable(xlsRange);
  end;
end;

Proc НарисоватьГраницуЯчейки (objSheet :AutoObject; Border :Integer;  X :Integer; Y :Integer);
  var xlsRange :AutoObject;
  xlsRange=AsAutoObject(objSheet.Area(X,Y));
    try
      xlsRange.Border(Border,Border,Border,Border);
    finally
      ClearVariable(xlsRange);
    end;
end;

Proc НарисоватьГраницуЯчейкиДиапазона (objSheet :AutoObject; Border :Integer; Y1 :Integer;X1 :Integer;  Y2 :Integer ;X2 :Integer );
  var xlsRange :AutoObject;
  xlsRange=AsAutoObject(objSheet.Area(Y1,X1,Y2,X2,));
    try
      xlsRange.Border(Border,Border,Border,Border);
    finally
      ClearVariable(xlsRange);
    end;
end;

Proc УстановитьТекстЯчейки (objSheet :AutoObject;  Y :Integer; X :Integer; Text :String; FontSize :Integer; Bold :Logical; Alignment :Integer);
  var xlsRange :AutoObject;
  xlsRange=AsAutoObject(objSheet.Area(Y,X));
  try
--    xlsRange.Font=Font;
    xlsRange.FontHeight=FontSize;
    xlsRange.Bold=if(Bold,1,0);
    xlsRange.TextHorizontalAlign=Alignment;
    xlsRange.Text=Text;
  finally
    ClearVariable(xlsRange);
  end;
end;
Proc УстановитьЧислоЯчейкиПоСтолбцу (objSheet :AutoObject; X :Integer; Y :Integer;Z :Integer;  FontSize :Integer; Bold :Logical; Alignment :Integer);
  var xlsRange :AutoObject;
  var j:i;

  try
      for j=1..z do
        try
        xlsRange=AsAutoObject(objSheet.Area(X-1+j,Y));
        xlsRange.Value=Exel_nn[j];
        finally
          ClearVariable(xlsRange);
        end;
      od;
    xlsRange=AsAutoObject(objSheet.Area(x ,y,x-1+z ,y));
--    xlsRange.Font=Font;
--    xlsRange.Format="Ч.02,'";
    xlsRange.Format="Ч10.4,'";
--    xlsRange.Format="@";
    xlsRange.FontHeight=FontSize;
    xlsRange.Bold=if(Bold,1,0);
    xlsRange.TextHorizontalAlign=Alignment;
  finally
    ClearVariable(xlsRange);
  end;
end;
Proc УстановитьТекстЯчейкиПоСтолбцу (objSheet :AutoObject; X :Integer; Y :Integer;Z :Integer;  FontSize :Integer; Bold :Logical; Alignment :Integer);
  var xlsRange :AutoObject;
  var j:i;

  try
      for j=1..z do
        try
        xlsRange=AsAutoObject(objSheet.Area(X-1+j,Y));
        xlsRange.text=Exel_ss[j];
        finally
          ClearVariable(xlsRange);
        end;
      od;
    xlsRange=AsAutoObject(objSheet.Area(x ,y,x-1+z ,y));
--    xlsRange.Font=Font;
    xlsRange.FontHeight=FontSize;
    xlsRange.Bold=if(Bold,1,0);
    xlsRange.TextHorizontalAlign=Alignment;
    xlsRange.TextControl=TextControl_переносить;
--      xlsRange.NumberFormat='# ##0,00';
  finally
    ClearVariable(xlsRange);
  end;
end;

Proc УстановитьТекстЯчейки2 (objSheet :AutoObject; X :Integer; Y :Integer; Text :String; FontSize :Integer; Bold :Logical; AlignmentH :Integer; AlignmentV :Integer; WrapText :Logical);
  var xlsRange :AutoObject;
  xlsRange=AsAutoObject(objSheet.Area(Y,X));
  try
    xlsRange.FontHeight=FontSize;
    xlsRange.Bold=if(Bold,1,0);
    xlsRange.TextHorizontalAlign=AlignmentH;
    xlsRange.TextVerticalAlign=AlignmentV;
    xlsRange.Text=Text;
    xlsRange.TextOrientation=if(WrapText,90,0);
  finally
    ClearVariable(xlsRange);
  end;
end;



Proc УстановитьЧислоЯчейки (objSheet :AutoObject; X :Integer; Y :Integer; Значение_ :Numeric; FontSize :Integer; Bold :Logical; AlignmentH :Integer; NumberFormat:s);
  var xlsRange :AutoObject;
  xlsRange=AsAutoObject(objSheet.Area(Y,X));
  try
    if NumberFormat='':NumberFormat=формат_число;fi;
    xlsRange.Format=NumberFormat;
    xlsRange.Value=Значение_;
    xlsRange.FontHeight=FontSize;
    xlsRange.Bold=if(Bold,1,0);
    xlsRange.TextHorizontalAlign=AlignmentH;
  finally
    ClearVariable(xlsRange);
  end;
end;
Proc УстановитьДатуЯчейки (objSheet :AutoObject; X :Integer; Y :Integer; Значение_ :d; FontSize :Integer; Bold :Logical; AlignmentH :Integer; NumberFormat:s);
  var xlsRange :AutoObject;
  xlsRange=AsAutoObject(objSheet.Area(Y,X));
  try
    xlsRange.Value=Значение_;
    if NumberFormat='':NumberFormat='@';fi;
    xlsRange.Format=NumberFormat;
    xlsRange.FontHeight=FontSize;
    xlsRange.Bold=if(Bold,1,0);
    xlsRange.TextHorizontalAlign=AlignmentH;
  finally
    ClearVariable(xlsRange);
  end;
end;






Proc УстановитьШрифтЛиста (objSheet :AutoObject; Font :String; FontSize :Integer);
  var xlsRange,xlsFont :AutoObject;
  xlsRange=AsAutoObject(objSheet.Area());
  try
    xlsRange.Font=Font;
    xlsRange.FontHeight=FontSize;
--    xlsRange.FontHeight(FontSize);
  finally
    ClearVariable(xlsRange);
  end;
end;

Proc ОбъединитьЯчейкиДиапазона(objSheet:AutoObject; X1:Integer; Y1:Integer; X2:Integer; Y2:Integer);
var xlsRange   :AutoObject;
-- * ОБЪЕДИНИТЬ ЯЧЕЙКИ ДИАПАЗОНА *
-- objSheet    - ссылка на лист
-- X1, Y1      - координаты ячейки листа objSheet - левый верхний угол диапазона для объединения
-- X2, Y2      - координаты ячейки листа objSheet - правый нижний угол диапазона для объединения
 if  X2>=X1 and Y2>=Y1:
   xlsRange=AsAutoObject(objSheet.AREA(X1,Y1,X2,Y2));
     Try
       xlsRange.MergedCells=1;
     Finally
       ClearVariable(xlsRange);
     end;
 fi;
end;
-----------------==================== не реализованно =====================---------------------




--var Buf[] :String;


---- ПРОЦЕДУРЫ И ФУНКЦИИ


--Proc НарисоватьГраницуЯчейки_(objSheet:AutoObject; Border:Integer; Weight:Integer; X:Integer; Y:Integer);
---- * НАРИСОВАТЬ ЭЛЕМЕНТ ГРАНИЦЫ ЯЧЕЙКИ *
---- Это упрощенный вариант, применение нежелательно
---- objSheet    - ссылка на лист
---- Border      - элемент границы (константа Excel)
---- Weight      - толщина границы (константа Excel)
---- X, Y        - координаты ячейки листа objSheet
--var xlsRange, xlsBorder :AutoObject;
-- xlsRange=AsAutoObject(objSheet.Cells[X,Y]);
-- Try
--   xlsBorder=AsAutoObject(xlsRange.Borders[Border]);
--   Try
--     xlsBorder.Weight=Weight;
--   Finally
--     ClearVariable(xlsBorder);
--   end;
-- Finally
--   ClearVariable(xlsRange);
-- end;
--end;



--Func ФорматированнаяСумма_Число(Chislo:String) :Numeric;
---- * CЧИТАННУЮ ИЗ СЕКЦИИ ТУРБО СТРОКУ С ЧИСЛОМ ПРЕОБРАЗУЕМ В ЧИСЛО *
---- применяются символы: только цифры и точка
--var len, ii :Integer;
--var Chars, fmtStr :String;
--var Res :Numeric;
-- Res=0.00;
-- fmtStr="";
-- len=Length(Chislo);
-- if len>0 and Chislo<>"X" and Chislo<>Chr(151):
--   for ii=1 to len do
--     Chars=SubStr(Chislo, ii, 1);
--     if (Ascii(Chars)>47 and Ascii(Chars)<58) or Ascii(Chars)=46: fmtStr=fmtStr+Chars; fi;
--   od;
-- fi;
-- if fmtStr<>"": Try Res=StringToNumeric(fmtStr); Except end; fi;
-- ^Res;
--end;

--Func ЗаменитьEnter_Old(SrcString:String) :String;
---- перевода строки в Excel chr(10), а в ТУРБО chr(13) -> в данной функции строка ТБ с chr(13) переводится в соответствующую с chr(10)
--var Res, codAscii : String;
--var len, ii :Integer;
-- Res="";
-- len=Length(SrcString);
-- if len>0:
--   for ii=1 to len do
--     codAscii=SubStr(SrcString, ii, 1);
--     if Ascii(codAscii)=13: Res=Res+Chr(10); else Res=Res+codAscii; fi;
--   od;
-- fi;
-- ^Res;
--end;

--Func ЗаменитьСимволСтрокиВпозиции(valStr:String; repChar:String; repPos:Integer) :String;
--var tmpFirst, tmpLast, out :String;
--var len :Integer;
-- tmpFirst=""; tmpLast=""; out="";
-- len=Length(valStr);
-- if repPos<1: repPos=1; fi;
-- if repPos>len or repChar="" or valStr="": ^valStr; fi;
-- repChar=SubStr(repChar, 1, 1);
-- if repPos>1: tmpFirst=SubStr(valStr, 1, repPos-1); else tmpFirst=""; fi;
-- if repPos<len: tmpLast=SubStr(valStr, repPos+1, len-repPos); else tmpLast=""; fi;
-- out=tmpFirst+repChar+tmpLast;
-- ^out;
--end;

--Func ЗаменитьEnter(srcString:String) :String;
---- перевода строки в Excel chr(10), а в ТУРБО chr(13) -> в данной функции строка ТБ с chr(13) переводится в соответствующую с chr(10)
--var pp :Integer;
-- pp=Pos(Chr(13), srcString);
-- while pp>0 do srcString=ЗаменитьСимволСтрокиВпозиции(srcString, Chr(10), pp); pp=Pos(Chr(13), srcString); od;
-- ^srcString;
--end;

--Func УбратьEnter(SrcString:String) :String;
---- в данной функции из строка ТБ убирается символ chr(13)
--var Res, codAscii : String;
--var len, ii :Integer;
-- Res="";
-- len=Length(SrcString);
-- if len>0:
--   for ii=1 to len do
--     codAscii=SubStr(SrcString, ii, 1);
--     if Ascii(codAscii)<>13: Res=Res+codAscii; fi;
--   od;
-- fi;
-- ^Res;
--end;

--Proc ФорматироватьЯчейку(objSheet:AutoObject; X:Integer; Y:Integer; HAlign:Integer; lvlIndent:Integer; VAlign:Integer; txtWrap:Logical; FontFamily:String; FontSize:Integer; FontColor:Integer; AutoFontColor:Logical; FontBold:Logical; FontItalic:Logical; CellColor:Integer; NoCellColor:Logical);
---- * ФОРМАТИРОВАТЬ ЯЧЕЙКУ (УСТАНОВИТЬ СТИЛЬ) *
---- Основная процедура для форматирования ячейки
---- objSheet      - ссылка на лист
---- X, Y          - координаты ячейки листа objSheet
---- HAlign        - горизонтальное выравнивание ячейки (константа Excel)
---- lvlIndent     - отступ текста от края ячейки
---- VAlign        - вертикальное выравнивание ячейки (константа Excel)
---- txtWrap       - автопернос слов в ячейки
---- FontFamily    - Название установленного в Windows шрифта TTF
---- FontSize      - размер шрифта
---- FontColor     - цвет шрифта (константа Excel)
---- AutoFontColor - цвет шрифта определяется автоматически (параметр FontColor игнорируется)
---- FontBold      - жирность шрифта (да/нет)
---- FontItalic    - курсив шрифта   (да/нет)
---- CellColor     - цвет ячейки (константа Excel) - заливка цветом всегда сплошная (xlSolid)
---- NoCellColor   - цвет ячейки по умолчанию (параметр CellColor игнорируется)
--var xlsRange, xlsFont :AutoObject;
-- xlsRange=AsAutoObject(objSheet.Cells[X,Y]);
-- Try
--   xlsRange.HorizontalAlignment = HAlign;
--   xlsRange.VerticalAlignment   = VAlign;
--   xlsRange.WrapText = txtWrap;
--   xlsRange.IndentLevel = lvlIndent;
--   xlsFont=AsAutoObject(xlsRange.Font);
--   Try
--     xlsFont.Name  = FontFamily;
--     xlsFont.Size  = FontSize;
--     if AutoFontColor: xlsFont.ColorIndex = РАБ.EXCEL.xlAutomatic; else xlsFont.Color = FontColor; fi;
--     xlsFont.Bold   = FontBold;
--     xlsFont.Italic = FontItalic;
--   Finally
--     ClearVariable(xlsFont);
--   end;
--   xlsFont=AsAutoObject(xlsRange.Interior);
--   Try
--     xlsFont.Pattern = РАБ.EXCEL.xlSolid;
--     if NoCellColor:
--       xlsFont.ColorIndex = РАБ.EXCEL.xlNone;
--       xlsFont.PatternColorIndex = РАБ.EXCEL.xlNone;
--     else
--       xlsFont.Color = CellColor;
--       xlsFont.PatternColorIndex = РАБ.EXCEL.xlAutomatic;
--     fi;
--   Finally
--     ClearVariable(xlsFont);
--   end;
-- Finally
--   ClearVariable(xlsRange);
-- end;
--end;

--Proc ЗаписатьЯчейкуЧисло(objSheet:AutoObject; X:Integer; Y:Integer; tbValue:Numeric; locDS:String; locTS:String);
---- * ЗАПИСАТЬ ЧИСЛО В ЯЧЕЙКУ *
---- Основная процедура для записи ЧИСЛА в ячейку
---- objSheet      - ссылка на лист
---- X, Y          - координаты ячейки листа objSheet
---- tbValue       - число для записи
---- locDS         - локальный разделитель дробной части
---- locTS         - локальный разделитель тысяч
---- locDS и locTS заранее необходимо узнать и передать в функцию, например так:
---- xlsApp=CreateAutoObject('Excel.Application');
---- Try
----   localDS=asString(xlsApp.International[РАБ.EXCEL.xlDecimalSeparator]);
----   localTS=asString(xlsApp.International[РАБ.EXCEL.xlThousandsSeparator]);
----   --xlDecimalSeparator и xlThousandsSeparator константы EXCEL
----   ... передаем в функцию
---- Except
----   ClearVariable(xlsApp);
---- end;
--var xlsRange :AutoObject;
-- xlsRange=AsAutoObject(objSheet.Cells[X,Y]);
-- Try
--   xlsRange.NumberFormat = "#"+locTS+"##0"+locDS+"00"; -- "# ##0,00"
--   xlsRange.Value2 = tbValue;
--   --xlsRange.Formula = tbValue;
-- Finally
--   ClearVariable(xlsRange);
-- end;
--end;

--Proc ЗаписатьЯчейкуЧислоПлюсМинус(objSheet:AutoObject; X:Integer; Y:Integer; tbValue:Numeric; locDS:String; locTS:String);
---- * ЗАПИСАТЬ ЧИСЛО В ЯЧЕЙКУ *
---- Основная процедура для записи ЧИСЛА в ячейку
---- objSheet      - ссылка на лист
---- X, Y          - координаты ячейки листа objSheet
---- tbValue       - число для записи
---- locDS         - локальный разделитель дробной части
---- locTS         - локальный разделитель тысяч
---- locDS и locTS заранее необходимо узнать и передать в функцию, например так:
---- xlsApp=CreateAutoObject('Excel.Application');
---- Try
----   localDS=asString(xlsApp.International[РАБ.EXCEL.xlDecimalSeparator]);
----   localTS=asString(xlsApp.International[РАБ.EXCEL.xlThousandsSeparator]);
----   --xlDecimalSeparator и xlThousandsSeparator константы EXCEL
----   ... передаем в функцию
---- Except
----   ClearVariable(xlsApp);
---- end;
--var xlsRange :AutoObject;
-- xlsRange=AsAutoObject(objSheet.Cells[X,Y]);
-- Try
--   xlsRange.NumberFormat = "+#"+locTS+"##0"+locDS+"00;-#"+locTS+"##0"+locDS+"00"; -- "+#,##0.00;-#,##0.00"
--   xlsRange.Value2 = tbValue;
-- Finally
--   ClearVariable(xlsRange);
-- end;
--end;

--Func СейчасСтильСсылокR1C1(objApp:AutoObject) :Logical;
-- if asInteger(objApp.ReferenceStyle)=РАБ.EXCEL.xlR1C1: ^True; else ^False; fi;
--end;

--Proc УстановитьСтильСсылокR1C1(objApp:AutoObject; Разрешить:Logical);
-- objApp.ReferenceStyle = if(Разрешить, РАБ.EXCEL.xlR1C1, РАБ.EXCEL.xlA1);
--end;

--Proc ЗаписатьЯчейкуИтогоКолонки(objApp:AutoObject; objSheet:AutoObject; XX:Integer; YY:Integer; R1:Integer; RN:Integer; flgRusExcel:Logical; flgUseR1C1:Logical);
---- * ЗАПИСАТЬ В ЯЧЕЙКУ СУММУ ИТОГО ПО КОЛОНКЕ (аналог автосуммирования Excel)*
---- objApp   - ссылка на экземпляр EXCEL'а
---- objSheet - ссылка на лист
---- XX, YY   - координаты ячейки листа objSheet куда записываем итог
---- R1       - количество ячеек до первой    ячейки диапазона суммирования
---- RN       - количество ячеек до последней ячейки диапазона суммирования
--var xlsRange :AutoObject;
-- if R1>=RN:
--   if not flgUseR1C1: РАБ.EXCEL.УстановитьСтильСсылокR1C1(objApp, True); fi;
--   xlsRange=AsAutoObject(objSheet.Cells[XX,YY]);
--   Try
--     if flgRusExcel:
--       xlsRange.FormulaR1C1Local = '=СУММ(R[-'+Str(R1)+']C:R[-'+Str(RN)+']C)';
--     else
--       xlsRange.FormulaR1C1      =  '=SUM(R[-'+Str(R1)+']C:R[-'+Str(RN)+']C)';
--     fi;
--   Finally
--     ClearVariable(xlsRange);
--   end;
--   if not flgUseR1C1: РАБ.EXCEL.УстановитьСтильСсылокR1C1(objApp, False); fi;
-- fi;
--end;

--Proc ЗаписатьЯчейкуТекст(objSheet:AutoObject; X:Integer; Y:Integer; tbValue:String);
---- * ЗАПИСАТЬ ТЕКСТ В ЯЧЕЙКУ *
---- objSheet      - ссылка на лист
---- X, Y          - координаты ячейки листа objSheet
---- tbValue       - текст для записи
--var xlsRange :AutoObject;
-- xlsRange=AsAutoObject(objSheet.Cells[X,Y]);
-- Try
--   xlsRange.NumberFormat = "@";
--   xlsRange.Value2 = tbValue;
-- Finally
--   ClearVariable(xlsRange);
-- end;
--end;

--Proc ЗаписатьЯчейкуДату(objSheet:AutoObject; X:Integer; Y:Integer; flgRusExcel:Logical; tbDate:Date; ПустаяДата:Logical);
---- * ЗАПИСАТЬ ДАТУ В ОБЫЧНОМ ФОРМАТЕ - ДД ММ ГГГГ *
---- objSheet      - ссылка на лист
---- X, Y          - координаты ячейки листа objSheet
---- tbDate        - дата
--var xlsRange :AutoObject;
----ДД.ММ.ГГГГ;@
----dd/mm/yyyy;@
-- xlsRange=AsAutoObject(objSheet.Cells[X,Y]);
-- Try
--   if flgRusExcel:
--     xlsRange.NumberFormatLocal = 'ДД.ММ.ГГГГ';
--   else
--     xlsRange.NumberFormat      = 'DD/MM/YYYY';
--   fi;
--   if not ПустаяДата: xlsRange.Value2 = tbDate; fi;
-- Finally
--   ClearVariable(xlsRange);
-- end;
--end;

--Proc ЗаписатьЯчейкуДатуКавычки(objSheet:AutoObject; X:Integer; Y:Integer; flgRusExcel:Logical; tbDate:Date; ПустаяДата:Logical);
---- * ЗАПИСАТЬ ДАТУ В ФОРМАТЕ - "ДД" ММММ ГГГГ г. *
---- objSheet      - ссылка на лист
---- X, Y          - координаты ячейки листа objSheet
---- tbDate        - дата
--var xlsRange :AutoObject;
-- -- Selection.NumberFormat = "[$-FC19]\""dd\"" mmmm yyyy ""г."""
-- -- [$-FC19]\"ДД\" ММММ ГГГГ "г."
-- xlsRange=AsAutoObject(objSheet.Cells[X,Y]);
-- Try
--   if flgRusExcel:
--     xlsRange.NumberFormatLocal = '[$-FC19]\'+'"'+'ДД\'+'"'+' ММММ ГГГГ '+'"'+'г.'+'"';
--   else
--     xlsRange.NumberFormat      = '[$-FC19]\'+'"'+'DD\'+'"'+' MMMM YYYY '+'"'+'г.'+'"';
--   fi;
--   if not ПустаяДата: xlsRange.Value2 = tbDate; fi;
-- Finally
--   ClearVariable(xlsRange);
-- end;
--end;

--Proc ЗаписатьЯчейкуДатуМесяцГод(objSheet:AutoObject; X:Integer; Y:Integer; flgRusExcel:Logical; tbDate:Date; ПустаяДата:Logical);
---- * ЗАПИСАТЬ ДАТУ В ФОРМАТЕ - за ММММ ГГГГ г. *
---- objSheet      - ссылка на лист
---- X, Y          - координаты ячейки листа objSheet
---- tbDate        - дата
--var xlsRange :AutoObject;
-- -- [$-F419] за ММММ ГГГГ \г\.;@
-- xlsRange=AsAutoObject(objSheet.Cells[X,Y]);
-- Try
--   if flgRusExcel:
--     xlsRange.NumberFormatLocal = '[$-F419] за ММММ ГГГГ \г\.;@';
--   else
--     xlsRange.NumberFormat      = '[$-F419] за MMMM YYYY \г\.;@';
--   fi;
--   if not ПустаяДата: xlsRange.Value2 = tbDate; fi;
-- Finally
--   ClearVariable(xlsRange);
-- end;
--end;


----Proc УстановитьГраницу(objRange:AutoObject; типГраницы:Integer; lineСтиль:Integer; lineТолщина:Integer);
------ * УСТАНОВИТЬ ЭЛЕМЕНТ ГРАНИЦЫ В ОДНОЙ КОНКРЕТНОЙ ЯЧЕЙКЕ *
------ основная вспомогательная процедура для установки конкретного элемента границы (верхнего, левого, и т.д.)
------ самостоятельно использовать можно, но не рекомендуется
------ objRange      - ссылка на ячейку
------ типГраницы    - элемент границы (граница верхняя, левая, и т.д.) (константа EXCEL)
------ lineСтиль     - стиль изображения границы (константа EXCEL)
------ lineТолщина   - толщина границы (константа EXCEL)
----var xlsBorder :AutoObject;
---- xlsBorder=AsAutoObject(objRange.Borders[типГраницы]);
---- Try
----   xlsBorder.LineStyle = lineСтиль;
----   xlsBorder.Weight    = lineТолщина;
---- Finally
----   ClearVariable(xlsBorder);
---- end;
----end;



КОНЕЦ -- конец бланка