Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2015.10.25;
Скачать: CL | DM;

Вниз

Импорт таблицы 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;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.006 c
2-1401097358
MisterX
2014-05-26 13:42
2015.10.25
Картинки в таблицу Word


3-1305619583
Aybolit
2011-05-17 12:06
2015.10.25
SQL в BDE


15-1426247573
megavoid
2015-03-13 14:52
2015.10.25
Intel hd4000 не пашет hdmi, хелп! :)


11-1260545241
tippa
2009-12-11 18:27
2015.10.25
побайтно записать файл из массива


15-1425850257
картман
2015-03-09 00:30
2015.10.25
wifi