salida - Lectura de archivos xlsx con Python
openpyxl python (7)
Leí el año pasado que xlrd se estaba actualizando para poder leer archivos xlsx (Excel 2007, 2010). ¿Hay alguna noticia sobre este desarrollo o el uso de otras utilidades de Python?
Soporte para leer datos básicos (open_workbook (..., formatting_info = False)) de los archivos Excel 2007 .xlsx y .xlsm está en prueba alfa en este momento. Ver publicaciones anteriores en este grupo (busque "excel 2007 xlsx").
Desde el foro Con respecto al soporte xlrd para sobresalir
¡Sí, gracias por la gran subrutina!
Lo he actualizado para permitir que el hash de filas use los nombres de las columnas como índice en lugar de letras, si se especifica una fila de encabezado.
readXlsx( "mysheet.xlsx", sheet = 1, header = True )
def readXlsx( fileName, **args ):
import zipfile
from xml.etree.ElementTree import iterparse
if "sheet" in args:
sheet=args["sheet"]
else:
sheet=1
if "header" in args:
isHeader=args["header"]
else:
isHeader=False
rows = []
row = {}
header = {}
z = zipfile.ZipFile( fileName )
# Get shared strings
strings = [ el.text for e, el
in iterparse( z.open( ''xl/sharedStrings.xml'' ) )
if el.tag.endswith( ''}t'' )
]
value = ''''
# Open specified worksheet
for e, el in iterparse( z.open( ''xl/worksheets/sheet%d.xml''%( sheet ) ) ):
# get value or index to shared strings
if el.tag.endswith( ''}v'' ): # <v>84</v>
value = el.text
if el.tag.endswith( ''}c'' ): # <c r="A3" t="s"><v>84</v></c>
# If value is a shared string, use value as an index
if el.attrib.get( ''t'' ) == ''s'':
value = strings[int( value )]
# split the row/col information so that the row leter(s) can be separate
letter = el.attrib[''r''] # AZ22
while letter[-1].isdigit():
letter = letter[:-1]
# if it is the first row, then create a header hash for the names
# that COULD be used
if rows ==[]:
header[letter]=value
else:
if value != '''':
# if there is a header row, use the first row''s names as the row hash index
if isHeader == True and letter in header:
row[header[letter]] = value
else:
row[letter] = value
value = ''''
if el.tag.endswith(''}row''):
rows.append(row)
row = {}
z.close()
return rows
Aquí hay una implementación muy difícil usando solo la biblioteca estándar.
def xlsx(fname):
import zipfile
from xml.etree.ElementTree import iterparse
z = zipfile.ZipFile(fname)
strings = [el.text for e, el in iterparse(z.open(''xl/sharedStrings.xml'')) if el.tag.endswith(''}t'')]
rows = []
row = {}
value = ''''
for e, el in iterparse(z.open(''xl/worksheets/sheet1.xml'')):
if el.tag.endswith(''}v''): # <v>84</v>
value = el.text
if el.tag.endswith(''}c''): # <c r="A3" t="s"><v>84</v></c>
if el.attrib.get(''t'') == ''s'':
value = strings[int(value)]
letter = el.attrib[''r''] # AZ22
while letter[-1].isdigit():
letter = letter[:-1]
row[letter] = value
value = ''''
if el.tag.endswith(''}row''):
rows.append(row)
row = {}
return rows
Eric Gazoni ha escrito openpyxl que lee / escribe archivos xlsx Más detalles disponibles de su blog y el repositorio de códigos para cualquier codificador de Python que quiera probarlo
Leer archivos XLSX es bastante simple, en realidad.
Son archivos ZIP con ciertos documentos XML con nombres fijos.
Puede, sin demasiados códigos, abrir el archivo ZIP, analizar los documentos XML relevantes y procesar los bits de datos relevantes.
Aquí hay algunos consejos: http://slott-softwarearchitect.blogspot.com/2010/10/xlsm-and-xlsx-files-finally-reaching.html
Un poco tarde para la fiesta, pero xlrd
ahora es compatible nativamente con xlsx
. pip install xlrd --upgrade
de 0.6.0
a 0.8.0
usando pip install xlrd --upgrade
en el símbolo del sistema ( WindowsKey + R luego cmd
) y ahora lee xlsx
sin ningún problema.
import openpyxl as px
import numpy as np
W = px.load_workbook(''filename.xlsx'', use_iterators = True)
p = W.get_sheet_by_name(name = ''Sheet1'')
a=[]
for row in p.iter_rows():
for k in row:
a.append(k.internal_value)
# convert list a to matrix (for example 5*6)
aa= np.resize(a, [5, 6])
# save matrix aa as xlsx file
WW=px.Workbook()
pp=WW.get_active_sheet()
pp.title=''NEW_DATA''
f={''A'':0,''B'':1,''C'':2,''D'':3,''E'':4,''F'':5}
#insert values in six columns
for (i,j) in f.items():
for k in np.arange(1,len(aa)+1):
pp.cell(''%s%d''%(i,k)).value=aa[k-1][j]
WW.save(''newfilname.xlsx'')