• Publicidad

Seleccionar hoja Excel mediante comando sheets()

¿Apenas comienzas con Perl? En este foro podrás encontrar y hacer preguntas básicas de Perl con respuestas aptas a tu nivel.

Seleccionar hoja Excel mediante comando sheets()

Notapor molguinv » 2017-02-01 08:00 @375

Estimados:

Estoy ocupando el módulo Spreadsheet::WriteExcel para leer un archivo plano (más de 70 000 registros) y generar n hojas de calculo según su cantidad de registros (por ejemplo 65 000 líneas para la versión de Excel antigua).

Pero no he podido optimizar para seleccionar la hoja por nombre que esta tiene y no por el comando sheets(3) el cual selecciona la hoja 3 de izquierda a derecha en forma predeterminada y como la creación de hojas es variable, la que necesito podría esta en otra ubicación y es por eso que necesito llamarla por el nombre...

Lo que necesito es no preguntar por la posición de la hoja si no por el nombre de esta.


Saludos y gracias.
molguinv
Perlero nuevo
Perlero nuevo
 
Mensajes: 4
Registrado: 2017-01-13 20:41 @903

Publicidad

Re: Seleccionar hoja Excel mediante comando sheets()

Notapor explorer » 2017-02-01 09:43 @447

Sacado del manual, y modificando un poco:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. for my $worksheet ($workbook->sheets()) {
  2.     my $nombre_hoja = $worksheet->get_name();
  3.  
  4.     if ($nombre_hoja eq 'MiHojita') {   # si es la hoja que me interesa...
  5.  
  6.         ...;                            # la modificamos
  7.  
  8.         last;                           # terminamos el bucle y salimos
  9.     }
  10. }
Coloreado en 0.002 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: 14476
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Seleccionar hoja Excel mediante comando sheets()

Notapor molguinv » 2017-02-02 15:17 @679

Estimados:
Muchas gracias por tu respuesta.

Esto es lo que tengo y funciona siempre que en el sheets() le dé la posición de la hoja (0, 1, 2, 3, 4, 5,... N)

Y en el código adjunto trato de pasarle la variable con la posición que la tengo en $paso (también la probé {$paso}) pero el comando no me deja leer y me da el error:

Can't call method "write" on an undefined value at GeneraExcel_01.pl_rsp line 387, <FH> line 1.

Saludos y gracias.


Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. while (<FH>) {
  2.     chomp;
  3.  
  4.     if ( $x >= 1 and $x <= 65000 )             #primer corte
  5.     {
  6.         $worksheet = $workbook->sheets($paso);
  7.  
  8.         @list = split /\;/, $_;
  9.         foreach my $c (@list) {
  10.  
  11.             if ( $y == 5 and ( $c ne "Monto Protesto" ) ) {
  12.                 $c =~ s/,/./;
  13.                 $worksheet->write_number( $x, $y++, $c, $decimalNormal );
  14.             }
  15.             else {
  16.                 $worksheet->write( $x, $y++, $c );
  17.             }
  18.         }
  19.     }                                          #if corte
  20.  
  21.     if ( $x >= 65001 and $x <= 130000 )        #segundo corte
  22.     {
  23.         #$paso++;
  24.         $worksheet = $workbook->sheets($paso);
  25.         $y         = 0;
  26.         @list      = split /\;/, $_;
  27.         foreach my $c (@list) {
  28.             if ( $y == 5 and ( $c ne "Monto Protesto" ) ) {
  29.                 $c =~ s/,/./;
  30.                 $worksheet->write_number( $x5, $y++, $c, $decimalNormal );
  31.  
  32.             }
  33.             else {
  34.                 $worksheet->write( $x5, $y++, $c );
  35.             }
  36.         }
  37.         $x5++;
  38.         $paso++;
  39.     }                                          #if corte 2
  40.     $x++;
  41.     $y = 0;
  42.     $paso++;
  43. }                                              # while
  44.  
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4
molguinv
Perlero nuevo
Perlero nuevo
 
Mensajes: 4
Registrado: 2017-01-13 20:41 @903

Re: Seleccionar hoja Excel mediante comando sheets()

Notapor explorer » 2017-02-02 17:16 @761

El mensaje dice que has intentado escribir en una hoja que no existe, porque a sheets() le has pasado un índice que no existe en el libro.

En el código, veo que incrementas $paso, pero ¿dónde lo pones a 0 otra vez? ¿Y si resulta que entre la hoja que está en el segundo lugar y el tercero no tiene '2' como índice? Es más... si la labor es repartir los 70 000 registros en hojas de 65 000 líneas, ¿las hojas YA están creadas o las tienes que crear en tu programa? Yo supongo que si lo que quieres es automatizarlo todo, querrás crear las hojas a medida que necesitas espacio.

En el primer mensaje comentas que quieres seleccionar las hojas por su nombre, y te di una solución, pero en el código del segundo mensaje no usas los nombres de las hojas para nada. Tendrás que decidir qué quieres hacer. Si solo se trata de repartir los registros por las hojas con un máximo de 65 000 registros, no necesitamos nombres, solo crear una nueva hoja antes de escribir en ella, cada vez que lleguemos a un registro que sea múltiplo de 65 000. Para esto último puedes usar el operador módulo (%) para saberlo, además de la variable especial $. que contendrá el número de líneas leídas del archivo.

Ahora bien, si las hojas ya están creadas, hay que seguir la recomendación del manual.
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my @hojas_actuales = $libro->sheets();                                  # listado de hojas
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

luego, cada elemento de @hojas_actuales es una hoja, del que podemos saber su nombre, y escribir en ella:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my $hoja = $hojas_actuales[$i];
  2. print $hoja->get_name(), "\n";                                          # imprime el nombre de la hoja
  3. $hoja->write_number( $x, $y++, $c, $decimalNormal );                    # escribimos en ella
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: 14476
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España


Volver a Básico

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 7 invitados