• Publicidad

El mejor módulo para escribir / editar hojas Excel

Aquí encontrarás todo lo que sea específicamente acerca de módulos de Perl. Ya sea que estás compartiendo tu módulo, un manual o simplemente tienes una duda acerca de alguno.

El mejor módulo para escribir / editar hojas Excel

Notapor MARKO » 2012-03-13 17:35 @774

¡¡¡¡¡Saludos, Perl en español!!!!!

Debo EDITAR hojas electrónicas de Excel en formato .xls. Mi idea es leer los archivos .xls con SpreadSheet::Read y luego escribir los archivos .xls con mis cambios ya realizados.

Y me preguntaba si el módulo SpreadSheet::WriteExcel es la mejor opción ¿¿¿¿¿o habrá alguno que me convenga más?????
Última edición por MARKO el 2012-07-06 15:57 @706, editado 1 vez en total
MARKO
Perlero nuevo
Perlero nuevo
 
Mensajes: 86
Registrado: 2012-01-10 22:34 @982

Publicidad

Re: El mejor módulo para escribir hojas Excel

Notapor explorer » 2012-03-13 17:57 @790

Teniendo en cuenta de que hablamos de formatos de archivo propietarios, no hay una seguridad del 100% de qué módulos "no oficiales de Micro$oft", en Perl, sean capaces de leer y escribir esos archivos.

Si los archivos no son complicados (no tienen gráficos, ni hojas dinámicas, solver, y complementos diversos), sí que se puede probar a hacerlo con Perl.

Si no... con Visual Basic lo podrás resolver. Eso sí, solo en Windows.

Spreadsheet::WriteExcel no ha cambiado desde el 2010. Las versiones modernas de Excel usan el nuevo formato xlsx, que puedes manejar con el módulo Excel::Writer::XLSX o Spreadsheet::WriteExcelXML.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14485
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: El mejor módulo para escribir hojas Excel

Notapor MARKO » 2012-07-05 17:43 @780

La escritura de archivos con Spreadsheet::WriteExcel, Excel::Writer::XLSX o Spreadsheet::WriteExcelXML es muy buena pero a la hora de EDITAR o SOBREESCRIBIR archivos de Excel me encontré con que Win32::OLE es la opción que más me sirvió.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. use Win32::OLE;
  2. use Win32::OLE qw(in with);
  3. use Win32::OLE::Const 'Microsoft Excel';
  4.  
  5. my $excel = Win32::OLE->new('Excel.Application'); #creamos un objeto Excel nuevo
  6. $excel -> {Visible} = 1;                        # 0 no se ve la ventana de Excel, 1 si se ve la ventana de Excel
  7. $excel    -> {DisplayAlerts} = 0;               #deshabilita Advertencias de "El archivo ya Existe" entre otras
  8. my $libro = $excel->Workbooks->Open('C:/directorio/archivo.xls'); # abrir fichero Excel existente
  9.  
  10.  
  11. foreach my $hoja(in $libro->Sheets){               # recorremos todas las hojas del libro
  12.   my $nombredehoja= $hoja->{Name};                 # encontramos el nombre de la hoja actual
  13.   my $valordecelda= $hoja->Range("A5")->{Value};   # obtenemos el valor de la celda A5, si entre las llaves ponemos Value obtenemos el valor sin formato de la celda, si ponemos Text obtenemos el texto que la celda deja ver y si ponemos Formula obtenemos la formula que está en la celda
  14.  $hoja->Range("AB35")->{Value}= $valoraingresar;   #asignamos un valor a la celda AB35 de la hoja actual
  15.  
  16.  my $maxfila = $hoja->UsedRange->Find({What=>"*",    #obteniendo la máxima fila utilizada de la hoja actual
  17.                SearchDirection=>xlPrevious,
  18.                SearchOrder=>xlByRows})->{Row};
  19.                                        
  20.  my $maxcolumna = $hoja->UsedRange->Find({What=>"*", #obteniendo la máxima columna utilizada de la hoja actual
  21.                   SearchDirection=>xlPrevious,
  22.                   SearchOrder=>xlByColumns})->{Column};
  23.  
  24. for (my $fila = 1;$fila <= $maxfila; $fila++){        #recorriendo todas las celdas de la hoja actual
  25.   $columna = 'A';
  26.   for (my $col = 1; $col<= $maxcolumna;$col++){
  27.         $celda = $hoja->Range($columna.$fila)->{Value}; #obteniendo el valor de la celda actual de la hoja actual
  28.         $columna ++;                                    #para las columnas usamos strings que pueden ser aumentadas con ++ pero no pueden ser disminuidas con --
  29.         $hoja->Range($columna.$fila)->{Value}= 5 MANZANAS; #asignando valor a la celda actual de la hoja actual
  30.   }
  31. }
  32.  
  33. }  #termina el foreach;
  34.  
  35. my $hojastotales = $libro->Worksheets->Count();            #total de hojas que tiene el libro
  36.  
  37. my $hojaactual=$libro->Worksheets(4);                      #mi hoja actual ahora es la número 4
  38.  
  39. $hojaactual=$libro->Worksheets("productos");            #mi hoja actual ahora es la que se llame productos si la hubiera
  40.  
  41. $hojaactual->Activate;                                   #se mueve hacia la hoja actual.
  42.  
Coloreado en 0.006 segundos, usando GeSHi 1.0.8.4


Saludos. Espero que les sirva tanto como me sirvió a mi.
Última edición por MARKO el 2012-10-30 10:28 @478, editado 4 veces en total
MARKO
Perlero nuevo
Perlero nuevo
 
Mensajes: 86
Registrado: 2012-01-10 22:34 @982

Re: El mejor módulo para escribir hojas Excel

Notapor explorer » 2012-07-05 18:11 @799

Ampliar la información, diciendo que Win32::OLE sólo funciona en Windows, bien de forma directa o sobre Cygwin.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14485
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: El mejor módulo para escribir / editar hojas Excel

Notapor MARKO » 2012-10-30 10:31 @480

Muy buena observación, explorer. De la misma puedo ampliar algo que creo que tiene importancia:

Ya que es nativo de Windows este módulo interactúa con Excel a través de métodos OLE por lo cual no mapea el documento completo en la memoria sino que le indica a Excel (hay que tener instalado Microsoft Excel) que realice las acciones deseadas en el archivo original. Gracias a esto el proceso se hace muy rápido aunque el archivo sea muy extenso.

Saludos
MARKO
Perlero nuevo
Perlero nuevo
 
Mensajes: 86
Registrado: 2012-01-10 22:34 @982

Re: El mejor módulo para escribir / editar hojas Excel

Notapor bvayap » 2019-09-05 17:37 @775

Buenas noches,

Estoy empezando a jugar con Perl y WIN32::OLE basándome en este hilo y necesitaría algo de ayuda, ya que tengo un error que no sé cómo resolver.

La idea es abrir un XLSX, leer valores existentes y luego introducir algunos nuevos.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. # use strict;
  3. use Win32::OLE;
  4. use Win32::OLE qw(in with);
  5. # use Win32::OLE::Const 'Microsoft Excel';
  6.  
  7. my $excel;
  8. my $libro;
  9. my $hoja;
  10.  
  11. # use existing instance if Excel is already running
  12. eval {$excel = Win32::OLE -> GetActiveObject('Excel.Application')};
  13. die "Excel not installed" if $@;
  14. unless (defined $excel) {
  15.     $excel = Win32::OLE -> new('Excel.Application', sub {$_[0] -> Quit;})
  16.             or die "Oops, cannot start Excel";
  17. }
  18.  
  19. # get a new workbook
  20. $libro = $excel -> Workbooks -> Open ('Prov.xlsx');
  21. my $i = 0;
  22. foreach $hoja(in $libro -> Sheets){
  23.         my $nombredehoja = $hoja -> {Name};
  24.         print $nombredehoja."\n";
  25.         $i++;
  26.         my $maxfila = $hoja -> UsedObjects -> Find({What => "*",
  27.         SearchDirection => xlPrevious,
  28.         SearchOrder => xlByRows})-> {Row};
  29.         print "La hoja $hoja tiene $maxfila filas.\n";
  30. }
  31. print "El libro tiene $i hojas.\n";
  32.  
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


El caso es que me da el error "Can't call method "Sheets" on an undefined value at \pru.pl line 22.".

Además, si descomento la línea 5 me da dos errores más:

"No type library matching "Microsoft Excel" found" at prueba.pl line 5"
"Win32::OLE(0.1712): GetOleTypeLibObject() Not a Win32::OLE::TypeLib object at C:/Strawberry/perl/vendor/lib/Win32/OLE/Const.pm line 49."


¿Alguna sugerencia? Muchas gracias de antemano por vuestra ayuda.
bvayap
Perlero nuevo
Perlero nuevo
 
Mensajes: 31
Registrado: 2013-05-31 02:42 @154

Re: El mejor módulo para escribir / editar hojas Excel

Notapor explorer » 2019-09-06 05:18 @262

Es extraño... el primer error dice que no encuentra el archivo Prov.xlsx en el directorio actual.

Prueba a indicar la ruta absoluta a ese archivo...

Pero el segundo error es aún más extraño. Ese error sale cuando el Microsoft Excel no está instalado...

Edito: aquí una persona que tenía ese problema con Word y encontró una manera, pero creo que ya está contemplado en tu código.

Edito: Es posible que esta línea funcione mejor:
use Win32::OLE::Const "Microsoft Office .* Object Library";
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14485
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: El mejor módulo para escribir / editar hojas Excel

Notapor bvayap » 2019-09-06 08:48 @408

Muchas gracias, explorer, por tu aportación. He reescrito el script a ver si consigo aprender y que sea más instructivo para alguien más...

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. # use strict;
  3. use Win32::OLE;
  4. use Win32::OLE qw(in with);
  5. use Win32::OLE::Const "Microsoft Office .* Object Library";
  6. $Win32::OLE::Warn = 3;
  7. system ("cls");
  8.  
  9. my $excel;
  10. my $libro;
  11. my @hojas;
  12. my @nombre_hojas;
  13.  
  14. # Open Excel application
  15. $excel = Win32::OLE -> GetActiveObject('Excel.Application') || Win32::OLE -> new('Excel.Application', 'Quit');
  16.  
  17. # Open Excel File
  18. $libro = $excel -> Workbooks -> Open ('C:\Perl\win32OLE\Prov.xlsx');
  19.  
  20. #Metemos las hojas en un Array. En $hojas[0] creo que guarda propiedades, no las hojas.
  21. @hojas = $libro -> {Worksheets};
  22. print "jaja $hojas[1].\n";
  23.  
  24. #Metemos los nombres de las hojas en un Array
  25. @nombre_hojas = map { $_->{'Name'} } (in $libro->{Worksheets});
  26. print $nombre_hojas[0]."\n";
  27. print $nombre_hojas[1]."\n";
  28.  
  29. # Get the last row
  30. my $maxfila = $hojas[1] -> UsedRange -> Find({What => "*", SearchDirection => xlPrevious, SearchOrder => xlByRows}) -> {Row};
  31. print "jeje $maxfila.\n";
  32.  
  33. # Salvamos y cerramos el libro
  34. $libro -> Save;
  35. $libro -> Close;
  36.  
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


Efectivamente, el tema del segundo error lo he resuelto como comentabas tú, cambiando la línea 5 por la actual.

He puesto también la ruta absoluta en la línea 18 para evitar el primer problema, pero ahora me encuentro con la siguiente salida:

jaja .
Prova_1
Prova_2
Can't call method "UsedRange" on an undefined value at C:\Perl\win32OLE\pru.pl line 30.


que me dice que no puedo llamar a "UsedRange" en un valor no definido. Y me da que es porque la línea 21 no está metiendo nada en $hojas[1], ya que como vemos en la salida, sólo me imprime el texto "jaja".

Creo que no estoy entendiendo bien qué es exactamente lo que metemos en @hojas con el "WoorkSheets". ¿Alguna sugerencia?

Gracias de antemano.
bvayap
Perlero nuevo
Perlero nuevo
 
Mensajes: 31
Registrado: 2013-05-31 02:42 @154

Re: El mejor módulo para escribir / editar hojas Excel

Notapor explorer » 2019-09-06 11:35 @524

Se te olvidó llamar al método "in":

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. @hojas = in $libro->{Worksheets};
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


El método devuelve un array de objetos, cada uno de ellos representa una hoja.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14485
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: El mejor módulo para escribir / editar hojas Excel

Notapor bvayap » 2019-09-06 18:15 @802

¡Gracias, explorer!

Solucionado esto, ahora tengo un problema cuando intento encontrar la última fila:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. # use strict;
  3. use Win32::OLE;
  4. use Win32::OLE qw(in with);
  5. use Win32::OLE::Const "Microsoft Office .* Object Library";
  6. $Win32::OLE::Warn = 3;
  7. #system ("cls");
  8.  
  9. my $excel;
  10. my $libro;
  11. my $hoja;
  12. my @hojas;
  13. my @nombre_hojas;
  14.  
  15. # Open Excel application
  16. $excel = Win32::OLE -> GetActiveObject('Excel.Application') || Win32::OLE -> new('Excel.Application', 'Quit');
  17.  
  18. # Open Excel File
  19. $libro = $excel -> Workbooks -> Open ('C:\Perl\win32OLE\Prov.xlsx');
  20.  
  21. #Metemos las hojas en un Array.
  22. @hojas =in $libro -> Worksheets;
  23. my $num_hojas = scalar @hojas; # Sacamos el número de hojas con la función "scalar"
  24. print "Tenemos $num_hojas hojas.\n";
  25.  
  26. $hoja = $libro -> Worksheets ('Prova_1');
  27. $hoja -> Activate (); # Elegimos la primera hoja como la activa
  28. print $hoja -> {Name}; # Sacamos el nombre de la hoja (aunque en este caso ya lo habíamos indicado)
  29.  
  30. # Otra forma de sacar los nombres de las hojas. Metemos los nombres de las hojas en un Array
  31. @nombre_hojas = map { $_-> {'Name'} } (in $libro -> {Worksheets});
  32.  
  33. # Get the last row
  34. my $maxfila = $hoja -> UsedRange -> Find({What => "*",
  35.         SearchDirection => xlPrevious,
  36.         SearchOrder => xlByRows}) -> {Row};
  37. print "jeje $maxfila.\n";
  38.  
  39. # Salvamos y cerramos el libro
  40. $libro -> Save;
  41. $libro -> Close;
  42.  
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4


por que me da un error Type Mismatch en línea 36

Tenemos 2 hojas.
Win32::OLE(0.1712) error 0x80020005: "Los tipos no coinciden"
in METHOD/PROPERTYGET "Find" argument "SearchDirection" at C:\Perl\win32OLE\pru.pl line 36.
Prova_1


Pero no he encontrado mucha información al respecto. Os cuento aquí si averiguo algo. ¡Gracias!
bvayap
Perlero nuevo
Perlero nuevo
 
Mensajes: 31
Registrado: 2013-05-31 02:42 @154

Siguiente

Volver a Módulos

¿Quién está conectado?

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