🙏 Helfen Sie jetzt mit, unser LibreOffice Forum zu erhalten! 🙏
Mit Ihrer Spende sichern Sie den Fortbestand, den Ausbau und die laufenden Kosten dieses Forums. 🌱

🍀 Jeder Beitrag zählt – vielen Dank für Ihre Unterstützung!🍀

❤️ DANKE >> << DANKE ❤️

>> Dank Ihrer Unterstützung -> Keine Werbung für alle registrierten LibreOffice-Forum User! <<
🤗 Als Dankeschön werden Sie im Forum als LO-SUPPORTER gekennzeichnet. 🤗

Calc-Sheet mit ActiveX und Octave lesen - Array Konstruktion

Alles zur Programmierung im LibreOffice.
Antworten
schnumbl
Beiträge: 1
Registriert: Di 30. Nov 2010, 11:16

Calc-Sheet mit ActiveX und Octave lesen - Array Konstruktion

Beitrag von schnumbl » Di 30. Nov 2010, 11:29

Hallo,
ich möchte gerne Octave mit Calc über ActiveX verbinden.
Das funktioniert auch schon ganz gut. Nur wird immer das Calc-Fenster angezeigt
und ich möchte in manchen Fällen dass es versteckt bleibt.

Daher habe ich versucht ein Argument "Hidden" = false an die Funktion
"loadComponentFromURL" zu übergeben.

Mein Problem ist dass ich in Octave kein SAFEARRAY erzeugen kann.
(Ich konnte die Visual Basic Beispiele in diesem Fall nicht auf Octave übertragen.)

Gibt es einen Bridge-Befehl zur Konstruktion von SAFEARRAYs? Habt ihr eine Idee was
sonst noch an meinem Code (siehe unten) falsch sein könnte?

Ein leeres Octave Cell-Array { } kann ich an das COM-Objekt übergeben.
Wenn ich ein Cell-Array mit einem PropertyValue fülle funktioniert die Übergabe allerdings nicht mehr.

Gibt es noch andere Möglichkeiten um das Calc Fenster zu verbergen?
("Document.CurrentController.Frame.ContainerWindow.setVisible(false);" ist nicht schnell genug.)


Sonnige Grüße,

Stefan

Hier ist ein Teil meines Codes in dem ich Versuche das PropertyValue in ein Array zu packen und zu übergeben
(was nicht funktioniert:)

Code: Alles auswählen

propValue = ServiceManager.Bridge_GetStruct("com.sun.star.beans.PropertyValue");
ValueObj1 = ServiceManager.Bridge_GetValueObject();
ValueObj1.Set('string','Hidden');
propValue.Name = ValueObj1;
ValueObj2 = ServiceManager.Bridge_GetValueObject();
ValueObj2.Set('boolean',0);
propValue.Value=ValueObj2;

%Dieser Befehl funktioniert nicht:
Document = Desktop.loadComponentFromURL(urlString, "_default", 0, {propValue});

%Das hier auch nicht:
args{1}=propValue;
Document = Desktop.loadComponentFromURL(urlString, "_default", 0, args);

%Das funktioniert, aber das Calc Fenster ist sichtbar:
Document = Desktop.loadComponentFromURL(urlString, "_default", 0, {});


Und hier kommt meine ganze bisherige Funktion, mit sichtbarem Calc-Fenster
(vielleicht hat ja noch jemand Verwendung für den Code):

Code: Alles auswählen

function resultcell = gread(filepath);
if ~exist(filepath)
msgbox(['Error in gread. The file' sprintf('\n') filepath sprintf('\n') 'could not be found!']);
else
%connect with OO
ServiceManager = actxserver ("com.sun.star.ServiceManager");
Desktop= ServiceManager.createInstance("com.sun.star.frame.Desktop");

%convert filepath to url
special_in = {'%' '\' '#' '§' '{' '}' 'ß' '´' '`' '°' '^' ';' '@' '[' ']' '''' };
special_out = {'%25' '/' '%23' '%C2A7' '%7B' '%7D' '%C3' '%9F' '%C2%B4' '%60' '%5E' '%3b' '%40' '%5B' '%5D' '%27' };
for k=1:length(special_in)
filepath = strrep(filepath, special_in{k}, special_out{k});
end

urlString = ['file:///' filepath];

%open file

propValue = ServiceManager.Bridge_GetStruct("com.sun.star.beans.PropertyValue");
ValueObj1 = ServiceManager.Bridge_GetValueObject();
ValueObj1.Set('string','Hidden');
propValue.Name = ValueObj1;
ValueObj2 = ServiceManager.Bridge_GetValueObject();
ValueObj2.Set('boolean',0);
propValue.Value=ValueObj2;

%create an property array to pass it with the following command !!!!?????!!!!!

Document = Desktop.loadComponentFromURL(urlString, "_default", 0, {});

%Document.loadComponentFromURL(url,"_blank",0,{})
%create blank document
%Document= Desktop.loadComponentFromURL("private:factory/scalc", "_blank", 0, {});
%private:factory/sdraw
%private:factory/swriter
%private:factory/scalc
%private:factory/simpress
%file url: "file:///c:/example.ods", not: "file:///c:\example.ods" !!
%Document.CurrentController.Frame.ContainerWindow.setVisible(false);

%get first sheet
Sheet = Document.getSheets().getByIndex(0);

%get used range
Cursor = Sheet.createCursor();
Cursor.gotoStartOfUsedArea(false);
Cursor.gotoEndOfUsedArea(true);
Address = Cursor.getRangeAddress();
StartRow = Address.StartRow;
EndRow = Address.EndRow;
StartColumn=Address.StartColumn;
EndColumn=Address.EndColumn;

%get data
for i = StartRow:EndRow
for j = StartColumn:EndColumn
cellData= Sheet.getCellByPosition(j,i).getFormula();
data{i+1,j+1} = cellData;
if length(cellData)>1
if isequal(cellData(1),'''')
data{i+1,j+1} = cellData(2:end);
end
end
end
end

%close open office
Document.Close(true);
DocsColls = Desktop.Components.createEnumeration();
if ~DocsColls.hasMoreElements()
Desktop.terminate();
end
clear Document;
clear Desktop;
clear ServiceManager;

%return data
resultcell= data;


%set value
%Sheet.getCellByPosition(0,0).setFormula( "Month" )

%get value
%Sheet.getCellByPosition(0,2).getFormula()
%Sheet.getCellByPosition(0,0).getDataArray()


%Select a cell range
%Sheet.getCellRangeByName('A1:C5');
%Sheet.getCellRangeByPosition(0,0,0,3)

%get selection
%CellRange = Document.getCurrentSelection()
%RangeAddr = CellRange.getRangeAddress
%c1 = RangeAddr.StartColumn
%r1 = RangeAddr.StartRow
%c2 = RangeAddr.EndColumn
%r2 = RangeAddr.EndRow

%hide window
%Props(0).Name="Hidden"
%Props(0).Value=True
%Document.loadComponentFromURL(url,"_blank",0,Props())


%//JScript
%var value= objServiceManager.Bridge_GetValueObject();
%value.InitInOutParam("long", 123);
%object.doSomething(value);
%var out= value.Get();

end
end


An alle, die das LibreOffice-Forum gern nutzen und unterstützen wollen:


Bitte helfen Sie uns mit 7 Euro pro Monat.
Durch Ihren Beitrag tragen Sie dazu bei, unsere laufenden Kosten für die kommenden Monate zu decken.
Unkompliziert per Kreditkarte oder PayPal.
Als ein kleines Dankeschön werden Sie im LO-Forum als SUPPORTER gekennzeichnet.



Antworten