[gelöst] Exeltabelle als externe Datenquelle

Programmierung unter AOO/LO (StarBasic, Python, Java, ...)

Moderator: Moderatoren

der_Zerstreute
***
Beiträge: 62
Registriert: Do, 01.05.2008 11:33

[gelöst] Exeltabelle als externe Datenquelle

Beitrag von der_Zerstreute »

Hallo Leute ,

Ich habe ein kleines neues Projekt angefangen und brauch mal wieder eure Erfahrung ;).

Folgendes habe ich vor :
Ich habe eine OO-Calc Datei mit hinterlegtem Makro.
Dieses Makro liest als erstes eine auf einem Fileserver befindliche CSV Datei aus und trägt sie in Tabellenblatt 0 ein .
Dann sollen 2 XLS Dateien auf dem Fileserver ausgelesen werden. Von beiden Dateien benötige ich nur jeweils einen kleinen Abschnitt aus dem ersten Tabellenblatt.

Nun meine Frage:
1. Besteht eine Möglichkeit die XLS Datei auszulesen ohne sie richtig zu öffnen ?
2. Falls ich sie als Arbeitsblatt öffnen muß , kann ich sie dann schreibgeschützt öffnen ?

Danke schonmal im Vorraus für eure Zeit und Antworten ;)
Zuletzt geändert von der_Zerstreute am Fr, 21.02.2014 09:07, insgesamt 1-mal geändert.
Stephan
********
Beiträge: 12368
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: Exeltabelle als externe Datenquelle

Beitrag von Stephan »

Nun meine Frage:
bei beiden Fragen verstehe ich nicht so ganz was sie mit dem Thema "Dann sollen 2 XLS Dateien auf dem Fileserver ausgelesen werden. Von beiden Dateien benötige ich nur jeweils einen kleinen Abschnitt aus dem ersten Tabellenblatt." zu tun haben, außer es gäbe Nebenbedingungen die Du nicht genannt hast.
1. Besteht eine Möglichkeit die XLS Datei auszulesen ohne sie richtig zu öffnen ?
Nein, wobei ich hier auch nicht den Zusammenhang bzw. die Notwendigkeit verstehe (s.o.) oder anders gesagt, was soll denn 'nicht richtig öffnen' überhaupt sein?
2. Falls ich sie als Arbeitsblatt öffnen muß , kann ich sie dann schreibgeschützt öffnen ?
Auch hier ist mir nicht klar was 'als Arbeitsblatt öffnen' sein soll.

Eine Datei 'normal' schreibgeschützt öffnen geht hingegen mittels des Parameters namens ReadOnly im Parameterarray der Methode .LoadComponentfromURL, z.B.:

Code: Alles auswählen

Dim Prop(0) As New com.sun.star.beans.PropertyValue   

datei = ConvertToUrl("D:\test.xls")

Prop(0).Name = "ReadOnly"
Prop(0).Value = True 

aktDatei = StarDesktop.loadComponentFromURL(datei, "_blank", 0, Prop())


Gruß
Stephan
der_Zerstreute
***
Beiträge: 62
Registriert: Do, 01.05.2008 11:33

Re: Exeltabelle als externe Datenquelle

Beitrag von der_Zerstreute »

Hallo Stephan ,

ich glaube um das zu erläutern muß ich weiter ausholen ...

Dieses Makro läuft in einer OO-Calc Datei zur Datenauswertung .

Es bezieht seine Daten aus einer CSV Datei die von bis zu 8 Personen kumulativ beschrieben wird.
-> Diese 8 Personen füllen jeweils ein Textdokument aus welches als Doc gespeichert wird aber deren Inhalt im Ergänzungsmodus (append) in die CSV Datei geschrieben wird (jeweils beim schließen der Datei).
Die beiden anderen erwähnten XLS Dateien werden mit MS Office erstellt und bearbeitet von einer weiteren Person. Diese XLS Dateien enthalten mehrere Tabellenblätter und ich benötige nur den Inhalt des ersten Blatts.

Ich lese nun beim Start des Auswertmakros die CSV Datei via uno.service.inputstream ein und verteile den inhalt im ersten Blatt so wie ich es brauche.
Nun sollte der Inhalt der ersten Tabellenblätter aus den XLS Dateien ausgelesen werden .
Allerdings wäre es mir lieb wenn dazu nicht die ganze Datei in den Speicher geladen werden müsste, sprich so das man die Tabelle sehen kann. Lieber wäre es mir um halt Zeit zu sparen , wenn die Daten direkt aus der Tabelle gelesen werden könnten, ähnlich dem DDE Befehl innerhalb von Calc.

Ich kann leider keine DDE Verknüpfung zu dem anderen Dokument machen da es erstens verdammt aufwändig wäre die Tabellenblätter zu pflegen und zum anderen variiert die Anzahl der benötigten Zeilen (Inhaltsabhängig).

Ich möchte per schleife die erste Spalte aus der externen Tabelle auslesen und mit einer Liste in meiner Tabelle vergleichen. Falls nun neue Einträge in der externen Tabelle auftauchen sollen diese in die interne (meine) Tabelle eingetragen werden und die weiterführenden Informationen aus den nebenstehenen Spalten ebenfalls.

So, ich hoffe ich konnte die offenen Fragen damit etwas klären ..
Gruß
Daniel
Stephan
********
Beiträge: 12368
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: Exeltabelle als externe Datenquelle

Beitrag von Stephan »

Allerdings wäre es mir lieb wenn dazu nicht die ganze Datei in den Speicher geladen werden müsste, sprich so das man die Tabelle sehen kann.
verstehe ich leider nicht da Beides völlig verschiedene Dinge sind, wobei ich auch nicht einmal verstehe was das Erste denn praktisch bedeuten soll.
Eine Datei so zu laden das sie nicht sichtbar ist geht jedenfalls mittels Hidden-Parameter im Parameterarray der .LoadComponentFromURL-Methode, was nun aber nichts damit zu tun hat das die Datei nicht in den Speicher gelesen würde.




Gruß
Stephan
der_Zerstreute
***
Beiträge: 62
Registriert: Do, 01.05.2008 11:33

Re: Exeltabelle als externe Datenquelle

Beitrag von der_Zerstreute »

Hallo Stephan ,

gut dann hier mal ein code für "Datei nicht in den speicher laden" ...

Code: Alles auswählen

do while not oFileRead.isEOF
Zeile = oFileRead.readLine
ProgressValue=ProgressValue+1
for i=0 to 7
	semi = instr(Zeile,";")
	Data(i) = left(Zeile,semi)
	Data(i) = deletestr(Data(i),";")
	Zeile = right(Zeile,len(Zeile)-semi)
next
Data(8) = Zeile

	fortschritt = int(ProgressValue/max*100)
	MyDialog.Title = "Datenimport abgeschlossen zu"+str(Fortschritt)+"%"
	oProgressBarModel.setPropertyValue( "ProgressValue", ProgressValue )
           
	Tabelle.getCellbyPosition(0,z).value = val(Data(0))
	Tabelle.getCellbyPosition(1,z).value = val(Data(1))
	Tabelle.getCellbyPosition(2,z).string = Data(2) 
	Tabelle.getCellbyPosition(3,z).value = val(Data(3))
	Tabelle.getCellbyPosition(4,z).value = val(Data(4))
	Tabelle.getCellbyPosition(5,z).string = Data(5) 
	Tabelle.getCellbyPosition(6,z).string = Data(6) 
	if Data(7)<>"" then Tabelle.getCellbyPosition(7,z).value = timevalue(Data(7))
	Tabelle.getCellbyPosition(8,z).string = Data(8) 
	
z=z+1
Loop 
Dadurch wird die Datei nicht als "ganzes " geöffnet im sinne von "Datei öffnen" sondern nur ausgelesen ..
Aber der Hidden- Mode wäre auch ne Möglichkeit. Wahrscheinlich kann man Excel Tabellen auch gar nicht in dieser art öffnen - oder ?
gibt es denn sowas wie den DDE Befehl für Makros ?

Danke für deine Zeit ;)
Daniel
Benutzeravatar
balu
********
Beiträge: 3812
Registriert: Fr, 24.08.2007 00:28
Wohnort: Warstein

Re: Exeltabelle als externe Datenquelle

Beitrag von balu »

Halo Daniel,
gibt es denn sowas wie den DDE Befehl für Makros ?
Reicht dir vielleicht das hier ?



Gruß
balu
Sei öfter mal ein Faultier, sag öfter mal "Ach was!" Dann kriegst du keinen Herzinfarkt, und hast ne menge Spass.

wehr rächtschraipfähler findet khan si behalden :D
der_Zerstreute
***
Beiträge: 62
Registriert: Do, 01.05.2008 11:33

Re: Exeltabelle als externe Datenquelle

Beitrag von der_Zerstreute »

hallo Balu,

das teste ich mal an .. das könnte gehen .. hab ich total verdrängt gehabt ;)..

danke erstmal vorraus ..
Bericht folgt ..
der_Zerstreute
***
Beiträge: 62
Registriert: Do, 01.05.2008 11:33

Re: Exeltabelle als externe Datenquelle [gelöst]

Beitrag von der_Zerstreute »

mhm .. also ich hab da mal folgendes ausprobiert :

Code: Alles auswählen

...
Dim Temp as variant
dim oTemp as object
Dim Args(2) as variant
...
oFunctionAccess = createUnoService( "com.sun.star.sheet.FunctionAccess" )
...
Args(0) = "soffice"
Args(1) = "\\Server\test.XLS"
i=14
do
	Args(2) = "Tabelle1.A"+right(str(i),2)
	otemp = oFunctionAccess.callFunction( "DDE", Args())
...
egal wie ich es drehe und wende , ich bekomme immer einen "...illegalArgumentException.Message:." Fehlermeldung.
Irgendwie scheint "callFunction" nicht mit DDE zu funktionieren oder ich hab irgendwas mit den Parametern falsch gemacht ..

Ende vom Lied ist nun , ich habe es mit der von Stephan vorgeschlagenen Methode gemacht ..

Code: Alles auswählen

...
datei = converttoURL("\\File-srv\....XLS")

Prop(0).Name = "ReadOnly"
Prop(0).Value = True 
Prop(1).Name = "Hidden"
Prop(1).Value = true

aktDatei = StarDesktop.loadComponentFromURL(datei, "_blank", 0, Prop())
i=13
do
	MyDialog.Title = "Einlesen von ....XLS"
	oProgressBarModel.setPropertyValue( "ProgressValue", 25 )
	
	temp = aktDatei.Sheets(0).getCellbyPosition(0,i).string
	if left(temp,6) = "Mit fr" then exit do
	if val(temp) = 0 then goto nowritePH
	'Vergleiche mit bestehenden Nummern und ggf. nachtragen 
	Z = PartStringinArray(aPH(),temp,0)
	 if Z < 1 then 
	 	TabellePH.getCellbyPosition(0,iPH).value = aktDatei.Sheets(0).getCellbyPosition(0,i).value 	
	 	TabellePH.getCellbyPosition(2,iPH).string = aktDatei.Sheets(0).getCellbyPosition(2,i).string 
	 	iPH= iPH + 1
	 end if
nowritePH:
i=i+1	
loop
aktDatei.close(0)
...
und so läuft es super :D .. Danke nochmal für den Tip mit dem "Hidden"-Modus :D

Danke an alle ;)

Projekt gelöst !
Antworten