Форум поддержки пользователей. LibreOffice, Apache OpenOffice, OpenOffice.org

Форум поддержки пользователей. LibreOffice, Apache OpenOffice, OpenOffice.org

23 Январь 2019, 04:24 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
Новости: Здесь можно поблагодарить участников форума Улыбка
 
   Начало   Помощь Поиск Войти Регистрация    задать вопрос  
Страниц: 1   Вниз
  Печать  
Автор Тема: Delphi и OpenOffice  (Прочитано 423 раз)
0 Пользователей и 1 Гость смотрят эту тему.
kolob204
Участник
**
Offline Offline

Сообщений: 19


« Стартовое сообщение: 12 Декабрь 2018, 14:12 »

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

Задача такая:
хочу на делфи написать программу, которая бы:
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
Капитана в тот день называли на "ты"
Гуру
*******
Offline Offline

Пол: Мужской
Расположение: Киев
Сообщений: 2 672


Помогаю людям и компьютерам понимать друг друга


WWW
« Ответ #1: 12 Декабрь 2018, 14:34 »

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

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

Твои ошибки связаны, скорее всего, с неправильной работой ExtractFilePath. Но без полного кода трудно судить
Записан

Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне
kolob204
Участник
**
Offline Offline

Сообщений: 19


« Ответ #2: 12 Декабрь 2018, 15:01 »

Твои ошибки связаны, скорее всего, с неправильной работой ExtractFilePath. Но без полного кода трудно судить

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

Пол: Мужской
Расположение: Хабаровск -> Москва
Сообщений: 1 209


« Ответ #3: 12 Декабрь 2018, 15:10 »

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

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

С уважением,
Михаил Каганский
kolob204
Участник
**
Offline Offline

Сообщений: 19


« Ответ #4: 12 Декабрь 2018, 15:26 »

calc8

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

Сообщений: 19


« Ответ #5: 12 Декабрь 2018, 15:52 »

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

Сообщений: 401


« Ответ #6: 12 Декабрь 2018, 18:18 »

нужно использовать метод StoreAsURL, а не StoreToURL.
Как использовать? Пример кода приведите, пожалуйста.
Записан
kolob204
Участник
**
Offline Offline

Сообщений: 19


« Ответ #7: 12 Декабрь 2018, 19:21 »

нужно использовать метод 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
Капитана в тот день называли на "ты"
Гуру
*******
Offline Offline

Пол: Мужской
Расположение: Киев
Сообщений: 2 672


Помогаю людям и компьютерам понимать друг друга


WWW
« Ответ #8: 12 Декабрь 2018, 19:53 »

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

Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне
kolob204
Участник
**
Offline Offline

Сообщений: 19


« Ответ #9: 13 Декабрь 2018, 09:08 »

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

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

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

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

Powered by MySQL Powered by PHP Powered by SMF 1.1.21 | SMF © 2006-2009, Simple Machines Valid XHTML 1.0! Valid CSS!