使用Python读取/解析Excel(xls)文件


Answers:


91

我强烈建议使用xlrd读取.xls文件。

voyager提到了COM自动化的使用。几年前自己做过此事,请注意做这是真正的PITA。需要警告的数量巨大,并且缺少文档并且令人讨厌。我遇到了许多奇怪的错误和陷阱,其中一些花费了许多小时才能弄清楚。

更新:对于较新的.xlsx文件,推荐用于读写的库似乎是openpyxl(感谢IkarPohorský)。


5
对于Excel 2007+文件(.xlsx),您可能会使用OpenPyXL
IkarPohorský15年

48

使用熊猫:

import pandas as pd

xls = pd.ExcelFile("yourfilename.xls")

sheetX = xls.parse(2) #2 is the sheet number

var1 = sheetX['ColumnName']

print(var1[1]) #1 is the row number...

1
熊猫正在使用xlrd进行阅读;您还需要将xlrd安装为依赖项
congusbongus

25

您可以选择其中任意一个http://www.python-excel.org/
我建议使用python xlrd库。

使用安装

pip install xlrd

导入使用

import xlrd

打开工作簿

workbook = xlrd.open_workbook('your_file_name.xlsx')

按名称打开工作表

worksheet = workbook.sheet_by_name('Name of the Sheet')

按索引打开工作表

worksheet = workbook.sheet_by_index(0)

读取单元格值

worksheet.cell(0, 0).value    

“读取单元格值”不起作用...它引发TypeError:'Sheet'对象不可调用。所有其余的一切都很棒。
Newbielp

13

我认为熊猫是最好的选择。已经有一个答案在这里使用与熊猫ExcelFile的功能,但它并没有为我正常工作。从这里我发现read_excel可以正常工作的函数:

import pandas as pd
dfs = pd.read_excel("your_file_name.xlsx", sheet_name="your_sheet_name")
print(dfs.head(10))

PS您需要为xlrd安装read_excel正常工作

更新21-03-2020:正如您可能在此处看到的那样,xlrd引擎存在问题,它将不推荐使用。该openpyxl是最好的替代品。因此,作为描述在这里,规范的语法应为:

dfs = pd.read_excel("your_file_name.xlsx", sheet_name="your_sheet_name", engine="openpyxl")

AttributeError:“ dict”对象没有属性“ head”
lopezdp,

4

对于xlsx,我喜欢先前发布的解决方案https://web.archive.org/web/20180216070531//programming/4371163/reading-xlsx-files-using-python。我仅使用标准库中的模块。

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'):  # Example: <v>84</v>                            
            value = el.text
        if el.tag.endswith('}c'):  # Example: <c r="A3" t="s"><v>84</v></c>                                 
            if el.attrib.get('t') == 's':
                value = strings[int(value)]
            letter = el.attrib['r']  # Example: AZ22                         
            while letter[-1].isdigit():
                letter = letter[:-1]
            row[letter] = value
            value = ''
        if el.tag.endswith('}row'):
            rows.append(row)
            row = {}
    return rows

添加的改进包括按工作表名称获取内容,使用re获取列以及检查是否使用了共享字符串。

def xlsx(fname,sheet):
    import zipfile
    from xml.etree.ElementTree import iterparse
    import re
    z = zipfile.ZipFile(fname)
    if 'xl/sharedStrings.xml' in z.namelist():
        # Get shared strings
        strings = [element.text for event, element
                   in iterparse(z.open('xl/sharedStrings.xml')) 
                   if element.tag.endswith('}t')]
    sheetdict = { element.attrib['name']:element.attrib['sheetId'] for event,element in iterparse(z.open('xl/workbook.xml'))
                                      if element.tag.endswith('}sheet') }
    rows = []
    row = {}
    value = ''

    if sheet in sheets:
    sheetfile = 'xl/worksheets/sheet'+sheets[sheet]+'.xml'
    #print(sheet,sheetfile)
    for event, element in iterparse(z.open(sheetfile)):
        # get value or index to shared strings
        if element.tag.endswith('}v') or element.tag.endswith('}t'):
            value = element.text
        # If value is a shared string, use value as an index
        if element.tag.endswith('}c'):
            if element.attrib.get('t') == 's':
                value = strings[int(value)]
            # split the row/col information so that the row leter(s) can be separate
            letter = re.sub('\d','',element.attrib['r'])
            row[letter] = value
            value = ''
        if element.tag.endswith('}row'):
            rows.append(row)
            row = {}

    return rows

感谢您恢复我的回答!
Collin Anderson


2

如果您需要旧的XLS格式。下面的代码为ansii'cp1251'。

import xlrd

file=u'C:/Landau/task/6200.xlsx'

try:
    book = xlrd.open_workbook(file,encoding_override="cp1251")  
except:
    book = xlrd.open_workbook(file)
print("The number of worksheets is {0}".format(book.nsheets))
print("Worksheet name(s): {0}".format(book.sheet_names()))
sh = book.sheet_by_index(0)
print("{0} {1} {2}".format(sh.name, sh.nrows, sh.ncols))
print("Cell D30 is {0}".format(sh.cell_value(rowx=29, colx=3)))
for rx in range(sh.nrows):
   print(sh.row(rx))


0

您可能还考虑运行(非python)程序xls2csv。将其输入xls文件,然后应返回一个csv。


3
但是张贴者说他需要阅读Python ...您是建议运行xls2csv,然后csv从Python 解析?
hcarver 2012年

Python-excelerator包含一个围绕python转换器的可执行py_xls2csv包装器。
fatal_error 2015年


0
    with open(csv_filename) as file:
        data = file.read()

    with open(xl_file_name, 'w') as file:
        file.write(data)

您可以使用内置包将CSV转换为excel以上格式。CSV可以使用内置的dictreader和dictwriter程序包处理,其工作方式与python词典的工作方式相同。这很容易,我目前不知道任何内置的excel软件包,但是我遇到过openpyxl。这也非常简单明了。您可以在下面看到代码段,希望对您有所帮助

    import openpyxl
    book = openpyxl.load_workbook(filename)
    sheet = book.active 
    result =sheet['AP2']
    print(result.value)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.