txt salida manejo leer importar con columnas archivos archivo python xls xlsx xlrd openpyxl

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




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.

xlrd


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'')