如何将多列表格从 Excel 转换为 Latex

如何将多列表格从 Excel 转换为 Latex

在此处输入图片描述

我的问题是不同的列有不同的宽度。每行都有多列,其宽度会发生变化。我如何拥有一个宏,允许我将此类表格从 Excel 输入到 Latex。提前致谢。

答案1

我将在这个答案中总结简单的解决方案,并按顺序编写一个 Matlab 集成。


  1. 在 Excel 中执行 LaTeX缓慢、困难、需要大量人工、容易出错、可以重复使用但每次都需要复制粘贴

这种方法只需在 Excel 中键入所需的部分即可构建 LaTeX。这是我的第一个想法。只有当您可以在完全相同的模板上复制和粘贴数据时,它才会有用。但您总是必须复制和粘贴……而且速度非常慢。

考虑以下电子表格

在此处输入图片描述

开始编写命令(我在创建它时犯了一些错误)。在分离的单元格上定义命令更加容易。

在此处输入图片描述

如果您有很多特殊情况,自动完成工具会有所帮助,但帮助不大。

在此处输入图片描述

每次合并都必须手动更正,并且正确编辑并不简单。

在此处输入图片描述

然后我注意到一个错误。\hline应该是\\ \hline然后\hline仅在第一行上方添加一个。

在此处输入图片描述

必须将结果复制到您的 LaTeX 编辑器中。


  1. 在线服务速度快,简单,手动操作适中,预览可避免错误,不可重复使用,每次都需要复制粘贴

A)excel2latex.com

它更快,只需将您的.xls.xlsx文件拖入其中即可。但您可能需要编辑额外的行,并且始终会插入行。

在此处输入图片描述

b)tablesgenerator.com

适合几张桌子的最佳选择,它具有编辑表格和生成 LaTeX 代码的工具。将文件转换为 的速度较慢.csv,但​​快速格式化工具确实值得。

在此处输入图片描述

语法已呈现并可进行编辑。

在此处输入图片描述

添加边框就像在任何所见即所得的软件中一样简单

在此处输入图片描述


  1. 我的 Matlab 集成解决方案准备工作完成后,速度快,简单,手动工作量少,错误可以快速纠正,可重复使用,无需每次复制粘贴

另一个重要的缺点是 Matlab 是一款商业软件,我不能说我的代码在 Octave 上能正常工作。其中一些使用了我在 Octave 中从未尝试过的语法。

该解决方案仍然不完美,我通常没有特殊情况可以合并使用\multicolumn{cols}{pos}{text}或更糟糕的\multirow{number of rows}{width}{text}情况。尽管我已经在我的 中编写了针对同一问题的解决方案Matlab to Word Lbrary,但我仍然没有在 中做出同样的解决方案Matlab to LaTeX library

我的 Matlab 集成解决方案已在另一个专门的答案中提出。

编辑:我决定只整合一个答案。


因此我们我们的 Matlab 集成解决方案

为了完成整个任务,我们需要我的三个库

  1. Matlab 到 LaTeX 库

管理 latex 语法并从 matlab 对象创建它。

  1. 文件操作库

加载 excel 文件并.tex直接从 Matlab 创建文件。

  1. 搜索和替换 WordSet 库

这个库是主库冈比亚(巴西葡萄牙语中的解决方法)冈比亚

它允许您在任意数量的文件中将一组给定的单词替换为另一组。它几乎NotePad++与使用其Find Files命令执行的操作相同。但在这里,您可以以编程方式执行此操作,甚至可以利用操作序列。


MWELaTeX确实非常简单

\documentclass{article}
\usepackage{multirow}
\begin{document}
    \input{input_tab_test}
\end{document}

关键概念是总是创建外部文件,这样您只需将其输入到主文件中即可。它允许您根据需要多次修改外部文件。

input_tab_test完成后应该是这样的

在此处输入图片描述


代码MATLAB如下,请看解释。

将 Excel 加载到 Matlab 中,'F5:K11'这对于避免多余的单元格很重要。第二个条目1是工作表的编号。

excel_filename = 'Pasta1.xlsx';
[data, txt, raw] = xlsread(excel_filename,1,'F5:K11');

以下循环将单元格的所有条目转换raw为字符串。我可能很快就会将其提升为一个函数。

% Analysis needed because all data must be string to the code
new_raw = cell(size(raw));
for i = 1:size(raw,1)
    for j = 1:size(raw,2)
        if isnumeric(raw{i,j})
            if isnan(raw{i,j})
                new_raw{i,j} = '';
            else
                new_raw{i,j} = sprintf('%g',raw{i,j});
            end
        else
            new_raw{i,j} = sprintf('%s',raw{i,j});
        end
    end
end

然后我们定义格式并调用第一个库函数。

format = '| p{1cm} | p{0.5 cm} | p{1.5cm} | p{2cm} | p{3cm} | p{1cm} |';
tb_l = fc_lib_latex_cell_to_tab_line(new_raw,'\hline');

对于重复的字母使用:

format = repmat('c',[1 6]);

tb_l 与在线小工具的结果完全相同。

在此处输入图片描述

现在,调用一个具有某些语法的函数来添加\begin{tabular}\end{tabular}以及任何必要的内容。Matlab 命令char是这里的关键。

S = fc_lib_latex_struct_strings_02_table;
l1 = sprintf(S.btab,format);
tab = char(l1,'\hline',tb_l,S.etab);

tab应该看起来像这样

在此处输入图片描述

最后,我们可以使用第二个库中的函数将其保存在磁盘中。

str_ext = '.tex'; file_name = 'input_tab_test';
fc_lib_save_file_extensao(file_name, str_ext, tab);

由于我目前没有合并列功能,我将使用第三个库。此步骤使整个过程效率降低,因为用户仍然必须手动定义替换。您可以像示例中那样稍微灵活一些w1

w1 = 'f';
input = {sprintf('%s &  &', w1),...
    'o &  &  &',...
    'z &',...
    '1 &'};
output = {sprintf('\\multicolumn{3}{|c|}{%s}',w1),...
        '\multicolumn{4}{|c|}{o}',...
        '\multicolumn{2}{|c|}{z}',...
        '\multicolumn{2}{|c|}{1}',...
    };

为了合并,我将创建一个具有行号的单元格和一个包含要合并的每个组的第一个和最后一个单元格的向量。

colMerge_p = {1, [3,4; 5,6];
             2, [1,3; 4,6];
             4, [1,6]};

但我仍然需要为 LaTeX 语法编写代码。

最后,我们调用函数搜索每一个input并替换相应的output

filter = {'input_tab_test'}; encod = 'ISO-8859-1'; flag_copy = 0;
fc_lib_file_search_replace_wordset(pwd,filter,input,output,flag_copy,encod);

该变量filter仅过滤感兴趣的文件。

在没有特殊情况时,这种方法效果更好,将来这应该不再是问题,最大的优点是可以以惊人的速度纠正错误,并重复使用具有相同模板的其他表格。而且,由于它保存的是外部文件,因此您只需重新编译主文件即可.tex

这是 LaTeX 中的结果

在此处输入图片描述

编辑2自动合并列的新功能

考虑以下电子表格

在此处输入图片描述

将其加载到 Matlab 中。命令的结果tb_l = fc_lib_latex_cell_to_tab_line(new_raw,'\hline');

在此处输入图片描述

要合并的新功能new_tb_l = fc_lib_latex_tab_line_colMerge(tb_l,colMerge);

colMerge = {2, [1,3], '|c|';
    3, [3,4], '|c|';
    4, [1,4], '|l|';
    6, [3,4; 5,6], '|c|';
    8, [1,6], '|c|';
    9, [1,5], '|r|';
    10, [2,3; 4,6], '|c|';
    11, [1,2; 4,5], '|c|'};

第一个条目是要合并的行,第二个条目是要合并的每个间隙的第一列和最后一列的矩阵,第三个条目是对齐。 LaTeX 语法是

在此处输入图片描述

最终结果是

在此处输入图片描述

不要忘记使用“\usepackage{inputenc}”来处理重音字符。

答案2

我需要这样做的时候,我会导出到 CSV,然后用一些 Perl 脚本处理结果(几行就可以完成大部分工作)。但是,需要对列标题和行进行修饰。

相关内容