来自 csv 的序列字母,带有一个单元格中包含多行的表格

来自 csv 的序列字母,带有一个单元格中包含多行的表格

我正在努力创建一封“连续信件”(实际上不是一封信,而是一个文档,我需要为不同的人提供不同的版本)。我拥有插入 csv 文件所需的所有数据。一开始,它只应该使文档个性化,只带有姓名。它有 4 页,只应该在第一页写上人的姓名,因此会得到一个包含每个人的 4 面文档的 pdf。

现在我想创建类似的东西,但现在它要做的不仅仅是插入名称。最后一页应该是一个包含他们任务的表格。目前它应该是每天一行,第二列应该是当天的不同任务(理想情况下每个任务一行,仍然在一个单元格中)。我使用包 datatool 来实现这一点。现在的问题是正确格式化 csv 并将其与 babel 很好地结合起来(认为这是问题之一)。

我知道你们都喜欢简约的例子,所以就给你们举个例子。

\documentclass[parskip,twoside,9pt]{scrartcl}
\usepackage{fontspec}
\usepackage[german]{babel}
\usepackage{marvosym}
\usepackage{lmodern}
\usepackage[a6paper,left=8.5mm,right=8.5mm,top=2.26cm,bottom=8.5mm,headheight=2.26cm,headsep=0cm]{geometry}
\usepackage{array}
\usepackage{wrapfig}
\usepackage{fancyhdr}
\tolerance=2000
\setlength{\emergencystretch}{20pt} %verhindert das herrausragen von Wörtern übers Zeilenende
\renewcommand{\familydefault}{\sfdefault}
\usepackage[table]{xcolor}
\usepackage{datatool}

\DTLsetseparator{;}
\DTLloaddb{Orga}{Orga_test.csv}

\begin{document}

\DTLforeach{Orga}{
  \Mittwoch=Mittwoch,\Donnerstag=Donnerstag,\Freitag=Freitag,\Samstag=Samstag,\Sonntag=Sonntag}{
\renewcommand{\arraystretch}{4}
\begin{table}[h!]
\begin{tabular}{|p{2cm}|p{6cm}|}
\hline
Mittwoch & \Mittwoch \\\hline
Donnerstag & \Donnerstag \\\hline
Freitag & \Freitag \\\hline
Samstag & \Samstag \\\hline
Sonntag & \Sonntag \\\hline
\end{tabular}
\end{table}
\renewcommand{\arraystretch}{1}
}
\end{document}

这仅创建最后一页,即表格。

这是我使用的 csv(显然没有名称):

Mittwoch;Donnerstag;Freitag;Samstag;Sonntag
;;18:30 – 20:00: Verantwortlicher Fachvortrag;;9:30 – 12:30: Verantwortlicher Workshops
Aufgabe2
;16:00 – 18:00: Verantwortlicher Anfangsplenum;07:00 – 14:00: Verantwortlicher E;9:00 – 12:00: Verantwortlicher Wanderung
13:00 – 14:30: Verantwortlicher Zwischenplenum;12:00 – 14:30: Verantwortlicher Endplenum
Aufgabe2
;13:00 – 16:00: Verantwortlicher Hostel;14:00 – 18:30: Verantwortlicher Workshops;;8:00 – 10:00: Verantwortlicher Hostel
Aufgabe2
;;;ab 19:30: Verantwortliche Kochen;Spätestens 21:00: Schnaps
;19:00 – 20:00: Verantwortlicher Abendessen;14:00 – 19:00: Verantwortlicher B;9:00 – 12:00: Verantwortlicher Stadtführung;14:30 – 16:00: Verantwortlicher Lunchpakete
Aufgabe 2
;13:00 – 16:00: Verantwortlicher Fachschaft;ab 19:00: Verantwortlicher Grillen;9:00 – 12:00: Verantwortlicher Wanderung
14:00 – 15:30: Verantwortlicher Mitgliederversammlung;Aufgabe
;;ab 20:30: Verantwortlicher Spieleabend;9:00 – 12:00: Verantwortlicher Stadtführung
Ab 20:30: Verantwortlicher H;Aufgabe
;ab 20:00: Verantwortlicher Kneipentour;;;16:00 – 19:00: Verantwortlicher Putzen
Aufgabe

这是我在 LibreOffice 中创建的样子 在此处输入图片描述

答案1

欢迎来到 TeX.SE!恐怕您的 CSV 文件很乱,这就是导致这里大多数问题的原因。您必须检查 CSV 文件的每个物理行是否包含适当数量的字段:此处为 5,因此文件的每个物理行必须包含四个分号 ( ;) 分隔符。您提供的文件中肯定不是这种情况,这会导致datatool输出显示为 NULL 的列。

再加上你的数据文件不是最小的我花了整整 30 分钟,只为了猜测每行和单元格的开始和结束位置。我不得不插入\\一些单元格,因为你想在这些单元格内换行,但你的 CSV 文件有一个物理换行符在这些地方,这会导致新的数据行的开始,从而完全搞乱了列(在物理换行符之后,datatoolCSV 解析器回到第 1 列:这不是单元格的延续!)。

现在,\\我在 CSV 数据中添加的这些命令应该会方便您在输入数据时使用,但它们要求我教导tabular不能\\被解释为标记行的结束。这就是我在标题中为每列添加tabular的目的。有了这个,LaTeX 就会理解等同于:在当前段落中开始新行的命令。因此,我们使用来完成表格的一行,因为之后意味着其他东西。>{\let\\=\newline}tabular\\\newline\tabularnewline\\\let\\=\newline

请包含简单得多下次使用类似下面的方法:

\begin{filecontents*}{test_file.csv}
a1;b1;c1;d1;e1
a2;b2;c2;d2;e2
a3;b3;c3;d3;e3
\end{filecontents*}

这让事情对每个人来说都变得更容易,并且更清楚地展示问题。

最好将 移到环境\renewcommand{\arraystretch}{4}内部table,就在tabular开始之前。这样,环境结束\arraystretch后, 的先前定义就会自动恢复table。事实上,你甚至不需要table这样的文档。只需在每个 之后使用\newpage或,这就足够了,因为环境之外没有文本(用于制作\clearpagetabulartabulartable浮点数,但这里不需要浮动任何东西)。

我使用了\DTLforeach*而不是\DTLforeach。前者比后者更快;\DTLforeach仅当您使用 中的命令datatool修改内存中的表数据时才使用。在这里,一旦读取了数据,它就会被插入到文档中。底层数据不会被修改,因此\DTLforeach*是首选。

结果如下(我删除了示例中未使用的包:它也不是最小的……):

\begin{filecontents*}{Orga_test.csv}
Mittwoch;Donnerstag;Freitag;Samstag;Sonntag
;;18:30 – 20:00: Verantwortlicher Fachvortrag;;9:30 – 12:30: Verantwortlicher Workshops\\ Aufgabe2
;16:00 – 18:00: Verantwortlicher Anfangsplenum;07:00 – 14:00: Verantwortlicher E;9:00 – 12:00: Verantwortlicher Wanderung\\ 13:00 – 14:30: Verantwortlicher Zwischenplenum;12:00 – 14:30: Verantwortlicher Endplenum\\ Aufgabe2
;13:00 – 16:00: Verantwortlicher Hostel;14:00 – 18:30: Verantwortlicher Workshops;;8:00 – 10:00: Verantwortlicher Hostel\\ Aufgabe2
;;;ab 19:30: Verantwortliche Kochen;Spätestens 21:00: Schnaps
;19:00 – 20:00: Verantwortlicher Abendessen;14:00 – 19:00: Verantwortlicher B;9:00 – 12:00: Verantwortlicher Stadtführung;14:30 – 16:00: Verantwortlicher Lunchpakete\\ Aufgabe 2
13:00 – 16:00: Verantwortlicher Fachschaft;ab 19:00: Verantwortlicher Grillen;9:00 – 12:00: Verantwortlicher Wanderung;14:00 – 15:30: Verantwortlicher Mitgliederversammlung;Aufgabe
;;ab 20:30: Verantwortlicher Spieleabend;9:00 – 12:00: Verantwortlicher Stadtführung\\ Ab 20:30: Verantwortlicher H;Aufgabe
;ab 20:00: Verantwortlicher Kneipentour;;;16:00 – 19:00: Verantwortlicher Putzen\\ Aufgabe
\end{filecontents*}

\documentclass[parskip,twoside,fontsize=9pt]{scrartcl}
\usepackage{fontspec}
\usepackage[german]{babel}
\usepackage{lmodern}
\usepackage[a6paper, left=8.5mm, right=8.5mm, top=2.26cm, bottom=8.5mm,
            headheight=2.26cm, headsep=0cm]{geometry}
\usepackage{array}

\tolerance=2000
\setlength{\emergencystretch}{20pt}
\renewcommand{\familydefault}{\sfdefault}

\usepackage{datatool}
\DTLsetseparator{;}
\DTLloaddb{Orga}{Orga_test.csv}

\begin{document}

\renewcommand{\arraystretch}{4}

\begin{center}
  \DTLforeach*{Orga}{%
    \Mittwoch=Mittwoch,\Donnerstag=Donnerstag,\Freitag=Freitag,%
    \Samstag=Samstag,\Sonntag=Sonntag}{%
    \noindent
    \begin{tabular}{|>{\let\\=\newline}p{1.6cm}|>{\let\\=\newline}p{6cm}|}
      \hline
      Mittwoch   & \Mittwoch   \tabularnewline \hline
      Donnerstag & \Donnerstag \tabularnewline \hline
      Freitag    & \Freitag    \tabularnewline \hline
      Samstag    & \Samstag    \tabularnewline \hline
      Sonntag    & \Sonntag    \tabularnewline \hline
    \end{tabular}
    \newpage
  }
\end{center}

\end{document}

所有页面

相关内容