是否可以访问电子表格(即 Excel 电子表格)中的数据并将其动态包含到 LaTeX 文档中?
我们每个月都需要编制大量的数据表,因此我们希望动态地进行这项工作,而不是一次性将数据转换为有用的格式。对于我们来说,能够访问同一 LaTeX 文档中不同电子表格的单个单元格非常重要。
已经从这里探索了 exceltex邮政,但是我们需要在windows系统上的解决方案。
答案1
这个答案可能早就不需要了,但对于任何想要这样做的未来用户来说都是如此。我使用 PerlTeX 从 .xlsx 文件中获取值,并找到了一个非常简单的解决方案。在 LaTeX 文档中必须调用的只是一个简单的\getValue{B7}
或任何您想要访问的单元格。
需要安装的东西;
- 草莓珍珠
- 电子表格::读取模块 (Perl)
- 电子表格::XLSX 模块 (Perl)
- PerlTex(您可以通过 MikTex 包管理器(或您使用的任何编译器)来执行此操作)
好的,完成后,您只需在 LaTeX 文档中添加该函数即可
\perlnewcommand{\getValue}[1]{
#use Text::Template;
use Spreadsheet::Read;
use Spreadsheet::XLSX;
$data = ReadData ("FileName.xlsx");
$Output = $data->[1]{$_[0]}; #Where the [1] is the sheet, not the input
return $Output
}
您需要使用 perltex 编译文档,但这并不难。我已经设置了一个简单的批处理文件,它可以帮我完成所有工作。
perltex --nosafe --latex=pdflatex filename.tex
无论如何,如果你们需要的话,这里是代码。如果您需要任何帮助,或者我没有提供正确的信息,请随时留言或评论。我只是想在我忘记为这个帮助过我的帖子做出贡献之前把这些都记下来。
答案2
受@Alex 的想法启发的快速且不太脏的版本。
模板文档:
\documentclass\{文章\} \开始\{文档\} Book1.xlsx 中的单元格 B2 包含内容 {$workbook1B2}, 而 Book2.xlsx 中的单元格 A1 包含内容 {$workbook2A1}。 \结束\{文档\}
Perl 脚本(已测试适用于 Windows 的 Strawberry Perl,安装后文本::模板,电子表格::读取, 和电子表格::XLSX来自 CPAN 的模块):
/usr/bin/perl 的 #! 使用严格; 使用警告; 使用电子表格::读取; 使用文本::模板; 我的$workbook1 = ReadData (“Book1.xlsx”); 我的 $workbook1B2 = $workbook1->[1]{B2}; 我的$workbook2 = ReadData (“Book2.xlsx”); 我的 $workbook2A1 = $workbook2->[1]{A1}; 我的 $template = Text::Template->new(SOURCE => 'form.tmpl') 或死亡“无法构建模板:$Text::Template::ERROR”; 我的%vars =(workbook1B2 => $ workbook1B2, 工作簿2A1 => $工作簿2A1, (英文): 我的 $result = $template->fill_in(HASH => \%vars); 如果(定义 $result){ 打印 $result } else { die "无法填写模板:$Text::Template::ERROR" }
两个电子表格book1.xlsx和book2.xlsx的内容分别为:
结果:
C:\Users\renfro\Desktop>perl excel.pl \documentclass{文章} \开始{文档} Book1.xlsx 中的单元格 B2 包含内容 3, 而 Book2.xlsx 中的 A1 单元格包含 A 列内容。 \结束{文档}
答案3
答案4
此答案基于我的回答逐项读取数据文件,只是逻辑被放进了readarray
包中。
修改后的答案
修订后的readarray
软件包提供了比下面原始答案中显示的更自然的语法。此外,它允许用户指定的数据分隔符。
\documentclass{article}
\usepackage{readarray,filecontents}
\begin{filecontents*}{dataA.txt}
.15, 12, 13, 14
.20, 22, 23, 24
.25, 45.6, 33, Ending
\end{filecontents*}
\def\dataB{%
B.15 B12 B13 B14
B.20 B22 B23 B24
B.25 B32 B33 BEnding
}
\begin{document}
%
% This says to read the variable \dataA, stick it into an "array"
% called arA with a 4-column width
\readarraysepchar{,}
\readdef{dataA.txt}{\dataA}
\readarray\dataA\arA[-,\ncols]
%
\readarraysepchar{ }
\readarray\dataB\arB[-,4]
%
\noindent
The data in the 3,2 position of the dataA file is \arA[3,2]\\
The data in the 3,4 position of dataB is \arB[3,4]
\end{document}
原始答案(基于已弃用的语法)
它有一些限制,比如使用空格作为项目分隔符(我希望在将来的版本中会更改),但根据数据的结构,它可能就足够了。重要的命令是readdef{file}{token}
将文件的内容放入\def
,\readArrayij{token}{arrayname}{width}
将标记的内容读入数组,以及\Arrayij{arrayname}{row}{column}
重新生成数组的数据条目(进行错误检查)。
如果将 Excel 电子表格保存为文本文件,并且数据条目没有内部空格,则这种方法就足够了。
\documentclass{article}
\usepackage{readarray,filecontents}
\begin{document}
%
\begin{filecontents*}{dataA.txt}
.15 12 13 14
.20 22 23 24
.25 45.6 33 Ending
\end{filecontents*}
\readdef{dataA.txt}{\dataA}
\def\dataB{%
B.15 B12 B13 B14
B.20 B22 B23 B24
B.25 B32 B33 BEnding
}
%
% This says to read the variable \dataA, stick it into an "array"
% called arA with a 4-column width
\readArrayij{\dataA}{arA}{4}
\readArrayij{\dataB}{arB}{4}
\noindent
The data in the 3,2 position of the dataA file is \Arrayij{arA}{3}{2}\\
The data in the 3,4 position of dataB is \Arrayij{arB}{3}{4}
\end{document}