Como procurar o valor de uma célula de um arquivo Excel?

Como procurar o valor de uma célula de um arquivo Excel?

Suponha que eu tenha um arquivo de planilha Excel data.xlsxcujo conteúdo é

        A             B
1  Third Parameter    7
2  First Parameter    5
3  Second Parameter   3

e gostaria de procurar o valor na coluna B usando o texto correspondente na coluna A.

Em outras palavras, preciso ter um comando Latex como, por exemplo, \getValue{<macro name to save the value in>}{<Search word>}{<Excel file name>}. Assim, por exemplo, \getValue{\rdPar}{Third Parameter}{data.xlsx}armazenarei o valor de 7in \rdParpara ser usado posteriormente em meu documento latex.

PS Talvez,essa questãoé útil, mas não sei como editar as respostas de acordo com minha necessidade.

Responder1

Supondo que você possa usar .csvem vez de .xls(x), existem diversas ferramentas para manipular arquivos CSV, por exemplo csvsimple.

Porém, se você quiser reinventar algumas rodas: você pode usar \ReadCSVpara ler o .csvarquivo em uma estrutura de valor-chave e, em seguida, \getValuebuscar esses valores quando necessário. A sintaxe de \ReadCSVé:

\ReadCSV [*] {<label>} [<name>,<value>] {<file>}

\ReadCSVirá ler o CSV <file>e pegar as colunas <name>e <value>( <name>e <value>são o número das colunas; os padrões são <name>=1e <value>=2) e salvá-las em <label>para mais tarde. Se o opcional *for usado, o arquivo será lido como uma string.

Depois que o arquivo for lido, você pode buscar os valores salvos usando \getValue:

\getValue <macro> {<name>} {<label>}

\getValueirá buscar a <value>coluna do respectivo <name>arquivo CSV lido em <label>e salvá-la no arquivo <macro>.

No seu exemplo (removendo linha e coluna do cabeçalho), você teria:

\ReadCSV{mydata}{test.csv}
\getValue\rdPar{Third Parameter}{mydata}
\rdPar % prints 7

Aqui está a expl3implementação (é minimalista: não há verificação de erros para entradas erradas, dados ausentes, etc.):

\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}

informação relacionada