Delphi и OpenOffice

Автор kolob204, 12 декабря 2018, 14:12

0 Пользователи и 1 гость просматривают эту тему.

kolob204

Приветствую !

Задача такая:
хочу на делфи написать программу, которая бы:
1. либо записывала данные в файл *.ods  не открывая его визуально
2. либо записывала данные в уже открытый ячейки файла ODS (не пытаясь открыть его заново).

вот черновик кода

OO := CreateOleObject('com.sun.star.ServiceManager');
  Desktop := OO.createInstance('com.sun.star.frame.Desktop');
  FileName := ExtractFilePath(Application.ExeName) + Edit4.Text;


// FileName := Edit4.Text;

  vArr := VarArrayCreate([0, 1], varVariant);

  //'Text - txt - csv (StarCalc)'    'MS Excel 97'     "writer_pdf_Export"
  vArr[0] := MakePropertyValue('FilterName', 'MS Excel 97');

  //сделать так, чтобы при записи не открывалось окно ЛИСТА
// vArr[1] := MakePropertyValue('Hidden', True);


// target =  '_blank' ,
//"_default" special UI functionality
//(e.g. detecting of already loaded documents, using of empty frames of creating of new top frames as fallback)
//"_self", ""(!) means frame himself
//"_parent" address direct parent of frame
//"_top" indicates top frame of current path in tree
//"_beamer" means special sub frame

   Document := Desktop.LoadComponentFromURL('file:///'+FileName, '_default', 0, vArr);

  Sheet := Document.getSheets.getByIndex(0);
  Cell := Sheet.getCellByPosition(1, 1); // 5 столбец 2 строка
  Cell.SetString(Edit1.Text);

  //сохранение
  Document.StoreToURL('file:///'+FileName, vArr);



1. Проблема №1 - файлы формата ODS программа не принимает, подавай ей XLS. (а я так не могу,  в XLS макросы не

сохраняются :-)  )
    Возможно нужно знать верный FilterName. а я его не знаю...гуглил...не нашёл

2. Если я использую опцию vArr[1] := MakePropertyValue('Hidden', True); - книга не открывается, как и хотелось, но

ничего не пишется в файл.
и появляется такая ошибка:
Variant does not reference an automation object

Запуск от имени администратора даёт другую ошибку:
Ошибка при выполнении приложения-сервера ProgID
com.sun.star.ServiceManager


3. Если я НЕ использую опцию vArr[1] := MakePropertyValue('Hidden', True); - книга  Открывается,
но во первых не работает ключ '_default' метода Desktop.LoadComponentFromURL,
который должен подцепляться к уже открытой книге и вписывать мне нужные данные,
а во вторых, если даже файл закрыт - Программа открывает его с ошибкой - невозможно создать файл блокировки ,
книга открыта только для чтения.
В итоге открывается копия книги, данные конечно пишутся, но предлагается сохранить документ в другое место.

Запуск от имени администратора - не решает эту проблему.


Что хочется получить: написал в начале своего поста.

JohnSUN

Посмотри как устроена функция OpenDocument в модуле Misc стандартной библиотеки Tools. Она перебирает все компоненты StarDesktop (все уже открытые в данный момент файлы офиса) и сличает URL компонента с заданным путем-именем файла. Если нашла - возвращает именно этот документ с примечанием "был открыт", иначе пытается открыть файл с диска и возвращает его. В принципе, можешь продублировать этот код на Дельфи, а можешь поискать способ вызвать эту функцию из своей программы.

Посмотрел черновик. Я сейчас дам ссылку, сходи посмотри - жизнь станет легче (тебе нужна вторая строка в таблице)

Твои ошибки связаны, скорее всего, с неправильной работой ExtractFilePath. Но без полного кода трудно судить
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне

kolob204

Цитата: JohnSUN от 12 декабря 2018, 14:34
Твои ошибки связаны, скорее всего, с неправильной работой ExtractFilePath. Но без полного кода трудно судить

Едрит мадрит!!
действительно...ExtractFilePath не туда куда надо слэши в пути наклоняет...
благодарю! )))
теперь оба варианта работают!

mikekaganski

Цитата: kolob204 от 12 декабря 2018, 14:12Возможно нужно знать верный FilterName. а я его не знаю...гуглил...не нашёл

Попробуйте "calc8". А вообще непонятно, зачем фиксировать фильтр.
С уважением,
Михаил Каганский

kolob204

Цитата: mikekaganski от 12 декабря 2018, 15:10calc8

Благодарю, Михаил.
Да, что то упёрся я в эту фиксацию, действительно незачем.

kolob204

Добавлю, может кому то пригодится. для сохранения информации в файл ODS нужно использовать метод StoreAsURL, а не StoreToURL.

OOKapitan

Цитата: kolob204 от 12 декабря 2018, 15:52
нужно использовать метод StoreAsURL, а не StoreToURL.
Как использовать? Пример кода приведите, пожалуйста.

kolob204

Цитата: OOKapitan от 12 декабря 2018, 18:18
Цитата: kolob204 от 12 декабря 2018, 15:52
нужно использовать метод StoreAsURL, а не StoreToURL.
Как использовать? Пример кода приведите, пожалуйста.

вот вам вся моя функция.

begin
  OO := CreateOleObject('com.sun.star.ServiceManager');
  Desktop := OO.createInstance('com.sun.star.frame.Desktop');
  FileName := ExtractFilePath(Application.ExeName) + Edit4.Text;
 
  FileName  := StringReplace(FileName, '\', '/',[rfReplaceAll, rfIgnoreCase]);

  vArr := VarArrayCreate([0, 1], varVariant);
   
  //сделать так чтобы при записи не открывалось окно ЛИСТА
  vArr[1] := MakePropertyValue('Hidden', True);

   Document := Desktop.LoadComponentFromURL('file:///'+FileName, '_default', 0, vArr);

  Sheet := Document.getSheets.getByIndex(SpinEdit1.Value);
  Cell := Sheet.getCellByPosition(SpinEdit2.Value, SpinEdit3.Value); //
  Cell.SetString(Edit1.Text);


  Document.StoreAsURL('file:///'+FileName, vArr);     // <<<<<<  ВОТ  <<<<<<

  Document.Close(True);

  Desktop.Terminate;

   Document:=Unassigned;
   Document:=null;
   Desktop:=Unassigned;
   OO:=Unassigned;


JohnSUN

Судя по твоему способу создания URL файла, по ссылке ты так и не ходил. Зря.
Там есть готовая функция convertToURL(). И CreateProperties() тоже есть.
Другими словами, ты просто мог бы не мучатся со всеми этими VarArrayCreate и StringReplace, а сразу одной строкой написать
   Document := Desktop.LoadComponentFromURL(convertToURL(ExtractFilePath(Application.ExeName) + Edit4.Text),
           '_default', 0, CreateProperties(['Hidden', True]);
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне

kolob204

Цитата: JohnSUN от 12 декабря 2018, 19:53
Судя по твоему способу создания URL файла, по ссылке ты так и не ходил. Зря.
Там есть готовая функция convertToURL(). И CreateProperties() тоже есть.
Другими словами, ты просто мог бы не мучатся со всеми этими VarArrayCreate и StringReplace, а сразу одной строкой написать
   Document := Desktop.LoadComponentFromURL(convertToURL(ExtractFilePath(Application.ExeName) + Edit4.Text),
           '_default', 0, CreateProperties(['Hidden', True]);


Ходил по ссылке, скачал архив, но тараканы в моей голове вдруг меня увели в сторону....и я не успел посмотреть там исходники.
они у меня вообще "такие ветренные" ))))))
то одна "гениальная" идея, то другая))))

"ЗБасиба", Владислав :-) буду знать... вообще с систематизацией знаний у многих конечно проблема, в основном тяп ляп, в спешке делается...

Знаю даже некоторых высокооплачеваемых программеров, которые признавались мне в своём разгильдяйстве в программировании,
объясняя это ленью глубоко погружаться в систематизацию и чёткое понимание всех ньюансов.  стресс, всё такое :-)