Приветствую !
Задача такая:
хочу на делфи написать программу, которая бы:
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,
который должен подцепляться к уже открытой книге и вписывать мне нужные данные,
а во вторых, если даже файл закрыт - Программа открывает его с ошибкой - невозможно создать файл блокировки ,
книга открыта только для чтения.
В итоге открывается копия книги, данные конечно пишутся, но предлагается сохранить документ в другое место.
Запуск от имени администратора - не решает эту проблему.
Что хочется получить: написал в начале своего поста.
Посмотри как устроена функция OpenDocument в модуле Misc стандартной библиотеки Tools. Она перебирает все компоненты StarDesktop (все уже открытые в данный момент файлы офиса) и сличает URL компонента с заданным путем-именем файла. Если нашла - возвращает именно этот документ с примечанием "был открыт", иначе пытается открыть файл с диска и возвращает его. В принципе, можешь продублировать этот код на Дельфи, а можешь поискать способ вызвать эту функцию из своей программы.
Посмотрел черновик. Я сейчас дам ссылку (http://berma.pagesperso-orange.fr/index2.html), сходи посмотри - жизнь станет легче (тебе нужна вторая строка в таблице)
Твои ошибки связаны, скорее всего, с неправильной работой ExtractFilePath. Но без полного кода трудно судить
Цитата: JohnSUN от 12 декабря 2018, 14:34
Твои ошибки связаны, скорее всего, с неправильной работой ExtractFilePath. Но без полного кода трудно судить
Едрит мадрит!!
действительно...ExtractFilePath не туда куда надо слэши в пути наклоняет...
благодарю! )))
теперь оба варианта работают!
Цитата: kolob204 от 12 декабря 2018, 14:12Возможно нужно знать верный FilterName. а я его не знаю...гуглил...не нашёл
Попробуйте "calc8". А вообще непонятно, зачем фиксировать фильтр.
Цитата: mikekaganski от 12 декабря 2018, 15:10calc8
Благодарю, Михаил.
Да, что то упёрся я в эту фиксацию, действительно незачем.
Добавлю, может кому то пригодится. для сохранения информации в файл ODS нужно использовать метод StoreAsURL, а не StoreToURL.
Цитата: kolob204 от 12 декабря 2018, 15:52
нужно использовать метод StoreAsURL, а не StoreToURL.
Как использовать? Пример кода приведите, пожалуйста.
Цитата: 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;
Судя по твоему способу создания URL файла, по ссылке ты так и не ходил. Зря.
Там есть готовая функция convertToURL(). И CreateProperties() тоже есть.
Другими словами, ты просто мог бы не мучатся со всеми этими VarArrayCreate и StringReplace, а сразу одной строкой написать
Document := Desktop.LoadComponentFromURL(convertToURL(ExtractFilePath(Application.ExeName) + Edit4.Text),
'_default', 0, CreateProperties(['Hidden', True]);
Цитата: JohnSUN от 12 декабря 2018, 19:53
Судя по твоему способу создания URL файла, по ссылке ты так и не ходил. Зря.
Там есть готовая функция convertToURL(). И CreateProperties() тоже есть.
Другими словами, ты просто мог бы не мучатся со всеми этими VarArrayCreate и StringReplace, а сразу одной строкой написать
Document := Desktop.LoadComponentFromURL(convertToURL(ExtractFilePath(Application.ExeName) + Edit4.Text),
'_default', 0, CreateProperties(['Hidden', True]);
Ходил по ссылке, скачал архив, но тараканы в моей голове вдруг меня увели в сторону....и я не успел посмотреть там исходники.
они у меня вообще "такие ветренные" ))))))
то одна "гениальная" идея, то другая))))
"ЗБасиба", Владислав :-) буду знать... вообще с систематизацией знаний у многих конечно проблема, в основном тяп ляп, в спешке делается...
Знаю даже некоторых высокооплачеваемых программеров, которые признавались мне в своём разгильдяйстве в программировании,
объясняя это ленью глубоко погружаться в систематизацию и чёткое понимание всех ньюансов. стресс, всё такое :-)