使用Python读取xlsx文件
我去年读到xlrd被更新为能够读取xlsx文件(Excel 2007,2010 )。 有没有关于这个发展的消息,还是使用其他的Python工具?
Eric Gazoni写了openpyxl读/写xlsx文件更多详细信息可从他的博客和任何Python编码器的代码库想要尝试它
晚会有点晚,但xlrd
现在本机支持xlsx
。 我使用pip install xlrd --upgrade
从命令提示符( WindowsKey + R然后cmd
)从0.6.0
更新到0.8.0
,现在它读取xlsx
没有任何问题。
这是一个非常粗糙的实现,只使用标准库。
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'): # <cr="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
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')
实际上,读取XLSX文件非常简单。
它们是ZIP文件,包含固定名称的某些XML文档。
您可以 – 没有太多的代码 – 打开ZIP存档,parsing相关的XML文档,并处理相关的数据位。
这里有一些提示: http : //slott-softwarearchitect.blogspot.com/2010/10/xlsm-and-xlsx-files-finally-reaching.html
支持从Excel 2007 .xlsx和.xlsm文件读取基本数据(open_workbook(…,formatting_info = False))目前正在进行alphatesting。 查看以前的post(search“excel 2007 xlsx”)。
来自论坛关于xlrd对excel的支持
是的,谢谢你的伟大的子程序!
我已经更新它,以允许行散列使用列名作为索引而不是字母,如果指定了标题行。
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' ): # <cr="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