• Publicidad

Lectura de Excel

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

Lectura de Excel

Notapor keparodo » 2012-04-10 14:51 @660

Hola nuevamente...

Sigo leyendo archivos...
Hice una consulta hace algún tiempo, pero algo pasó, porque no encontré la pregunta y obvio... no hubo respuesta.

Ahora tengo un problema, estoy leyendo un archivo Excel (xlsx) y trae varias hojas... y debo generar un archivo txt con cada una de ellas, y utilizo el nombre de la hoja para generar el nombre del archivo. Mi problema es que una de ellas se llama "viña". Al intentar asignar el nombre a una variable me la deja en blanco.

Para probar hice lo mismo cambiando el nombre a "vina" y me generó el archivo bien.

Entonces el problema es la "ñ". No sé de que otra manera podría capturar ese nombre, no sé si hay alternativa...

¿Alguna ayuda?
Muchas gracias.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my $sheetindex = 0;
  2. my $converter  = Text::Iconv->new( "utf-8", "windows-1251" );
  3. my $excel      = Spreadsheet::XLSX->new( $file, $converter );
  4. my @sheets     = @{ $excel->{Worksheet} };
  5.  
  6. my $nHojas = @sheets;
  7.  
  8. for ( $i = 0; $i <= $nHojas; $i++ ) {
  9.     my $sheet = $sheets[$i];
  10.     my $text  = '';
  11.     my $hoja  = $sheet->{Name};
  12.     $new_file = 'hoja_' . $hoja . '.TXT';
  13.     print STDERR "\n\n hoja -->$i<-- ($hoja) \n";
  14.     $sheet->{MaxRow} ||= $sheet->{MinRow};
  15.     for my $row ( $sheet->{MinRow} .. $sheet->{MaxRow} ) {
  16.         $sheet->{MaxCol} ||= $sheet->{MinCol};
  17.         for my $col ( $sheet->{MinCol} .. $sheet->{MaxCol} ) {
  18.             my $cell = $sheet->{Cells}[$row][$col];
  19.             if ($cell) {
  20.  
  21.                 # print $cell->{Val};
  22.                 $text .= $cell->{Val};
  23.             }
  24.             $text .= "\t" if $col < $sheet->{MaxCol};
  25.         }
  26.         $text .= "\n";
  27.     }
  28.     if ( !open( RPT, ">$new_file" ) ) {
  29.         &escribe_log("          No se pudo crear archivo [$new_file]");
  30.         $retorno = 'error';
  31.     }
  32.     else {
  33.         print RPT $text;
  34.         $retorno = 'success';
  35.     }
  36.     ;                                  # while.
  37. }
Coloreado en 0.005 segundos, usando GeSHi 1.0.8.4
Última edición por explorer el 2012-04-10 15:19 @680, editado 1 vez en total
Razón: Formateado de código con Perltidy y poner marcas Perl
keparodo
Perlero nuevo
Perlero nuevo
 
Mensajes: 21
Registrado: 2011-12-14 17:17 @762

Publicidad

Re: Lectura de Excel

Notapor explorer » 2012-04-10 15:27 @686

Para buscar tus mensajes, te vale con entrar en tu Panel de Control del Usuario, y pulsar sobre Mostrar sus mensajes.

En cuanto a la pregunta, ¿en qué línea falla? ¿En la línea 11, qué devuelve $sheet->{Name}? ¿Nada?

Otro tema es la codificación. Según lo que pones, el archivo lo lees con un conversor de codificaciones, de utf-8 a windows-1251, así que debemos suponer que la hoja estará convertida a esa codificación. Pero, a la hora de crear el archivo, ¿en qué codificación está trabajando el sistema de archivos?

Además de con la 'ñ', seguro entonces que tendrás problemas con las palabras que contengan caracteres tildados (áéóíúüç...)
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: Lectura de Excel

Notapor keparodo » 2012-04-10 17:29 @770

Así es, en línea 11:

my $hoja = $sheet->{Name};

$hoja queda en blanco.

No supe de la codificación del Excel, sólo lo puse basado en un ejemplo. Funciona y no sé si podría no funcionar.

Me faltó esta línea referida al txt:

$text = Encode::encode('iso-8859-1', $text, 0) if utf8::is_utf8($text);
keparodo
Perlero nuevo
Perlero nuevo
 
Mensajes: 21
Registrado: 2011-12-14 17:17 @762

Re: Lectura de Excel

Notapor explorer » 2012-04-10 18:54 @829

Por lo que veo del código del módulo, aplica el conversor de códigos también a los nombres de las hojas...

¿No podrías abrir el fichero xlsx, localizar la línea que tiene el nombre de la hoja, y publicarla aquí?
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


Volver a Básico

¿Quién está conectado?

Usuarios navegando por este Foro: Bing [Bot] y 24 invitados

cron