Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2015.10.25;
Скачать: [xml.tar.bz2];

Вниз

Импорт таблицы OpenOffice в StringGrid   Найти похожие ветки 

 
Кирилов М.Л.   (2014-05-27 12:15) [0]

Здравствуйте! Гуглю, гуглю все бестолку.. Не могу найти нигде простого примера кода по сабжу. Помогите пожалуйста...


 
junglecat   (2014-05-27 12:25) [1]

http://yuri.elmeh.ru/


 
MBo ©   (2014-05-27 12:26) [2]

Подозреваю, что OpenOffice предоставляет средства автоматизации. Вот их и надо использовать.


 
sniknik ©   (2014-05-27 12:32) [3]

> Подозреваю, что OpenOffice предоставляет средства автоматизации.
блин а я в этом просто уверен... ;)

+
в OO есть такая же запись макросов как в ms office, а вот в libre office не нашел... не удобен для работы.


 
Кирилов М.Л.   (2014-05-27 12:32) [4]

Модуль скачал. А где можно посмотреть примеры работы с ним?


 
sniknik ©   (2014-05-27 14:37) [5]

> Модуль скачал. А где можно посмотреть примеры работы с ним?
запусти.


 
Кирилов М.Л.   (2014-05-27 15:18) [6]

Запустил,посмотрел,импорта там нет :(


 
sniknik ©   (2014-05-27 15:34) [7]

чем чтение отличается от записи?


 
Кирилов М.Л.   (2014-05-28 18:34) [8]

Пробую импортировать так:
var
 Doc : Variant;
 Desktop: Variant;
 Sheet, Cell: Variant;
 vArr : Variant;
 FileName : string;
 a,i:Longint;
begin
 OO := CreateOleObject("com.sun.star.ServiceManager");
 Desktop := OO.createInstance("com.sun.star.frame.Desktop");
 vArr := VarArrayCreate([0, 1], varVariant);
 vArr[0] := MakePropertyValue("FilterName", "MS Excel 97");
 Doc := Desktop.LoadComponentFromURL("file:///" + OpenDialog1.FileName, "_blank", 0, vArr);
 Sheet := Doc.getSheets.GetByIndex(0);
for i:=0 to StringGrid1.RowCount do
  begin
  for a:=0 to 17 do
      begin
      Cell := Sheet.getCellByPosition(a, i);
      StringGrid1.Cells[a,i]:=Cell.Value;
      end;
  end;
end;
Получаю ошибку: http://i62.fastpic.ru/big/2014/0528/b1/c21bf704ea388d2cc457c3af81cdedb1.jpg
В чем может быть проблема?


 
junglecat   (2014-05-28 18:55) [9]

в том, что какая-то из вариантных переменных не является ссылкой на объект.
В отладчике надо смотреть


 
Кирилов М.Л.   (2014-05-28 19:01) [10]

Нет ни у кого рабочего примера чтения данных из таблицы Calc? Погуглив как ни странно не нашел :(


 
junglecat   (2014-05-28 19:03) [11]

> [10] Кирилов М.Л.   (28.05.14 19:01)

сделай доброе дело, преврати свой пример в рабочий и выложи, чтобы можно было нагуглить. Кто-то ведь должен быть первым


 
Кирилов М.Л.   (2014-05-28 19:34) [12]

Смешно... :)


 
sniknik ©   (2014-05-29 11:03) [13]

> В чем может быть проблема?
подозреваю в чем то тайном... например в MakePropertyValue.


 
junglecat   (2014-05-29 11:21) [14]

а также в том, что vArr создается из двух элементов, а устанавливается только 1-й


 
sniknik ©   (2014-05-29 11:28) [15]

http://openoffice.org.sourcearchive.com/documentation/1.1.3/classole__adapter_1_1UnoConversionUtilities_b0f0e1bd259fb6c44fa9c032880d53ed.htm l

   if (pVar->vt != VT_UNKNOWN && pVar->vt != VT_DISPATCH)
       throw IllegalArgumentException(
           OUSTR("[automation bridge]UnoConversionUtilities<T>::createOleObjectWrapper \n"
                 "The VARIANT does not contain an object type! "), 0, -1);

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


 
sniknik ©   (2014-05-29 11:30) [16]

> что vArr создается из двух элементов, а устанавливается только 1-й
пофиг, имхо, "пустышка" будет - UNKNOWN. пропустит.


 
sniknik ©   (2014-05-29 12:39) [17]

+
сайт таки продолжает "рвать" длинные ссылки. в данной мной ([15]) буковка l расширения .html оторвалась.


 
Кирилов М.Л.   (2014-05-29 15:47) [18]

function MakePropertyValue(PropName, PropValue:string):variant;
var Struct: variant;
begin
   Struct := OO.Bridge_GetStruct("com.sun.star.beans.PropertyValue");
   Struct.Name := PropName;
   Struct.Value := PropValue;
   Result := Struct;
end;


 
sniknik ©   (2014-05-29 16:20) [19]

[8] + [18] работает, ошибок типа вышеуказанной нет (есть с тем, что вместо строк 0 читает).

у тебя вообще OO установлен? полностью/частично?

проверяй возвращаемые объекты на null/unknown, т.к. "добиться" такой же ошибки я например могу "исковеркав" например Desktop:= OO.createInstance("com.sun.star.frame.D1e1s1k1t1op"); запрашиваемый инстанс... но раз у тебя он/другое из запрашиваемых написаны верно, значит не установлены (или установлен "форк" не имеющий таких имен).


 
sniknik ©   (2014-05-29 16:39) [20]

> т.к. "добиться" такой же ошибки
добился еще одним способом... до этого открывал Excel-евские файлы, а попробовал создать "чистый" опенофисный ".ods" и при его открытии и получил... именно на параметрах, хотя -
> можно было бы, для начала, не пихать ничего, просто пустой массив.

убери вот эту строчку нафиг
vArr[0] := MakePropertyValue("FilterName", "MS Excel 97");
закоментарь, удали, как хочешь, не поддерживается в OO формате екселевские фильтры похоже.


 
Кирилов М.Л.   (2014-05-30 18:40) [21]

Скрин меню "Пуск": http://i62.fastpic.ru/big/2014/0530/e7/d135f4c70864ffd8dc407361e13075e7.jpg
Убрал vArr[0] :=.... ошибка та же :(


 
Кирилов М.Л.   (2014-05-30 18:41) [22]

>sniknik © "Форк" это что...?


 
Кирилов М.Л.   (2014-05-30 18:44) [23]

Экспорт пашет без проблем с таким заголовком(всю процедуру не привожу):
 OO := CreateOleObject("com.sun.star.ServiceManager");
 Desktop := OO.createInstance("com.sun.star.frame.Desktop");
 Doc := Desktop.LoadComponentFromURL("private:factory/scalc", "_blank", 0,VarArrayCreate([0, -1], varVariant));
Импорт нивкакую... :(


 
sniknik ©   (2014-05-30 21:54) [24]

> Скрин меню "Пуск":
программа состоит из кучи объектов, то что есть заголовок не означает что при установке не сняли галочку с чего то нужного.

> "Форк" это что...?
не важно. термин линукс.

> Импорт нивкакую... :(
> проверяй возвращаемые объекты на null/unknown

> всю процедуру не привожу
и все таки приведи всю, с указанием на какой строке ошибка, и зхорошо бы значения(прям как в отладчике адрес показывает/пишет) возвращенное функциями до этого. с термином "трассировка" знаком?


 
Кирилов М.Л.   (2014-05-30 23:09) [25]

Процедура экспорта рабочая, потому и приводить полностью нет смысла. Пробовал подменить заголовок на рабочий, ошибка пропадает но в гриде цифровой бред(в основном ноли) и опен офис открывается с тем же :( если можно, подробней чего где проверять? Спасибо! Неужели нет  линков с примерами как данные с Calc прочесть?


 
sniknik ©   (2014-05-31 17:20) [26]

эээ
> и все таки приведи всю, с указанием на какой строке ошибка
кто просил рабочую?

> Пробовал подменить заголовок на рабочий
какой заголовок? ты вообще о чем?

> цифровой бред(в основном ноли)
[19]
> [8] + [18] работает, ошибок типа вышеуказанной нет (есть с тем, что вместо строк 0 читает).
похеже на проблему вариантов, вернее типов которые в них возвращает объект не поддерживаются старыми(?) дельфями.

> и опен офис открывается с тем же :(
???
раз ОО открывает с нолями, значит они там и есть. поменяй файл.

> Неужели нет  линков с примерами как данные с Calc прочесть?
ну как же нет, есть дока (ссылка в [15]), есть примеры становящиеся с пакетом разработчика, есть гугл в конце концов.


 
Кирилов М.Л.   (2014-05-31 18:18) [27]

Довел до рабочего состояния:

function ooCreateValue(p : variant; ooName: string; ooData: variant): variant;
 var
   ooReflection: variant;
 begin
   ooReflection:= p.createInstance("com.sun.star.reflection.CoreReflection");
   ooReflection.forName("com.sun.star.beans.PropertyValue").createObject(result);
   result.Name := ooName;
   result.Value:= ooData;
 end;

procedure OdsToStringGrid;
var
 Document : Variant;
 oo,Desktop: Variant;
 Sheet,ooParams, Cell: Variant;
 a,i:Longint;
 label 1;
begin
 oo := CreateOleObject("com.sun.star.ServiceManager");
   ooParams:= VarArrayCreate([0, 0], varVariant);
   ooParams[0]:= ooCreateValue(oo, "Hidden", true);
   desktop := oo.createInstance("com.sun.star.frame.Desktop");
   document := desktop.LoadComponentFromURL("file:///" + Form1.OpenDialog1.FileName, "_blank", 0, ooParams);
Sheet := Document.getSheets.GetByIndex(0);
for i:=0 to Form1.StringGrid1.RowCount do
  begin
  for a:=0 to 17 do
      begin
      Cell := Sheet.getCellByPosition(a, i);
      Form1.StringGrid1.Cells[a,i]:=Cell.String;
      if (a=0) and (Form1.StringGrid1.Cells[a,i]="") then Goto 1;
      end;
  end;
1:OO := Unassigned;
end;
{В таблице Calc 18 колонок}



Страницы: 1 вся ветка

Форум: "Начинающим";
Текущий архив: 2015.10.25;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.51 MB
Время: 0.003 c
1-1333625779
@!!ex
2012-04-05 15:36
2015.10.25
OpenGL + TFrame. Как????


15-1425936604
Юрий
2015-03-10 00:30
2015.10.25
С днем рождения ! 10 марта 2015 вторник


2-1400840818
rumma
2014-05-23 14:26
2015.10.25
mainmenu popup


15-1426491623
patrick1968
2015-03-16 10:40
2015.10.25
Не работает команда


15-1426109401
Юрий
2015-03-12 00:30
2015.10.25
С днем рождения ! 12 марта 2015 четверг





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский