¿Cómo buscar el valor de una celda de un archivo de Excel?

¿Cómo buscar el valor de una celda de un archivo de Excel?

Supongamos que tengo un archivo de hoja de cálculo de Excel data.xlsxcuyo contenido es

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

y me gustaría buscar el valor en la columna B usando el texto correspondiente en la columna A.

En otras palabras, necesito tener un comando de Latex como, por ejemplo, \getValue{<macro name to save the value in>}{<Search word>}{<Excel file name>}. Entonces, por ejemplo, \getValue{\rdPar}{Third Parameter}{data.xlsx}almacenará el valor de 7en\rdPar para usarlo más adelante en mi documento de látex.

PD: Quizás,esta preguntaes útil pero no sé cómo editar las respuestas según mis necesidades.

Respuesta1

Suponiendo que pueda utilizar .csven lugar de .xls(x), existen varias herramientas para manipular archivos CSV, por ejemplo csvsimple.

Sin embargo, si desea reinventar algunas ruedas: puede usar \ReadCSVpara leer el .csvarchivo en una estructura clave-valor y luego \getValuerecuperar esos valores cuando sea necesario. La sintaxis de \ReadCSVes:

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

\ReadCSVleerá el CSV <file>, tomará las columnas <name>y <value>( <name>y <value>es el número de columnas; los valores predeterminados son <name>=1y <value>=2) y las guardará en <label>para más adelante. Si se utiliza el opcional *, el archivo se lee como una cadena.

Una vez leído el archivo, puede recuperar los valores guardados usando \getValue:

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

\getValuebuscará la <value>columna correspondiente <name>en el archivo CSV leído en <label>y la guardará en el archivo <macro>.

En su ejemplo (eliminando la fila y columna del encabezado), tendría:

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

Aquí está la expl3implementación (es minimalista: no hay verificación de errores para entradas incorrectas, datos faltantes, 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}

información relacionada