WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Effizientes xlsread für mehrere Sheets einer xls Datei

 

k@tze
Forum-Anfänger

Forum-Anfänger


Beiträge: 29
Anmeldedatum: 27.12.10
Wohnort: ---
Version: 7.9.0 R2009b
     Beitrag Verfasst am: 12.01.2011, 12:37     Titel: Effizientes xlsread für mehrere Sheets einer xls Datei
  Antworten mit Zitat      
Hallo,

soweit ich weiß wird bei xlsread für jeden Aufruf die Datei geöffnet und danach wieder geschlossen. Dies ist recht zeitaufwendig.

Ich habe eine Exceldatei aus der ich aus zwei Sheets Daten auslesen muss:

Code:
num1 = xlsread(file, 1);
num2 = xlsread(file, 2);


Gibt es eine Möglichkeit (abgesehen vom Zusammenfügen der Sheets) beide Sheets in einem xlsread Aufruf einzulesen? Ziel ist es die Laufzeit zu verringern.

Gruß,
k@tze
Private Nachricht senden Benutzer-Profile anzeigen


denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 12.01.2011, 15:06     Titel:
  Antworten mit Zitat      
Hallo

nein mit XLSREAD kann man nur einzelne Sheets einlesen.
Schaue dir XLSREAD mit Editor an, auf Basis von XLSREAD kannst du eigene
Routine basteln.

oder schaue auf FEX:
http://www.mathworks.com/matlabcent.....-for-faster-data-transfer
Private Nachricht senden Benutzer-Profile anzeigen
 
k@tze
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 29
Anmeldedatum: 27.12.10
Wohnort: ---
Version: 7.9.0 R2009b
     Beitrag Verfasst am: 12.01.2011, 16:13     Titel:
  Antworten mit Zitat      
Ich denke dein Link mach für mich mehr Sinn. Schon einmal Danke.

Wie habe ich nun diese Zeile zu interpretieren:

Excel.Workbooks.Open('C:\YourAddInFolder\AddInNameWithExtension');

Wie habe ich sie anzupassen?

Die modifizierte Funktion sowie Excel File und m Files sollen alle im gleichen Ordner XYZ liegen, wobei ich den Order XYZ innerhalb meines Netzwerks beliebig verschieben möchte. Geht das?

Also analog zum bisherigen Code bei dem
Code:
file = 'x.xlsm'


Gruß,
k@tze
Private Nachricht senden Benutzer-Profile anzeigen
 
denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 12.01.2011, 16:59     Titel:
  Antworten mit Zitat      
Zitat:
Ich denke dein Link mach für mich mehr Sinn. Schon einmal Danke.

Wie habe ich nun diese Zeile zu interpretieren:

Excel.Workbooks.Open('C:\YourAddInFolder\AddInNameWithExtension');

steht doch beschrieben, das ist einfach der Pfad zu deinem Excel-Datei, die Funktion macht dann die Excel-Datei auf. Genauer gesagt setzt einen Zeiger darauf.

also so musst diese Funktion dann so aufrufen:
so wird Excel nur einmal aufgemacht.
Code:

Excel = actxserver ('Excel.Application');
Excel.Workbooks.Open(file)
num1 = xlsread1(file,1)
num2 = xlsread1(file,2)
Excel.Quit
Excel.delete
clear Excel
 


Zuletzt bearbeitet von denny am 12.01.2011, 17:26, insgesamt einmal bearbeitet
Private Nachricht senden Benutzer-Profile anzeigen
 
k@tze
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 29
Anmeldedatum: 27.12.10
Wohnort: ---
Version: 7.9.0 R2009b
     Beitrag Verfasst am: 12.01.2011, 17:21     Titel:
  Antworten mit Zitat      
Code:
file = 'X.xlsm'
Excel.Workbooks.Open(file);


führt zu

Zitat:
??? Invoke Error, Dispatch Exception:
Source: Microsoft Office Excel
Description: X.xlsm' wurde nicht gefunden. Überprüfen Sie die Rechtschreibung des
Dateinamens, und überprüfen Sie, ob der Speicherort der Datei korrekt ist.

Wenn Sie versuchen, die Datei über die Liste der zuletzt geöffneten Dateien zu öffnen, stellen
Sie sicher, dass die Datei nicht umbenannt, verschoben oder gelöscht wurde.
Help File: C:\Program Files\Microsoft Office\Office12\1031\XLMAIN11.CHM
Help Context ID: 0


Entscheidend ist für mich:
Zitat:
Die modifizierte Funktion sowie Excel File und m Files sollen alle im gleichen Ordner XYZ liegen, wobei ich den Order XYZ innerhalb meines Netzwerks beliebig verschieben möchte.


Sprich, ich kann nicht den gesamten Pfad angeben. Matlab soll den Ordner verwenden, der gerade verwendet wird.
Private Nachricht senden Benutzer-Profile anzeigen
 
k@tze
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 29
Anmeldedatum: 27.12.10
Wohnort: ---
Version: 7.9.0 R2009b
     Beitrag Verfasst am: 12.01.2011, 17:30     Titel:
  Antworten mit Zitat      
Zitat:
The first line of code in xlsread1 is
Excel = evalin('base','Excel');
that tries to look for the object Excel in the base workspace.
But, since I instantiated the excel object in my m function, here's the error we met.
You should modify it in
Excel = evalin('caller','Excel');
that tries to look fo the Excel object in the workspace of the caller, where the object exists.


Das war leider auch nicht von Erfolg gekrönt (gleiche Fehlermeldung).
Private Nachricht senden Benutzer-Profile anzeigen
 
denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 12.01.2011, 17:37     Titel:
  Antworten mit Zitat      
Hallo

Zitat:
Sprich, ich kann nicht den gesamten Pfad angeben. Matlab soll den Ordner verwenden, der gerade verwendet wird.


das ist kein Problem, das sollte funktionieren. Wenn man nur den Dateinamen eingibt, dann wird danach nur in aktuellen Verzeichnis gesucht.

so hat es bei mir funktioniert:
Code:

file= 'my_excel_datei.xls';
Excel = actxserver ('Excel.Application');
Excel.Workbooks.Open(file)
num1 = xlsread1(file,1)
num2 = xlsread1(file,2)
Excel.Quit
Excel.delete
clear Excel
 


Ich habe OFFICE 2003. Meine Version kann nicht mit XLSM umgehen.

Was ich fragen, warum XLSM-Extention? hast du OFFICE 2007/2010 auf deinem Rechner?
Private Nachricht senden Benutzer-Profile anzeigen
 
k@tze
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 29
Anmeldedatum: 27.12.10
Wohnort: ---
Version: 7.9.0 R2009b
     Beitrag Verfasst am: 12.01.2011, 17:49     Titel:
  Antworten mit Zitat      
Habe exakt den gleichen Code verwendet (und auch die passende xls erstellt), erhalte aber in Zeile drei wieder den Fehler:

Zitat:
Description: 'my_excel_datei.xls' wurde nicht gefunden.


Ich nutze Office 2007. xlsm brauche ich für Makros. Ist aber in diesem Fall erstmal irrelevant, da es auch mit xls nicht klappt Sad

Habe übrigens sowohl base als auch caller probiert.
Private Nachricht senden Benutzer-Profile anzeigen
 
denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 12.01.2011, 17:54     Titel:
  Antworten mit Zitat      
Hallo

wo liegt deine XLS denn?
was sagt WHICH?
Code:

which my_excel_datei.xls
 


muss PWD entsprechen
Code:
Private Nachricht senden Benutzer-Profile anzeigen
 
k@tze
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 29
Anmeldedatum: 27.12.10
Wohnort: ---
Version: 7.9.0 R2009b
     Beitrag Verfasst am: 12.01.2011, 18:00     Titel:
  Antworten mit Zitat      
Zitat:
>> which my_excel_datei.xls
V:\...\Matlab\my_excel_datei.xls
>> pwd
V:\...\Matlab


"..." ist identisch.
Private Nachricht senden Benutzer-Profile anzeigen
 
denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 13.01.2011, 03:17     Titel:
  Antworten mit Zitat      
Hallo

habe jetzt auf anderem Rechner ausprobiert mit Office 2007
und ich bekomme die gleiche Fehlermeldung.
Liegt an Excel.Workbooks.Open es brauch absoluten Pfad.

so könntest du das lösen:
Code:

file= 'my_excel_datei.xls';
Excel = actxserver ('Excel.Application');
Excel.Workbooks.Open(fullfile(pwd,file))
num1 = xlsread1(file,1)
num2 = xlsread1(file,2)
Excel.Quit
Excel.delete
clear Excel
 
Private Nachricht senden Benutzer-Profile anzeigen
 
k@tze
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 29
Anmeldedatum: 27.12.10
Wohnort: ---
Version: 7.9.0 R2009b
     Beitrag Verfasst am: 13.01.2011, 11:06     Titel:
  Antworten mit Zitat      
Absolut, es funktioniert. Die gewünschte Zeiteinsparung wurde erreicht.

Vielen Dank für deine Ausdauer.

Gruß,
k@tze
Private Nachricht senden Benutzer-Profile anzeigen
 
k@tze
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 29
Anmeldedatum: 27.12.10
Wohnort: ---
Version: 7.9.0 R2009b
     Beitrag Verfasst am: 27.06.2011, 14:33     Titel:
  Antworten mit Zitat      
Hallo,

wie damals besprochen kann ich den folgenden Code verwenden.

Code:
file= 'my_excel_datei.xls';
Excel = actxserver ('Excel.Application');
Excel.Workbooks.Open(fullfile(pwd,file))
num1 = xlsread1(file,1)
num2 = xlsread1(file,2)
Excel.Quit
Excel.delete
clear Excel
 


Ziel war und ist es durch den xlsread1 Befehl gegenüber xlsread Zeit zu sparen. Nun fällt mir auf, dass der Befehl

Code:
Excel.Workbooks.Open(fullfile(pwd,file))
 


für dieses File (300KB) ca. 7 Sekunden dauert (und somit auch für die oben genannten Befehle ohne num2) . An einem anderen File (100KB) habe ich ebenfalls die Zeit gemessen (lediglich 1 Sekunde).

Verwende ich hingegen einmalig den xlsread Befehl, so ist der Laufzeitunterschied wesentlich geringer: 1.8 vs. 1.2 Sekunden.

Wie kann das sein? Ein einmaliger Aufruf von xlsread1 inklusive dem Prozedere drum herum entspricht doch genau xlsread. Die Zeitmessung mit dem zweiten File steht dem auch nicht im Widerspruch. Woher kann nun die große Zeitdiskrepanz beim ersten File kommen?
Private Nachricht senden Benutzer-Profile anzeigen
 
k@tze
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 29
Anmeldedatum: 27.12.10
Wohnort: ---
Version: 7.9.0 R2009b
     Beitrag Verfasst am: 15.07.2011, 11:28     Titel:
  Antworten mit Zitat      
Ahnt niemand die Ursache? Das Problem ist noch aktuell.

Gruß,
k@tze
Private Nachricht senden Benutzer-Profile anzeigen
 
denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 15.07.2011, 14:06     Titel:
  Antworten mit Zitat      
Hallo

Weil du es nur einmal gemessen, dass ist nicht aussagekräftig.
Der Unterschied kann durch vielen Sachen kommen:
1) du hast ja nur leicht XLSREAD abgeändert,
die ganze Überprüfung in der Funktion ist aber geblieben.
So wird bei kleinen Files es besonders bemerkbar, wo das aufmachen des Files nicht mehr relevant wird, aber XLSREAD mehrmalig aufgerufen wird.

2)Jede Funktion hat Eigenverbrauchszeit, also je mehr Funktionen ineinander geschachtelt werden, verbrauchen Zeit um einander aufzurufen.
3)Außerdem müssen m-Files einmalig übersetzt werden, danach werden sie in Speicher gehalten.
4)Es kann auch sein das anderer Prozess zu dem Zeitpunkt Messung verfälscht hat.

Damit du Aussagekräftige Zeitunterschiede hin bekommst, muss du dein Code einige hundert mal ausführen. und am Besten dann Profiler benutzen um den Flaschenhals zu finden.
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen



Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

Du kannst Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.
Du kannst Dateien in diesem Forum posten
Du kannst Dateien in diesem Forum herunterladen
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2025 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.