根据价格表自动报价

根据价格表自动报价

我得到一份非常满意的价格表,现在想将其与我的 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}

不过,您的回答更加自动化。

(注意:如果您的文本中有&符号,请务必用符号替换它们\&——我花了很长时间才搞清楚)

相关内容