![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Импорт таблицы OpenOffice в StringGrid
Кирилов М.Л. © (2014-05-27 12:15:00)Здравствуйте! Гуглю, гуглю все бестолку.. Не могу найти нигде простого примера кода по сабжу. Помогите пожалуйста...
Кирилов М.Л. (2014-05-31 18:18:00) [1]Довел до рабочего состояния:
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 колонок}
sniknik (2014-05-31 17:20:00) [2]эээ
> и все таки приведи всю, с указанием на какой строке ошибка
кто просил рабочую?
> Пробовал подменить заголовок на рабочий
какой заголовок? ты вообще о чем?
> цифровой бред(в основном ноли)
[19]
> [8] + [18] работает, ошибок типа вышеуказанной нет (есть с тем, что вместо строк 0 читает).
похеже на проблему вариантов, вернее типов которые в них возвращает объект не поддерживаются старыми(?) дельфями.
> и опен офис открывается с тем же :(
???
раз ОО открывает с нолями, значит они там и есть. поменяй файл.
> Неужели нет линков с примерами как данные с Calc прочесть?
ну как же нет, есть дока (ссылка в [15]), есть примеры становящиеся с пакетом разработчика, есть гугл в конце концов.
Кирилов М.Л. (2014-05-30 23:09:00) [3]Процедура экспорта рабочая, потому и приводить полностью нет смысла. Пробовал подменить заголовок на рабочий, ошибка пропадает но в гриде цифровой бред(в основном ноли) и опен офис открывается с тем же :( если можно, подробней чего где проверять? Спасибо! Неужели нет линков с примерами как данные с Calc прочесть?
sniknik (2014-05-30 21:54:00) [4]> Скрин меню "Пуск":
программа состоит из кучи объектов, то что есть заголовок не означает что при установке не сняли галочку с чего то нужного.
> "Форк" это что...?
не важно. термин линукс.
> Импорт нивкакую... :(
> проверяй возвращаемые объектына null/unknown
> всю процедуру не привожу
и все таки приведи всю, с указанием на какой строке ошибка, и зхорошо бы значения(прям как в отладчике адрес показывает/пишет) возвращенное функциями до этого. с термином "трассировка" знаком?
Кирилов М.Л. (2014-05-30 18:44:00) [5]Экспорт пашет без проблем с таким заголовком(всю процедуру не привожу):
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));
Импорт нивкакую... :(
Кирилов М.Л. (2014-05-30 18:41:00) [6]>sniknik © "Форк" это что...?
Кирилов М.Л. (2014-05-30 18:40:00) [7]Скрин меню "Пуск": http://i62.fastpic.ru/big/2014/0530/e7/d135f4c70864ffd8dc407361e13075e7.jpg
Убрал vArr[0] :=.... ошибка та же :(
sniknik (2014-05-29 16:39:00) [8]> т.к. "добиться" такой же ошибки
добился еще одним способом... до этого открывал Excel-евские файлы, а попробовал создать "чистый" опенофисный ".ods" и при его открытии и получил... именно на параметрах, хотя -
> можно было бы, для начала, не пихать ничего, просто пустой массив.
убери вот эту строчку нафиг
vArr[0] := MakePropertyValue('FilterName', 'MS Excel 97');
закоментарь, удали, как хочешь, не поддерживается в OO формате екселевские фильтры похоже.
sniknik (2014-05-29 16:20:00) [9][8] + [18] работает, ошибок типа вышеуказанной нет (есть с тем, что вместо строк 0 читает).
у тебя вообще OO установлен? полностью/частично?
проверяй возвращаемые объекты на null/unknown, т.к. "добиться" такой же ошибки я например могу "исковеркав" например Desktop:= OO.createInstance(' com.sun.star.frame.D1e1s1k1t1op'); запрашиваемый инстанс... но раз у тебя он/другое из запрашиваемых написаны верно, значит не установлены (или установлен "форк" не имеющий таких имен).
Кирилов М.Л. (2014-05-29 15:47:00) [10]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 12:39:00) [11]+
сайт таки продолжает "рвать" длинные ссылки. в данной мной ([15]) буковка l расширения .html оторвалась.
sniknik (2014-05-29 11:30:00) [12]> что vArr создается из двух элементов, а устанавливается только 1-й
пофиг, имхо, "пустышка" будет - UNKNOWN. пропустит.
sniknik (2014-05-29 11:28:00) [13]http://openoffice.org.sourcearchive.com/documentation/1.1.3/classole__adapter_1_1UnoConversionUtilities_b0f0e1bd259fb6c44fa9c032880d53ed.html
if (pVar->vt != VT_UNKNOWN && pVar->vt != VT_DISPATCH)
throw IllegalArgumentException(
OUSTR("[automation bridge]UnoConversionUtilities::createOleObjectWrapper \n"
"The VARIANT does not contain an object type! "), 0, -1);
...
ты явно запихал в параметры что-то "левое". хотя, кстати параметры там не обязательны... можно было бы, для начала, не пихать ничего, просто пустой массив.
junglecat (2014-05-29 11:21:00) [14]а также в том, что vArr создается из двух элементов, а устанавливается только 1-й
sniknik (2014-05-29 11:03:00) [15]> В чем может быть проблема?
подозреваю в чем то тайном... например в MakePropertyValue.
Кирилов М.Л. (2014-05-28 19:34:00) [16]Смешно... :)
junglecat (2014-05-28 19:03:00) [17]> [10] Кирилов М.Л. (28.05.14 19:01)
сделай доброе дело, преврати свой пример в рабочий и выложи, чтобы можно было нагуглить. Кто-то ведь должен быть первым
Кирилов М.Л. (2014-05-28 19:01:00) [18]Нет ни у кого рабочего примера чтения данных из таблицы Calc? Погуглив как ни странно не нашел :(
junglecat (2014-05-28 18:55:00) [19]в том, что какая-то из вариантных переменных не является ссылкой на объект.
В отладчике надо смотреть
Кирилов М.Л. (2014-05-28 18:34:00) [20]Пробую импортировать так:
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
В чем может быть проблема?