假設我有一個 Excel 電子表格文件,data.xlsx
其內容為
A B
1 Third Parameter 7
2 First Parameter 5
3 Second Parameter 3
我想使用 A 列中的相應文字來尋找 B 列中的值。
換句話說,我需要一個 Latex 指令,例如\getValue{<macro name to save the value in>}{<Search word>}{<Excel file name>}
.例如,將儲存in\getValue{\rdPar}{Third Parameter}{data.xlsx}
的值以便稍後在我的乳膠文件中使用。7
\rdPar
PS也許,這個問題很有幫助,但我不知道如何根據我的需要編輯答案。
答案1
假設您可以使用.csv
代替.xls(x)
,則有多種用於操作 CSV 檔案的工具,例如csvsimple
。
不過,如果您想重新發明一些輪子:您可以使用\ReadCSV
在檔案中讀.csv
入鍵值結構,然後\getValue
在需要時取得這些值。的語法\ReadCSV
是:
\ReadCSV [*] {<label>} [<name>,<value>] {<file>}
\ReadCSV
將讀取 CSV <file>
,並取得列<name>
和<value>
(<name>
和<value>
是列數;預設值為<name>=1
和<value>=2
)並將它們保存在 下<label>
以供以後使用。如果使用可選選項*
,則檔案將作為字串讀取。
讀取檔案後,您可以使用以下命令來取得已儲存的值\getValue
:
\getValue <macro> {<name>} {<label>}
\getValue
將會取得在 下讀取的 CSV 檔案中<value>
對應的列,並將其儲存在.<name>
<label>
<macro>
在您的範例中(刪除標題行和列),您將擁有:
\ReadCSV{mydata}{test.csv}
\getValue\rdPar{Third Parameter}{mydata}
\rdPar % prints 7
這是expl3
實現(它是簡約的:沒有對錯誤輸入、丟失資料等進行錯誤檢查):
\begin{filecontents*}{test.csv}
Third Parameter , 7
First Parameter , 5
Second Parameter , 3
\end{filecontents*}
\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
% Step 1: reading the file
\ior_new:N \l__diaa_csv_ior
\bool_new:N \l__diaa_csv_str_bool
\NewDocumentCommand \ReadCSV { s m >{ \SplitArgument {1} {,} }O{ 1,2 } m }
{
\IfBooleanTF {#1}
{ \bool_set_true:N \l__diaa_csv_str_bool }
{ \bool_set_false:N \l__diaa_csv_str_bool }
\diaa_csv_read:nnnn {#2} #3 {#4}
}
\cs_new_protected:Npn \diaa_csv_read:nnnn #1 #2 #3 #4
{
\prop_new:c { g__diaa_csv_#1_prop }
\ior_open:NnTF \l__diaa_csv_ior {#4}
{ \__diaa_csv_read:cnn { g__diaa_csv_#1_prop } {#2} {#3} }
{ \msg_error:nnn { diaa } { file-not-found } {#4} }
}
\msg_new:nnn { diaa } { file-not-found }
{ File~`#1'~not~found. }
\cs_new_protected:Npn \__diaa_csv_read:Nnn #1 #2 #3
{
\bool_if:NTF \l__diaa_csv_str_bool
{ \ior_str_map_inline:Nn }
{ \ior_map_inline:Nn }
\l__diaa_csv_ior
{
\prop_put:Nxx #1
{ \clist_item:nn {##1} {#2} }
{ \clist_item:nn {##1} {#3} }
}
}
\cs_generate_variant:Nn \__diaa_csv_read:Nnn { c }
%
% Step 2: getting the values
\NewDocumentCommand \getValue { m m m }
{ \tl_set:Nx #1 { \diaa_csv_item:nn {#2} {#3} } }
\NewExpandableDocumentCommand \CSVItem { m m }
{ \diaa_csv_item:nn {#1} {#2} }
\cs_new:Npn \diaa_csv_item:nn #1 #2
{ \prop_item:cn { g__diaa_csv_#2_prop } {#1} }
\ExplSyntaxOff
\begin{document}
\ReadCSV{mydata}{test.csv}
\getValue\rdPar{Third Parameter}{mydata}
\rdPar
\edef\rdPar{\CSVItem{First Parameter}{mydata}}%
\rdPar
\end{document}