• Publicidad

Indicar configuración regional para Excel

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

Indicar configuración regional para Excel

Notapor audax » 2014-03-27 09:59 @458

Hola a todos.

Mi problemática es la siguiente:

Estoy usando Win32 para trabajar con xls. Lo tengo que usar debido a que estoy bajo Windows y tengo xls muy grandes.

Bueno, el tema es que abro el xlsx y lo guardo como txt tabulado. Bien hasta ahí. El problema es poder ver si puedo manejar a mi antojo la configuración regional, o sea, decirle que cuando guarde el txt tabulado que, por ejemplo, el símbolo decimal sea ',' (coma) y que el símbolo de miles sea '.' (punto) y así ponerla como yo quisiera, independiente de la configuración regional que tenga la máquina.

Para más detalle me refiero algo como hago en la línea $Excel->{DisplayAlerts} = 0; que deshabilito las alertas.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my $Excel = Win32::OLE->new('Excel.Application', 'Quit');
  2.         $Excel->{DisplayAlerts} = 0;
  3.         my $Book1 = $Excel->Workbooks->Open($Filename) || die("Could not open file!");
  4.         my $Sheet1 = $Book1->Worksheets($hoja);
  5.        
  6.         #### Save As .txt file
  7.         # $Sheet1->SaveAs({Filename =>$nameTXT, FileFormat => xlTextWindows});
  8.         $Sheet1->SaveAs({Filename =>$nameTXT, FileFormat => xlTextWindows});
  9.  
  10.         #### Close
  11.         $Book1->Close( { SaveChanges => 0 } );
  12.         $Excel->Quit();
  13.         ####
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4

Quedo atento a vuestros comentarios. y de antemano muchas gracias.

Saludos
Jaime
Última edición por explorer el 2014-03-27 11:34 @523, editado 2 veces en total
Razón: Poner marcasde código Perl
audax
Perlero nuevo
Perlero nuevo
 
Mensajes: 56
Registrado: 2013-06-03 13:16 @594

Publicidad

Re: Indicar configuración regional para Excel

Notapor explorer » 2014-03-27 12:34 @565

No es necesario usar Windows para procesar archivos muy grandes. Si solo quieres acceder al contenido de las celdas sin más, se puede hacer que Spreadsheet::ParseExcel, por ejemplo, no guarde ninguna información ni cree ninguna estructura interna (por lo que no consumirá memoria), y nos entregue los datos de las celdas directamente:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl -w
  2.  
  3. use strict;
  4. use Spreadsheet::ParseExcel;
  5.  
  6. my $parser = Spreadsheet::ParseExcel->new(
  7.     CellHandler => \&cell_handler,
  8.     NotSetCell  => 1
  9. );
  10.  
  11. my $workbook = $parser->parse('file.xls');
  12.  
  13. sub cell_handler {
  14.  
  15.     my $workbook    = $_[0];
  16.     my $sheet_index = $_[1];
  17.     my $row         = $_[2];
  18.     my $col         = $_[3];
  19.     my $cell        = $_[4];
  20.  
  21.     # Hacer algo útil con el valor formateado de la celda
  22.     print $cell->value(), "\n";
  23.  
  24. }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
(ejemplo extraído de la página de manual de Spreadsheet::ParseExcel) La opción CellHandler indica a Spreadsheet::ParseExcel que los contenidos de las hojas debe procesarlos antes con la función que le pasamos como argumento (cell_handler(), en este caso). Y la opción NotSetCell le indica que no queremos que guarde el valor de la celda en ningún sitio, que de eso ya nos encargamos nosotros (podemos guardarlo en un array de array, por ejemplo.

Spreadsheet::ParseExcel abrirá el archivo, recorrerá todas las hojas, todas las filas y columnas, y llamará a nuestra función por cada celda que contenga un valor.

De esta manera, puedes procesar documentos muy grandes, y no tener que depender de Windows.

Para el tema de la configuración regional, una forma de hacerlo es extraer los datos de las celdas de forma no formateada (usar unformatted() en lugar de value()). Ver la sección [url]Dates and Time in Excel[/url] en Spreadsheet::ParseExcel::Cell. Y a partir de ahí, lo formateas como quieras.

Es posible (pero yo no lo conozco) que se le pueda indicar a Excel a través de OLE/DDE en qué formato queremos los datos, pero eso yo no lo he visto hacer en ningún Excel. Tendrás que consultar la documentación de Excel en Micro$oft.

Y, finalmente... creo que te indiqué en otro mensaje anterior, que las últimas recomendaciones de RAE sobre la ortografía de los números sean: '.' como separador decimal, y un espacio para el separador de los grupos de millares (ortografía aprobada en diciembre de 2010).

Otra cosa es lo que diga el jefe en cómo quiere él que salgan los números. :)

Como último detalle que acabo de encontrar: hay una forma de hacerlo de forma más o menos automática, en Windows, que sería algo así:
  • a las personas que rellenan la hoja de cálculo, indicarles que deben asignarles estilos de celda cuyos nombres empiezan por '*', a las celdas que dependen de la configuración regional. Eso hace que los números y fechas salgan en pantalla ajustadas a la configuración regional del sistema operativo en ese momento, y no a la configuración regional del sistema en que se creó
  • antes de generar la salida, entrar en el panel de control de Windows, y cambiar la configuración regional a la que se desee
  • generar la salida
Aquí lo tienes más detallado. Puedes encontrar más información buscando por Excel regional settings change en cualquier buscador.
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: Indicar configuración regional para Excel

Notapor audax » 2014-03-27 13:50 @618

Gracias, explorer, siempre tan amable en darte el tiempo de responder.

Bueno, me faltaron algunos detalles que no conté; primero, los Excel son xlsx, y por ende no me funciona Spreadsheet::ParseExcel (como tu lo describiste está excelente pero para los xls, que no es mi caso :( ). Me debería funcionar Spreadsheet::XLSX pero esa es la que me ocupa mucha memoria. Intenté ocupar la misma estructura que tu indicaste (con CellHandler) pero me da unos errores.

Quizás por ahí está mi solución. ¿Para la librería de XLSX abra algo con CellHandler y NotSetCell que tu conozcas?

Bueno, como datos adicionales, los xlsx los genera un software automáticamente, el cual no tengo acceso a ese software, solo me envían los xlsx. Así que como veras estoy ultra limitado en hacer cambios. El único control que tengo es Perl, ¡je,je,je! Gracias, amigo.

Saludos,
Jaime.
audax
Perlero nuevo
Perlero nuevo
 
Mensajes: 56
Registrado: 2013-06-03 13:16 @594

Re: Indicar configuración regional para Excel

Notapor explorer » 2014-03-27 14:17 @637

Entonces estamos en la misma situación que antes... y para mí, la solución es la misma que te conté entonces: copiar el código de XLSX.pm, en lo referente a abrir, descomprimir (un xlsx es en realidad un zip) y procesar el xml que contiene la información que busco. El SimpleXlsx es un ejemplo de lo que se podría hacer.

Otra solución (indicar por DDE una configuración regional distinta para la exportación a texto) está fuera de mis conocimientos (e intereses, por razones obvias).

A ver si otra persona te da un mejor consejo...
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: No hay usuarios registrados visitando el Foro y 18 invitados