FreePascal и OpenOffice

Библиотеки для работы с офисными пакетами (OpenOffice, MS Office и т.п.)

Модератор: Модераторы

Re: FreePascal и OpenOffice

Сообщение Nadin » 03.08.2009 10:50:54

В своей программе заполняю файл-скрипт spis.vbs для вывода в Open Calc. После закрываю его и вызываю поток, чтобы выполнить его из командной строки:
Process1.Create(nil);
Process1.CommandLine:='spis.vbs';
Process1.Options := Process1.Options + [poWaitOnExit];
Process1.Execute;
Process1.Free;
Из командной строки Windows файл прекрасно запускается и выполняет все требуемые действия. А вот из Лазаруса выдаёт ошибку:
Failed to execute spis.vbs : 193 и не выполняет скрипт.
Lazarus v.0.9.27
fpc 2.3.1

Может где-то нужно расширение прописать, чтоб файл выполнялся?
Nadin
новенький
 
Сообщения: 10
Зарегистрирован: 22.07.2009 11:58:59
Откуда: Красноярск

Re: FreePascal и OpenOffice

Сообщение скалогрыз » 03.08.2009 11:14:46

Process можно использовать для запуска исполняемых файлов. ".exe"

В данном случае файл не исполняемый а скриптовый. Чтобы система сама распознала как нужно запускать скриптовый файл, под винду следует использовать функцию ShellExecute (модуль Windows)

http://wiki.lazarus.freepascal.org/Exec ... rograms/ru

либо через командную строку (ыыы в которой всё работает):
Код: Выделить всё
  Process1.Create(nil);
  Process1.CommandLine:='cmd spis.vbs';
  Process1.Options := Process1.Options + [poWaitOnExit];
  Process1.Execute;
  Process1.Free;
скалогрыз
долгожитель
 
Сообщения: 1803
Зарегистрирован: 03.09.2008 02:36:48

Re: FreePascal и OpenOffice

Сообщение Nadin » 03.08.2009 11:43:10

Спасибо огромное! А то я уже мозг сломала! :) Так и думала, что какой-то малости не хватает.
Nadin
новенький
 
Сообщения: 10
Зарегистрирован: 22.07.2009 11:58:59
Откуда: Красноярск

Re: FreePascal и OpenOffice

Сообщение Nashev » 03.08.2009 12:14:52

Тема "Delphi & OpenOffice - Заполним пробел" на форуме SQL.ru - там один человек АКА Yuric74 разобрался с документацией и сделал на удивление удобный комплект классов-обёрток над OLE для управления OpenOffice из Delphi. Кроме того, там периодически задаются вопросы и даются ответы по различным аспектам этакой связки. Очень рекомендую.
Аватара пользователя
Nashev
новенький
 
Сообщения: 13
Зарегистрирован: 23.05.2008 21:57:28

Re: FreePascal и OpenOffice

Сообщение Nadin » 03.08.2009 12:33:31

Код: Выделить всё
  Process1.CommandLine:='cmd spis.vbs';

Такая команда запускает только саму командную строку и ждёт ввода. Как передать туда программно имя скрипта?
Nadin
новенький
 
Сообщения: 10
Зарегистрирован: 22.07.2009 11:58:59
Откуда: Красноярск

Re: FreePascal и OpenOffice

Сообщение скалогрыз » 03.08.2009 13:33:19

Nadin писал(а):
Код: Выделить всё
  Process1.CommandLine:='cmd spis.vbs';

Такая команда запускает только саму командную строку и ждёт ввода. Как передать туда программно имя скрипта?


очень грустно, что cmd не воспринимает параметры командной строки.
тогда забей на использование process. делай так:

Код: Выделить всё
  if ShellExecute(0, 'open', 'spis.vbs', nil, SW_SHOW) <= 32 then begin
    // не смог запустить скрипт :(
  end;

напомню, что ShellExecute описан в модуле Windows, так что добавь Windows в uses секцию.
скалогрыз
долгожитель
 
Сообщения: 1803
Зарегистрирован: 03.09.2008 02:36:48

Re: FreePascal и OpenOffice

Сообщение alexs » 03.08.2009 19:47:11

скалогрыз писал(а):очень грустно, что cmd не воспринимает параметры командной строки.

Насколько мне память не изменяет - надо так:
Код: Выделить всё
cmd /c bla-bla-bla
Аватара пользователя
alexs
долгожитель
 
Сообщения: 4060
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь

Re: FreePascal и OpenOffice

Сообщение Padre_Mortius » 03.08.2009 21:40:28

VB-скрипты выполняются при помощи
Код: Выделить всё
cscript.exe spis.vbs
Padre_Mortius
энтузиаст
 
Сообщения: 1265
Зарегистрирован: 29.05.2007 17:38:07
Откуда: Спб

Re: FreePascal и OpenOffice

Сообщение Andrew » 04.08.2009 06:10:29

Nashev писал(а):Тема "Delphi & OpenOffice - Заполним пробел" на форуме SQL.ru - там один человек АКА Yuric74 разобрался с документацией и сделал на удивление удобный комплект классов-обёрток над OLE для управления OpenOffice из Delphi. Кроме того, там периодически задаются вопросы и даются ответы по различным аспектам этакой связки. Очень рекомендую.

Да неплохой модуль, я на его основе сделал небольшую dll (по типу word dll) и использую в лазаре, эх под линукс бы её откомпилить
Andrew
новенький
 
Сообщения: 14
Зарегистрирован: 15.01.2008 23:21:26

Re: FreePascal и OpenOffice

Сообщение Nadin » 04.08.2009 13:00:40

Спасибо, alexs и Padre_Mortius! И так, и так работает! Я ведь скрипты и Process выбрала из-за мультиплатформенности. Не очень-то хочется потом для Linux изобретать "велосипед" заново. Так-то, конечно, проще через OLE обращаться.
Ссылка "Delphi & OpenOffice - Заполним пробел" тоже полезная в плане работы с объектами OO. Я привыкла к ОО обращаться из Basica, так что скрипты делать проще и быстрее.
Nadin
новенький
 
Сообщения: 10
Зарегистрирован: 22.07.2009 11:58:59
Откуда: Красноярск

Re: FreePascal и OpenOffice

Сообщение скалогрыз » 04.08.2009 13:16:24

Nadin писал(а):Я ведь скрипты и Process выбрала из-за мультиплатформенности. Не очень-то хочется потом для Linux изобретать "велосипед" заново

O.o
у мну тогда два вопроса:
1) какая программа по-умолчанию исполняет в Linux-е VBS скрипты.
2) есть ли программа в OpenOffice (причём во всех его версиях), которая может исполнять VBS скрипты?
скалогрыз
долгожитель
 
Сообщения: 1803
Зарегистрирован: 03.09.2008 02:36:48

Re: FreePascal и OpenOffice

Сообщение Nadin » 11.08.2009 18:57:32

скалогрыз писал(а):O.o
у мну тогда два вопроса:
1) какая программа по-умолчанию исполняет в Linux-е VBS скрипты.
2) есть ли программа в OpenOffice (причём во всех его версиях), которая может исполнять VBS скрипты?


Я переделала алгоритм работы с ОО. VBS скрипты - это то же OLE и в Linux-е работать не будут. Поэтому я пишу в текстовый файл, а потом запускаю из командной строки шаблон ОО Calc, в котором подключенный к нему макрос при создании документа заполняет шаблон данными из текстового файла.
В Linux-е есть команда fpexec, которая тоже запускает командную строку. А макросы ОО Calc там тоже должны работать.
Nadin
новенький
 
Сообщения: 10
Зарегистрирован: 22.07.2009 11:58:59
Откуда: Красноярск

Re: FreePascal и OpenOffice

Сообщение dunin » 06.02.2010 22:09:08

Nashev писал(а):Тема "Delphi & OpenOffice - Заполним пробел" на форуме SQL.ru - там один человек АКА Yuric74 разобрался с документацией и сделал на удивление удобный комплект классов-обёрток над OLE для управления OpenOffice из Delphi. Кроме того, там периодически задаются вопросы и даются ответы по различным аспектам этакой связки. Очень рекомендую.

Кто-нибудь может этот юнит под Lazarus портрировать?
Аватара пользователя
dunin
энтузиаст
 
Сообщения: 634
Зарегистрирован: 02.05.2007 13:18:11
Откуда: Тољя††и

Re: FreePascal и OpenOffice

Сообщение WindOfPain » 07.02.2010 12:50:21

если кому будет интересно:

http://ifolder.ru/16292010

По работе в свое время писал модуль для Delphi 7 для построения отчетов в Open Office Calc. Вчера, ради интереса, подправил модуль для работы в Lazarus. Конечно, не идеал, но идеологию "допилить напильником" ни кто не отменял)) Модуль использует OLE. Формат файлов xls и xlt(так как нужна была полная совместимость с MS Excel). Прилагается, маленький пример. Ну, и местами, есть комментарии.
Заставил методом "научного тыка" работать колонтитулы:
Код: Выделить всё
    procedure SetLeftColontitul(top:boolean;s:widestring);
    procedure SetRightColontitul(top:boolean;s:widestring);
    procedure SetCenterColontitul(top:boolean;s:widestring);


Код: Выделить всё

procedure TOpenCalc.SetCenterColontitul(top: boolean; s: UTF8String);
var
   oStyleFamilies,oPageFamilies,sPageStyle,oPageStyle,oHeaderLeft,
   oHeaderText:variant;
   d:unicodestring;
begin
     oStyleFamilies:=document.getStyleFamilies;
     oPageFamilies:=oStyleFamilies.getByName('PageStyles');
     sPageStyle:=Sheet.PageStyle;
     oPageStyle:=oPageFamilies.getByName(sPageStyle);
     oPageStyle.HeaderOn:=true;
     oPageStyle.HeaderIsShared:=true;
     case top of
     true:oHeaderLeft:=oPageStyle.RightPageHeaderContent;
     false:oHeaderLeft:=oPageStyle.RightPageFooterContent;
     end;
     oHeaderText:=oHeaderLeft.getCenterText;
     d:=utf8decode(s);
     oHeaderText.SetString(variant(d));
     case top of
     true:oPageStyle.RightPageHeaderContent:=oHeaderLeft;
     false:oPageStyle.RightPageFooterContent:=oHeaderLeft;
     end;
     oStyleFamilies:=Unassigned;
     oPageFamilies:=Unassigned;
     sPageStyle:=Unassigned;
     oPageStyle:=Unassigned;
     oHeaderLeft:=Unassigned;
     oHeaderText:=Unassigned;
end;

procedure TOpenCalc.SetLeftColontitul(top: boolean; s: utf8string);
var
   oStyleFamilies,oPageFamilies,sPageStyle,oPageStyle,oHeaderLeft,
   oHeaderText:variant;
   d:unicodestring;
begin
     oStyleFamilies:=document.getStyleFamilies;
     oPageFamilies:=oStyleFamilies.getByName('PageStyles');
     sPageStyle:=Sheet.PageStyle;
     oPageStyle:=oPageFamilies.getByName(sPageStyle);
     oPageStyle.HeaderOn:=true;
     oPageStyle.HeaderIsShared:=true;
     case top of
     true:oHeaderLeft:=oPageStyle.RightPageHeaderContent;
     false:oHeaderLeft:=oPageStyle.RightPageFooterContent;
     end;
     oHeaderText:=oHeaderLeft.getLeftText;
     d:=utf8decode(s);
     oHeaderText.SetString(variant(d));
     case top of
     true:oPageStyle.RightPageHeaderContent:=oHeaderLeft;
     false:oPageStyle.RightPageFooterContent:=oHeaderLeft;
     end;
     oStyleFamilies:=Unassigned;
     oPageFamilies:=Unassigned;
     sPageStyle:=Unassigned;
     oPageStyle:=Unassigned;
     oHeaderLeft:=Unassigned;
     oHeaderText:=Unassigned;
end;

procedure TOpenCalc.SetRightColontitul(top: boolean; s: utf8string);
var
   oStyleFamilies,oPageFamilies,sPageStyle,oPageStyle,oHeaderLeft,
   oHeaderText:variant;
   d:unicodestring;
begin
     oStyleFamilies:=document.getStyleFamilies;
     oPageFamilies:=oStyleFamilies.getByName('PageStyles');
     sPageStyle:=Sheet.PageStyle;
     oPageStyle:=oPageFamilies.getByName(sPageStyle);
     oPageStyle.HeaderOn:=true;
     oPageStyle.HeaderIsShared:=true;
     case top of
     true:oHeaderLeft:=oPageStyle.RightPageHeaderContent;
     false:oHeaderLeft:=oPageStyle.RightPageFooterContent;
     end;
     oHeaderText:=oHeaderLeft.getRightText;
     d:=utf8decode(s);
     oHeaderText.SetString(variant(d));
     case top of
     true:oPageStyle.RightPageHeaderContent:=oHeaderLeft;
     false:oPageStyle.RightPageFooterContent:=oHeaderLeft;
     end;
     oStyleFamilies:=Unassigned;
     oPageFamilies:=Unassigned;
     sPageStyle:=Unassigned;
     oPageStyle:=Unassigned;
     oHeaderLeft:=Unassigned;
     oHeaderText:=Unassigned;
end;



Вообщем, если будет интересно и возникнут вопросы - спрашивайте.
Аватара пользователя
WindOfPain
новенький
 
Сообщения: 33
Зарегистрирован: 01.09.2009 21:18:23
Откуда: Санкт-Петербург

Пред.

Вернуться в Office Lib

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1

Рейтинг@Mail.ru