• Publicidad

Problemas al leer un archivo xlsx

¿Ya sabes lo que es una referencia? Has progresado, el nível básico es cosa del pasado y ahora estás listo para el siguiente nivel.

Problemas al leer un archivo xlsx

Notapor hugo11ab » 2012-07-16 19:22 @848

¿Qué tal? Solicitando nuevamente de su ayuda.

Tengo un archivo xlsx el cual lo quiero pasar a txt. Cuando leo el archivo xlsx obtengo el valor de las celdas que me interesan. El problema surge al leer celdas que contienen fórmulas o cantidades fijas. Obtengo un cero y lo que me interesa es extraer el valor de esa celda.

¿Cómo puedo hacer, para que en lugar de 0, me mande realmente el valor que contiene la fórmula?

Pongo el código donde obtengo el valor de las celdas:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl -w
  2. BEGIN {
  3.  
  4.     # Declaramos la ruta de ubicacion del modulo 'comun'.
  5.     @INC = ( @INC, "/var/www/cgi-bin/comun" );
  6. }
  7.  
  8. use reportes;
  9. use Spreadsheet::Read;
  10. use strict;
  11.  
  12. my %lab_importes;
  13. my @claves;
  14. my @abecedario = ( "S", "T", "U", "V", "W", "X", "Y", "Z", "AA", "AB", "AC", "AD", "R" )
  15.     ;                                  #estas son las columnas que contienen valores
  16. my $r = 8;                             #el archivo de excel siempre lo voy a leer a partir de la fila 8
  17.  
  18. my $renglon = 50;                      #es el numero maximo de renglones que voy a leer
  19.  
  20. my $ref = ReadData("extrae_datos.xlsx");    # Leer fichero Excel
  21. die "ERROR: El archivo de excel no fue encontrado" if not $ref;
  22.  
  23. for ( my $y = 1; $y <= $renglon; $y++ ) {
  24.     my $col = 3;
  25.     my $n1  = $ref->[1]{cell}[$col][$r];
  26.     $col++;                            # empiezo leyendo la c8
  27.     my $n2 = $ref->[1]{cell}[$col][$r];
  28.     $col++;
  29.     my $n3 = $ref->[1]{cell}[$col][$r];
  30.     $col++;
  31.     my $n4 = $ref->[1]{cell}[$col][$r];
  32.     $col++;
  33.     my $n5 = $ref->[1]{cell}[$col][$r];
  34.     $col++;
  35.     my $n6 = $ref->[1]{cell}[$col][$r];
  36.     $col++;
  37.     my $n7 = $ref->[1]{cell}[$col][$r];
  38.  
  39.     my $clave = $n1 . '|' . $n2 . '|' . $n3 . '|' . $n4 . '|' . $n5 . '|' . $n6 . '|' . $n7; #formo la clave del renglon
  40.  
  41.     for ( my $mes = 1; $mes <= 13; $mes++ ) {
  42.         foreach my $columna (@abecedario) {
  43.             $lab_importes{ $mes . $y }
  44.                 = $ref->[1]{ $columna
  45.                     . $r
  46.                 };                     #es en esta parte donde leo las celdas que contienen formulas
  47.                                        #y en vez de darme el valor de la celda, siempre me da un 0
  48.         }
  49.     }
  50.     push( @claves, "$clave" );
  51.     $r++;
  52. }
  53. unshift @claves, 0;
  54.  
  55. #genero el documento plano
  56. my $archivo = "PLANO_PLANTILLA_111.txt";
  57. open( ARCHIVO, "> $archivo" ) || die "lo siento, no puedo crear $archivo.txt\n";
  58.  
  59. for ( my $mes = 1; $mes <= 13; $mes++ ) {
  60.     for ( my $y = 1; $y <= $renglon; $y++ ) {
  61.         my $linea
  62.             = $claves[$y] . '|' . 'M' . '|'
  63.             . $mes . '|'
  64.             . $lab_importes{ $mes
  65.                 . $y
  66.             };       #cuando imprimo los valores de $lab_importes{$mes.$y}
  67.                      #siempre me arroja 0 y no el valor que contiene la celda.
  68.         print ARCHIVO "$linea \n";
  69.     }
  70. }
  71.  
  72. close(ARCHIVO);
Coloreado en 0.004 segundos, usando GeSHi 1.0.8.4

¿Qué me hace falta para que pueda imprimir los valores correctos?
hugo11ab
Perlero nuevo
Perlero nuevo
 
Mensajes: 77
Registrado: 2006-07-22 23:24 @016

Publicidad

Re: Problemas al leer un archivo xlsx

Notapor explorer » 2012-07-16 20:30 @896

El problema está en la línea 44.

Lo dice el manual: «The cell hash entry contains unformatted data, while the hash entries with the traditional labels contain the formatted values (if applicable).»

Debes usar el hash 'cell', igual que has hecho en las líneas 25 a 37.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Problemas al leer un archivo xlsx

Notapor hugo11ab » 2012-07-16 20:58 @915

Gracias explorer, ya lo hice de la otra forma pero tampoco me almacena los valores.

my @columnas=(12,13,14,15,16,17,18,19,20,21,22,23,11);
my $r=8;

for (my $y = 1; $y <= $renglon; $y++) {
my $col=3;
my $n1 = $ref->[1]{cell}[$col][$r]; $col++; # Contenido de la C8, de otra forma
my $n2 = $ref->[1]{cell}[$col][$r]; $col++; # Contenido de la B5, de otra forma
my $n3 = $ref->[1]{cell}[$col][$r]; $col++; # Contenido de la B5, de otra forma
my $n4 = $ref->[1]{cell}[$col][$r]; $col++; # Contenido de la B5, de otra forma
my $n5 = $ref->[1]{cell}[$col][$r]; $col++; # Contenido de la B5, de otra forma
my $n6 = $ref->[1]{cell}[$col][$r]; $col++; # Contenido de la B5, de otra forma
my $n7 = $ref->[1]{cell}[$col][$r]; # Contenido de la B5, de otra forma
#hasta aquí todo va bien.

my $clave = $n1.'|'.$n2.'|'.$n3.'|'.$n4.'|'.$n5.'|'.$n6.'|'.$n7;

my $mes=1;
foreach my $columna (@columnas) {
$lab_importes{$mes.$y}=$ref->[1]{cell}[$columna][$r]; #empiezo en la 12,8 (S8), en el archivo de Excel
#tengo una cantidad numérica, cuando leo el hash
#me aparece en blanco y en las siguientes
#columnas en 0, pero sigue sin mostrarme el
#valor de la celda.
$mes++;
}
push (@claves,"$clave");
$r++;
}

No sé qué pueda estar pasando.
hugo11ab
Perlero nuevo
Perlero nuevo
 
Mensajes: 77
Registrado: 2006-07-22 23:24 @016

Re: Problemas al leer un archivo xlsx

Notapor explorer » 2012-07-17 07:34 @357

Prueba a hacer un Dumper de $ref, a ver qué sale:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
use Data::Dumper:
print Dumper $ref->[1]{cell};
exit;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Problemas al leer un archivo xlsx

Notapor hugo11ab » 2012-07-17 07:56 @372

Ya hice el Dumper a $ref y en la mayoria de las columnas del archivo aparece la palabra undef, generalmente en donde van las fórmulas aparece undef.
hugo11ab
Perlero nuevo
Perlero nuevo
 
Mensajes: 77
Registrado: 2006-07-22 23:24 @016

Re: Problemas al leer un archivo xlsx

Notapor hugo11ab » 2012-07-17 09:56 @455

En las celdas donde van las fórmulas tienen formato de color, negrita, tipo de letra, ¿crees que ese sea el problema?
hugo11ab
Perlero nuevo
Perlero nuevo
 
Mensajes: 77
Registrado: 2006-07-22 23:24 @016

Re: Problemas al leer un archivo xlsx

Notapor explorer » 2012-07-17 11:05 @504

No, no lo creo. Los atributos quedan almacenados en el hash 'attr'.

El módulo no ha podido leer las fórmulas... me temo que no ha podido leer el formato xlsx.

Para asegurarte, haz un Dumper de todo $ref.

O, mejor aún, activa el depurado:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my $ref = ReadData("extrae_datos.xlsx", debug => 9);
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Saldrá toda la estructura fuera, además de los posibles errores.

¿Es una hoja de cálculo normal? En algunas ocasiones las páginas traen alguna macro que genera fórmulas y datos en el momento de la carga de la página, con lo que, en el archivo, realmente, no existen.

¿Obtendrías el mismo resultado si pasaras al archivo de xslx a ods u otro formato más estándar?

El módulo utiliza, internamente, el módulo Spreadsheet::XLSX. Quizás tengas que probarlo de forma directa.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Problemas al leer un archivo xlsx

Notapor hugo11ab » 2012-07-17 11:38 @526

El archivo en Excel lo genero con el módulo Spreadsheet::XLSX. Una vez que está generado el archivo lo mando a llamar para generar el txt y al momento de leer no reconoce las fórmulas.

¿Habrá algún otro módulo para convertir xlsx a txt?
hugo11ab
Perlero nuevo
Perlero nuevo
 
Mensajes: 77
Registrado: 2006-07-22 23:24 @016

Re: Problemas al leer un archivo xlsx

Notapor explorer » 2012-07-17 13:55 @621

hugo11ab escribiste:El archivo en Excel lo genero con el módulo Spreadsheet::XLSX. Una vez que está generado el archivo lo mando a llamar para generar el txt y al momento de leer no reconoce las fórmulas.
Entonces... si tu eres el que genera la hoja inicial, no necesitas de ningún módulo para sacar las fórmulas. Ya tienes la información original, así que puedes grabarla en texto directamente.

hugo11ab escribiste:¿Habrá algún otro módulo para convertir xlsx a txt?
Sí. Mira la parte final de la página de manual de Spreadsheet::Read.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Problemas al leer un archivo xlsx

Notapor hugo11ab » 2012-07-17 17:12 @758

Gracias, explorer, el problema de no mandarlo directamente al txt, es que no toda la información que se genera la tengo, entonces para no llenar ese archivo lo decidí generarlo aplicándole las fórmulas que contiene el mismo.

Pero creo que tienes razón en que el módulo Spreadsheet::Read no puede leer celdas con fórmulas, ese mismo archivo lo generé en xls y al parecer sí leyó todas las columnas.

Seguiré haciendo más pruebas.

Agradezco mucho tu valiosa ayuda.
hugo11ab
Perlero nuevo
Perlero nuevo
 
Mensajes: 77
Registrado: 2006-07-22 23:24 @016

Siguiente

Volver a Intermedio

¿Quién está conectado?

Usuarios navegando por este Foro: Google [Bot] y 8 invitados

cron