2
1

Hallo ihr Lieben,

ich bräuchte mal wieder Eure Hilfe. Nach meinem letzten Problem habe ich doch einen der Ratschläge befolgt und lasse nun für meine Daten eine CSV-Datei erzeugen, aus der ich die Daten dann folgendermaßen verarbeite:

Open in Online-Editor
\begin{filecontents*}{timesheet.csv}
tag, tagKurz, datum, art, arbeitVon, arbeitBis, pauseVon, pauseBis, std, tage, projekt
Donnerstag, Do, 04.01.2015, , 09:00, 19:00, 13:00, 14:00, 9.00, 1.00, BMW Halle 2.B Nord
Freitag, Fr, 05.01.2015, UH, 13:00, 18:30, , , 5.5, 0.5, Audi       
Samstag, Sa, 06.01.2015, , , , , , , ,  
Sonntag, So, 07.01.2015, , 15:00, 17:00, , , 2.00, 0.25,    
\end{filecontents*}
\documentclass[10pt,a4paper]{article}
\usepackage[ngerman]{babel}     %nachinstalliert!
\usepackage[paper=a4paper,left=20mm,right=20mm,top=15mm,bottom=15mm]{geometry}
\usepackage{longtable}
\usepackage{datatool}
\setlength{\parindent}{0pt}

\DTLloaddb{times}{timesheet.csv}

\newenvironment{timesheet}
{ \setlength{\tabcolsep}{0pt}%
\begin{longtable} 
{@{}p{0.075\textwidth}p{0.125\textwidth}p{0.075\textwidth}p{0.1\textwidth}p{0.1\textwidth}p{0.1\textwidth}p{0.1\textwidth}p{0.075\textwidth}p{0.075\textwidth}p{0.145\textwidth}}   
\multicolumn{3}{c}{}    & \multicolumn{2}{c}{Arbeitszeit}   & \multicolumn{2}{c}{Pausenzeit}&       &       &          \\
Tag   & Datum   & Art   & Kommen   & Gehen                  & Kommen    & Gehen             & Std   & Tage  & Projekt  \\
\endhead
}  
{  \end{longtable} }

\begin{document}
\begin{timesheet}
\DTLforeach{times}{
\tag=tag,           \tagKurz=tagKurz,       \datum=datum,       \art=art,   
\arbeitVon=arbeitVon, \arbeitBis=arbeitBis, \pauseVon=pauseVon, \pauseBis=pauseBis, 
\std=std,           \tage=tage,             \projekt=projekt}{
\tagKurz & \datum & \art & \arbeitVon & \arbeitBis & \pauseVon & \pauseBis & \std & \tage & \projekt \\
}
\end{timesheet}
\end{document}

Ich weiß leider nicht, wie ich die CSV jetzt hier rein bekomme, so dass es ein lauffähiges Beispiel wird, ich hoffe ihr verzeiht es mir.

Nun zu meiner Frage: Wie kann ich innerhalb der foreach-Schleife noch bei bestimmten Bedingungen eingreifen, z.B. möchte ich, wenn bei tagKurz "Sa" oder "So" als Wert vorhanden ist, die gesamte Zeile in der Tabelle farbig hinterlegen.

Ich hoffe, es ist alles soweit verständlich und ihr könnte mir da weiterhelfen.

Gruß

Snoopy EL

gefragt 01 Okt '15, 09:25

Snoopy%20EL's gravatar image

Snoopy EL
1141813
Akzeptiert-Rate: 0%

bearbeitet 10 Jan '16, 20:24

saputello's gravatar image

saputello
11.1k174365

2

Ich habe bei den Themen Deiner Frage datatool ergänzt. Wenn Du darauf klickst, kannst Du auch einfach bei anderen Fragen/Antworten zu dem Thema schauen, wie die Daten dort eingefügt wurden.

(01 Okt '15, 09:40) esdd

@esdd, danke! @saputello, hab nun noch Daten hinzugefügt, danke für den Hinweis, hatte zwar dort geguckt, aber es schlichtweg überlesen, sry...

(01 Okt '15, 10:15) Snoopy EL

Die Farbe einer Spalte kann man mit Hilfe von colortbl setzen. Da man dafür auch noch ein Farbpaket benötigt, lädt man am besten gleich xcolor mit Option table.

Für Unterscheidungen in Abhängigkeit des Inhalts einer Spalte sind in datatool diverse Befehle definiert. Hier bietet sich beispielsweise an mit \DTLifeq oder \DTLifstringeq am Anfang der ersten Spalte zu testen, ob \tagKurz beispielsweise So ist. Für ein \cellcolor würde das bereits genügen. Allerdings verwendet colortbl für \rowcolor ein \noalign, damit die Zeilenfarbe noch vor der Verarbeitung der ersten Zelle gesetzt wird und nicht lokal zu dieser ist. Ein \noalign im Argument von \DTLifstringeq funktioniert nicht mehr, da dann bereits das \DTLifstringeq als Teil der Tabellenzelle verarbeitet wird. Es gibt jedoch einen Trick:

Open in Online-Editor
%\RequirePackage{filecontents}
\begin{filecontents*}{timesheet.csv}
tag, tagKurz, datum, art, arbeitVon, arbeitBis, pauseVon, pauseBis, std, tage, projekt
Sonntag, So, 31.12.2014, , , , , , , ,
Donnerstag, Do, 04.01.2015, , 09:00, 19:00, 13:00, 14:00, 9.00, 1.00, BMW Halle 2.B Nord
Freitag, Fr, 05.01.2015, UH, 13:00, 18:30, , , 5.5, 0.5, Audi       
Samstag, Sa, 06.01.2015, , , , , , , ,  
Sonntag, So, 07.01.2015, , 15:00, 17:00, , , 2.00, 0.25,
Montag, Mo, 08.01.2015, , , , , , , ,
\end{filecontents*}
\documentclass[10pt,a4paper]{article}
\usepackage[ngerman]{babel}     %nachinstalliert!
\usepackage[paper=a4paper,left=20mm,right=20mm,top=15mm,bottom=15mm]{geometry}
\usepackage{longtable}
\usepackage{datatool}
%\setlength{\parindent}{0pt}% Das ist nicht gut!
\usepackage{parskip}% Das ist besser. Bei KOMA-Script stattdessen \documentclass[parskip]{…}

\usepackage[table]{xcolor}

\DTLloaddb{times}{timesheet.csv}

\newenvironment{timesheet}
{ \setlength{\tabcolsep}{0pt}%
\begin{longtable} 
{@{}p{0.075\textwidth}p{0.125\textwidth}p{0.075\textwidth}p{0.1\textwidth}p{0.1\textwidth}p{0.1\textwidth}p{0.1\textwidth}p{0.075\textwidth}p{0.075\textwidth}p{0.145\textwidth}}   
\multicolumn{3}{c}{}    & \multicolumn{2}{c}{Arbeitszeit}   & \multicolumn{2}{c}{Pausenzeit}&       &       &          \\
Tag   & Datum   & Art   & Kommen   & Gehen                  & Kommen    & Gehen             & Std   & Tage  & Projekt  \\
\endhead
}  
{  \end{longtable} }

\begin{document}
\begin{timesheet}
\DTLforeach{times}{
\tag=tag,           \tagKurz=tagKurz,       \datum=datum,       \art=art,   
\arbeitVon=arbeitVon, \arbeitBis=arbeitBis, \pauseVon=pauseVon, \pauseBis=pauseBis, 
\std=std,           \tage=tage,             \projekt=projekt}{%
\DTLifstringeq{\tagKurz}{So}{\\\kill\rowcolor{red}}{}%
\tagKurz & \datum & \art & \arbeitVon & \arbeitBis & \pauseVon & \pauseBis & \std & \tage & \projekt\\
}
\end{timesheet}
\end{document}

longtable bietet die Möglichkeit, Zeilen erst zu definieren und dann mit \kill doch nicht auszugeben. Das wird hier verwendet. Wird mit \DTLifstringeq festgestellt, dass es sich um einen Sonntag handelt, dann wird die aktuelle Zeile, die von \DTLifstringeq bereits begonnen wurde, gleich wieder mit \\ beendet und diese (nun ja eigentlich noch immer leere) Zeile mit \kill gelöscht. Damit befinden wir uns wieder am Anfang einer Tabellenzeile und können sie mit \rowcolor einfärben:

Tabelle mit roten Zeilen für So

Will man weitere Zeilen abhängig vom Inhalt färben, kann man das ganz genauso machen oder auch einfach die vorhandene Fallunterscheidung erweitern. Es würde also sowohl

Open in Online-Editor
\DTLifstringeq{\tagKurz}{Sa}{\\\kill\rowcolor{red}}{}%
\DTLifstringeq{\tagKurz}{Sa}{\\\kill\rowcolor{red}}{}%

als auch

Open in Online-Editor
\DTLifstringeq{\tagKurz}{Sa}{\\\kill\rowcolor{red}}{%
  \DTLifstringeq{\tagKurz}{So}{\\\kill\rowcolor{red}}{}%
}%

funktionieren, um sowohl Sonntage als auch Samstage einzufärben.

Näheres zu den Fallunterscheidungen, die datatool bietet, ist dessen Anleitung zu entnehmen. Dort findet man auch diverse Beispiele zur Verwendung dieser Befehle.

Näheres zu Farben und deren Verwendung in Tabellen ist den Anleitungen zu den Paketen xcolor und colortbl zu entnehmen.

Näheres zu \kill, dessen eigentlicher Funktion und Auswirkungen ist der Anleitung zum Paket longtable zu entnehmen.

Permanenter link

beantwortet 01 Okt '15, 11:17

saputello's gravatar image

saputello
11.1k174365
Akzeptiert-Rate: 51%

bearbeitet 01 Okt '15, 11:57

Vielen Dank @saputello, das hilft mir schon ein gutes Stück weiter. Ich werde mich dann mal mit den einzelnen Paketen beschäftigen :)

(01 Okt '15, 12:13) Snoopy EL
Deine Antwort
Vorschau umschalten

Folgen dieser Frage

Per E-Mail:

Wenn sie sich anmelden, kommen Sie für alle Updates hier in Frage

Per RSS:

Antworten

Antworten und Kommentare

Markdown-Grundlagen

  • *kursiv* oder _kursiv_
  • **Fett** oder __Fett__
  • Link:[Text](http://url.com/ "Titel")
  • Bild?![alt Text](/path/img.jpg "Titel")
  • nummerierte Liste: 1. Foo 2. Bar
  • zum Hinzufügen ein Zeilenumbruchs fügen Sie einfach zwei Leerzeichen an die Stelle an der die neue Linie sein soll.
  • grundlegende HTML-Tags werden ebenfalls unterstützt

Frage-Themen:

×257
×21
×17
×13

gestellte Frage: 01 Okt '15, 09:25

Frage wurde gesehen: 9,879 Mal

zuletzt geändert: 10 Jan '16, 20:24