python-xlsx-1
Ya con anterioridad escribí acerca de como como leer archivos xls, ahora toca hacer lo mismo, pero con archivos xlsx.

Al buscar en san google me he encontrado con una librería llamada OpenPyXL, así que veamos si funciona.

Tengo un archivo xls creando en Excel 2007 o 2010 no estoy seguro, pero veamos si logro abrirlo.

Lo primero es instalar el módulo openpyxl, incluso estándo en win7 estoy instalando el modulo via pip de la siguiente forma

C:\Python27\Scripts>pip install openpyxl
Downloading/unpacking openpyxl
  Downloading openpyxl-1.6.1.tar.gz (188kB): 188kB downloaded
  Running setup.py egg_info for package openpyxl

Installing collected packages: openpyxl
  Running setup.py install for openpyxl

Successfully installed openpyxl
Cleaning up...

En gnu/linux desde una terminal se tiene

$ sudo pip install openpyxl
[sudo] password for user:
Downloading/unpacking openpyxl
Downloading openpyxl-1.6.1.tar.gz (188Kb): 188Kb downloaded
Running setup.py egg_info for package openpyxl

Installing collected packages: openpyxl
Running setup.py install for openpyxl

Successfully installed openpyxl
Cleaning up...
$

Todos los ejemplos los voy a realizar desde ipython aprovechando que estoy en mi querido Linuxmint 14, así que manos
a las teclas…

Cargando el módulo openpyxl

Se realiza de la siguiente forma:

$ ipython
...
In [1]: from openpyxl import load_workbook
In [2]:

Abriendo el archivo xlsx y a las hojas de trabajo

Para realizar pruebas cuento con un archivo llamado test.xlsx que tiene varias hojas y datos y para tener acceso a el lo realizo con:

In [2]: wb = load_workbook('test.xlsx')
In [4]: print wb.get_sheet_names()
['INDEX', 'Data Dock', 'CANSAC', 'MX', 'BRA', 'APU-CH', ' ', 'TOP PSE', 'LATAM', 'TABLE', 'GRAPHICS', 'Sheet2 (2)',
 'Sheet4', 'Sheet5', 'Enablement Spiderweb', 'Sheet1 (2)', 'Sheet1 (3)', 'Sheet2', 'Sheet1']
In [5]:

De aquí en adelante, con la variable wb hará referencia al libro completo y como muestra se hace uso del método get_sheet_names() que regresa una lista de todas las hojas de trabajo.

Para acceder a una hoja de trabajo, lo más sencillo es acceder por nombre usando el metodo get_sheet_by_name()

In [8]: ws = wb.get_sheet_by_name('Data Stock')
In [9]: ws
Out[9]: <Worksheet "Data Dock">
In [10]:

Accediendo a una celda y a rango de celdas

Hay dos formas de acceder a una celda, usando la notación convencional de una hoja de cálculo, por ejemplo B5 o por medio de coordenadas (renglón, columna) ejemplo (2,5) para el caso de la celda B5.

Ahora con un caso práctico

In [1]: c1 = ws.cell('C5')
In [2]: c1.value
Out[2]: u'Ecuador'

In [3]: c1 = ws.cell(row=4, column=2)
In [4]: c1.value
Out[4]: u'Ecuador'

In [5]: 

Para acceder a un rango se usa el método range() que regresa una tupla de tuplas, donde cada tupla corresponde a un renglón, así que para tener acceso al valor de cada celda se requiere de dos ciclos, veamos

In [1]: for row in ws.range(‘A5:C10’):
for cell in row:
print cell.value,
print
….:
1 C2 Ecuador
1 C1 Peru
1 C1 Peru
1 C2 Peru
1 C1 Brasil
1 C1 Brasil

In [2]:

Maravilloso, se obtienen los datos de las columnas A, B, C desde la línea 5 a la 10.

Modificando valores

Como se vió en los ciclos for, la forma de obtener el valor de una celda es con la propiedad value, que también puede ser usada para asignar un nuevo valor, por ejemplo

In [1]: c1.value
Out[1]: u'Ecuador'

In [2]: c1.value = c1.value + '/Sur America'

In [3]: c1.value
Out[3]: u'Ecuador/Sur America'

In [4]: 

Guardando los cambios

Finalmente para guardar los cambios se usa el método save() de la siguiente forma

In [1]: wb.save('test2.xlsx')
In [2]: 

Y eso es todo, así de simple se puede tener acceso a archivo xlsx desde python, ya sea para leer su contenido o crear nuevos archivos, así qye ya no hay pretexto para entregar esos resultados en un formato que es mucho más sencillo de leer por mucha gente más y seguramente su contador o contadora se los agradeceran.

Salu2+

Anuncios