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

Mit Matlab mehrere Excel-Sheets auf einmal aufrufen.

 

NickNack
Forum-Newbie

Forum-Newbie


Beiträge: 3
Anmeldedatum: 19.03.16
Wohnort: Stuttgart
Version: ---
     Beitrag Verfasst am: 21.03.2016, 11:44     Titel: Problem noch immer nicht ganz gelöst
  Antworten mit Zitat      
Also, ich habe noch ein wenig recherchiert und bin der Sache schon deutlich näher gekommen Wink

Der Folgende Code liest mir alle Files ein und schreibt die jeweils interessierenden Bereiche von Sheet 2 einer jeder File nebeneinander in die Matrix "mat".


Code:


path = uigetdir(pwd,'Ordner auswählen');                        % Pfadangabe der Excelfiles
path = [path filesep];
file_all = dir(path);                                           % alle Daten im Verzeichniss (Ordner und Files)
file = file_all([file_all.isdir] == 0);                         % Extraktion der Files

P = cell(1,numel(file));                                        % pre allocation

if ~isempty(file)                                               % ist der Ordner leer (bzw. keine Files)?
    for k = 1:numel(file)
        [pathstr, name, ext] = fileparts([path file(k).name]);  % Fileinformationen
        if strcmp(ext,'.xls')                                   % ist die aktuelle file eine Excel-File?, wenn ja-->File einlesen
            P{k} = xlsread([path file(k).name], 2, 'D2:K2');    % Einlesen des Excel Wertes aus Sheet 2 Bereich D2 bis K2          
        end
    end
end

P(cellfun(@(x) isempty(x),P)) = []; % entfernen der vordefinierten Zellfelder die leer sind (falls nicht alle Files im Verzeichniss Excel Files waren)
mat = cell2mat(P); % Umwandlung der Cell in eine Matrix (falls erwuenscht) -> Schreibt die INtervalle D2:K2 der Sheets nebeneinander.

 



Das gefällt mir soweit schon richtig gut, nur fehlt mir zu meinem Glück, dass mir das Programm nicht nur für einen Sheet die Daten speichert, sondern, dass es in die Zeilen der Matrix "mat" untereinander die Daten für die einzelnen Sheets schreibt.
Private Nachricht senden Benutzer-Profile anzeigen


Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 21.03.2016, 15:56     Titel: Re: Problem noch immer nicht ganz gelöst
  Antworten mit Zitat      
Hallo NickNack,

"path" ist ein wichtiger Matlab-Befehl. Ihn mit einer Variablen zu überschreiben ist kein Bug, kann aber beim Debuggen zu sehr unerwartetem Verhalten führen.

cellfun('isempty', P) is deutlich schneller als cellfun(@isempty, P) , aber die anonyme Funktion cellfun(@(x) isempty(x),P) ist am lahmsten.

Zitat:
Das gefällt mir soweit schon richtig gut, nur fehlt mir zu meinem Glück, dass mir das Programm nicht nur für einen Sheet die Daten speichert, sondern, dass es in die Zeilen der Matrix "mat" untereinander die Daten für die einzelnen Sheets schreibt.

Das verstehe ich noch nicht. In P sind doch die Daten aller Files gespeichert, oder? Warum fehlen die Werte dann in mat?

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
NickNack
Forum-Newbie

Forum-Newbie


Beiträge: 3
Anmeldedatum: 19.03.16
Wohnort: Stuttgart
Version: ---
     Beitrag Verfasst am: 21.03.2016, 18:21     Titel:
  Antworten mit Zitat      
Hallo Jan S,

danke für den Tipp mit cellfun('isempty', P) Ich werde es gleich mal ausprobieren (wobei die Zeit eher nebensächlich ist).

Ja, in mat sind die Werte aller Files nacheinander in Zeile eins. Jedoch nur für (im Falle meines Beispieles) für den Sheet 2. Da ich jedoch mehrere Sheets in jeder Excel-File habe, möchte ich gerne die Werte von jedem Sheet in den einzelnen Zeilen Stehen haben...

Im Prinzip so:

Daten aus allen Sheet 1: |D2:K2 File1|D2:K2 File2|...|...|...|...|
Daten aus allen Sheet 2: |D2:K2 File1|D2:K2 File2|...|...|...|...|
Daten aus allen Sheet 3: |D2:K2 File1|D2:K2 File2|...|...|...|...|
Daten aus allen Sheet 4: |D2:K2 File1|D2:K2 File2|...|...|...|...|

usw....



Mit Folgendem Code bekomme ich jetzt soweit ich das sehen kann, mein gewünschtes Ergebnis:

Code:


path = uigetdir(pwd,'Ordner auswählen'); % Pfadangabe der Excelfiles

path = [path filesep];

file_all = dir(path); % alle Daten im Verzeichniss (Ordner und Files)

file = file_all([file_all.isdir] == 0); % Extraktion der Files



P = cell(1,numel(file)); % pre allocation



if ~isempty(file) % ist der Ordner leer (bzw. keine Files)?

 for k = 1:numel(file)

 [pathstr, name, ext] = fileparts([path file(k).name]); % Fileinformationen

 if strcmp(ext,'.xls') % ist die aktuelle file eine Excel-File?, wenn ja-->File einlesen

 sheet = 1; % Nummer des ersten Sheets

 for a = sheet:5;

 P{a,k} = xlsread([path file(k).name],a, 'B1:F1'); % Einlesen des Ranges

 end

 end

 end

end



%P(cellfun(@(x) isempty(x),P)) = []; % entfernen der vordefinierten Zellfelder die leer sind (falls nicht alle Files im Verzeichniss Excel Files waren)

mat = cell2mat(P); % Umwandlung der Cell in eine Matrix (falls erwuenscht)


 



Über Verbesserungen oder Anregungen würde ich mich dennoch freuen Smile
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 22.03.2016, 03:17     Titel:
  Antworten mit Zitat      
Hallo NickNack,

Code:
pathname = uigetdir(pwd,'Ordner auswählen'); % Pfadangabe der Excelfiles
% pathname = [pathname, filesep];  Überflüssig, FULLFILE ist besser
%     Nebenbei könnte der Ordner ja auch "C:\" sein, so dass man da kein \
&      anhängen sollte.

file_all = dir(pathname); % alle Daten im Verzeichniss (Ordner und Files)
file = file_all([file_all.isdir] == 0); % Extraktion der Files

P = cell(5, numel(file)); % pre allocation, 5 statt 1 als erste dimension
% if ~isempty(file) % Überflüssig. Falls NUMEL(file) == 0, wird die FOR-Schleife
                              % nicht aufgerufen
for k = 1:numel(file)
   [pathstr, name, ext] = fileparts(file(k).name); % Filename ohne []
   if strcmpi(ext, '.xls') % Case-insensitive
     sheet = 1; % Nummer des ersten Sheets
     for a = sheet:5
       P{a,k} = xlsread(fullfile(pathname, file(k).name),a, 'B1:F1'); % Einlesen des Ranges
     end
  end
end

%P(cellfun('isempty',P)) = []; % entfernen der vordefinierten Zellfelder die leer sind (falls nicht alle Files im Verzeichniss Excel Files waren)
mat = cell2mat(P); % Umwandlung der Cell in eine Matrix (falls erwuenscht)
 

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen

Gehe zu Seite Zurück  1, 2

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.