我得到一份非常满意的价格表,现在想将其与我的 Excel 文件结合起来。
我已将 Excel 文件更改为 CSV,其中 1 列用于报价,1 列用于可选附加项(如我的示例:客户订购了红苹果和梨,他不能订购青苹果,但我想提供订购哈密瓜的选项)
\documentclass[a4paper,12p]{article}
\usepackage[textwidth=450pt, textheight=680pt,top=3cm, left=2.5cm]{geometry} %margins
\usepackage{tabularx}
\newcommand\mce{\multicolumn{1}{c}{}}
\newcounter{RowNum}
\usepackage{siunitx}
\newcommand{\appleg} {6,225} %would like to import from excel sheet (and could probably automatically
\newcommand{\appler} {3,676} %put into tabular
\newcommand{\grape} {17,302}
\newcommand{\banana} {2,843}
\newcommand{\plum} {1,715}
\newcommand{\pear} {3,235}
\newcommand{\rockmelon} {1,941}
\begin{document}
\begin{tabular}{>{\stepcounter{RowNum}\theRowNum}r
>{\everypar{\hangindent0.7cm}}p{13cm}
>{\$}S[table-format=2.5,
table-space-text-pre = {\$\,},
output-decimal-marker={,},
table-column-width=2mm]}
& \textbf{Green Apples:} bla & \mce \\
\mce && \appleg \\
\mce\\
& \textbf{Red Apples:} bla & \mce \\
\mce && \appler\\
\mce\\
& \textbf{Grapes:} bla & \mce \\
\mce && \grape \\
\mce\\
& \textbf{Bananas} & \mce \\
\mce && \banana \\
\mce\\
& \textbf{Plums:} bla & \mce \\
\mce && \plum \\
\mce\\
& \textbf{Pears:} bla & \mce \\
\mce && \pear \\
\mce\\
& \textbf{Rockmelons:} bla & \mce \\
\mce && \rockmelon \\
\end{tabular}
\end{document}
我碰到这个问题和答案。我想按照@Richard Roberts 的建议做,所以下载了 Strawberry Üerl,也可以从 MiKTeX 安装 PerlTeX。
不幸的是,我不知道如何安装Spreadsheet::Read
模块(Perl)或Spreadsheet::XLSX
模块(Perl)。(我打开了“Perl(命令行)”应用程序并尝试插入Spreadsheet::Read module
,但出现以下错误The filename, directory name, or volume label syntax is incorrect.
:)
有人可以解释一下怎么做吗?(我非常熟悉 Excel,所以很乐意修改我的 Excel 表格以适应 LaTeX。)
我还想在@Richard Roberts 提供的代码中澄清一下:我需要在序言中指定文件名吗?或者我可以在文档中通过什么方式指定\getvalue[excel name]{B7}
?
另外,我还需要批处理文件方面的帮助:该选项是否应该出现在 TeXworks 的“Typeset”下?
答案1
正如承诺的那样,我想介绍我基于 Python/pandas 的方法。您需要安装 Python 发行版,我通常推荐 Anaconda(https://www.anaconda.com/distribution/#download-section),因为它已经带来了pandas
我们将用于读取 Excel 文件的模块。
首先让我们输入一些模板代码:
\newcommand{\appleg} {$$appleg$$} %would like to import from excel sheet (and could probably automatically
\newcommand{\appler} {$$appler$$} %put into tabular
\newcommand{\grape} {$$grape$$}
\newcommand{\banana} {$$banana$$}
\newcommand{\plum} {$$plum$$}
\newcommand{\pear} {$$pear$$}
\newcommand{\rockmelon} {$$rockmelon$$}
现在,我们将简单地用 Excel 中的值替换这些标记。我假设 Excel 如下所示:
代码中发生的情况如下:
- 我加载了 pandas 模块
- 我将 Excel 文件读入所谓的数据框
- 我打开 template.tex (带有 $$...$$ 代码的文件)
- 对于每个标记,我都会得到第 0 行。将数据类型更改为字符串,并将小数点替换为逗号(如果您调整 siunitx 代码,则可以跳过这一步)
- 再次写出文件
Python代码如下:
import pandas as pd
data = pd.read_excel('data.xlsx')
with open('template.tex') as template:
with open('finalfile.tex','wt') as outfile:
temp = template.read()
temp = temp.replace('$$appleg$$',str(data['appleg'][0]).replace('.', ','))
temp = temp.replace('$$appler$$',str(data['appler'][0]).replace('.', ','))
temp = temp.replace('$$grape$$',str(data['grape'][0]).replace('.', ','))
temp = temp.replace('$$banana$$',str(data['banana'][0]).replace('.', ','))
temp = temp.replace('$$plum$$',str(data['plum'][0]).replace('.', ','))
temp = temp.replace('$$pear$$',str(data['pear'][0]).replace('.', ','))
temp = temp.replace('$$rockmelon$$',str(data['rockmelon'][0]).replace('.', ','))
outfile.write(temp)
生成的 TeX 文件有
\newcommand{\appleg} {5,64}
\newcommand{\appler} {23,12}
\newcommand{\grape} {123,45}
\newcommand{\banana} {45,12}
\newcommand{\plum} {8765,54}
\newcommand{\pear} {2,15}
\newcommand{\rockmelon} {231,99}
请注意,这是此任务的快速而粗糙的解决方案。在 Python 和 pandas 中有很多更好的方法可以做到这一点。在这篇博文(德语)我使用了几个 Excel 表和一个模板引擎来创建捐赠收据。
您还可以使用 PythonTeX 从 LaTeX 运行 Python 代码,这非常复杂。
答案2
谢谢@Uwe Ziegenhagen。我再次查看了我的问题,发现 csvsimple 对我来说效果更好。我可以使用过滤器和特定列一次读取行(和特定单元格):
\csvreader[tabular= >{\stepcounter{RowNum}\theRowNum}r %
>{\everypar{\hangindent0.7cm}}p{13cm} b{1.3cm},
filter ifthen=\equal{\csvcolii}{1}] %filter certain rows
{\excel} %CSV source
{14=\dbo, 15=\deo, 12=\pricel,13=\pricer} %columns to look at
{& \textbf{\dbo} \deo & \mce \\ \mce && \$\, \hfill \ifthenelse{\equal{\pricel}{0}}{}{\pricel,}\pricer \\ \mce}
不过,您的回答更加自动化。
(注意:如果您的文本中有&
符号,请务必用符号替换它们\&
——我花了很长时间才搞清楚)