Seite 1 von 1
[gelöst] Exeltabelle als externe Datenquelle
Verfasst: Mo, 14.11.2011 09:34
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

Re: Exeltabelle als externe Datenquelle
Verfasst: Mo, 14.11.2011 09:59
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
Re: Exeltabelle als externe Datenquelle
Verfasst: Mo, 14.11.2011 16:36
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
Re: Exeltabelle als externe Datenquelle
Verfasst: Di, 15.11.2011 10:01
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
Re: Exeltabelle als externe Datenquelle
Verfasst: Di, 15.11.2011 10:42
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
Re: Exeltabelle als externe Datenquelle
Verfasst: Di, 15.11.2011 11:16
von balu
Halo Daniel,
gibt es denn sowas wie den DDE Befehl für Makros ?
Reicht dir vielleicht
das hier ?
Gruß
balu
Re: Exeltabelle als externe Datenquelle
Verfasst: Di, 15.11.2011 12:47
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 ..
Re: Exeltabelle als externe Datenquelle [gelöst]
Verfasst: Mi, 16.11.2011 07:02
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

.. Danke nochmal für den Tip mit dem "Hidden"-Modus
Danke an alle
Projekt gelöst !