Python下如何快速获得一个Excel所有sheet name


前言
ETL的时候经常碰到客户提供几个Excel,很大,而且每个Excel还有多个Sheet,这给导入带来了不少麻烦, Excel太大,打开很慢,于是通过搜索和研究,把快速获得sheet name的方法汇总如下。
Python 下针对不同格式 Excel,需要相应的包,
xlrd: .xls
odfpy: .odf, .ods, .odt
pyxlsb: .xlsb
openpyxl: xlsx/xlsm/xltx/xltm
通用办法,使用 pandas,慢
import pandas as pdpd.ExcelFile(file).sheet_names
使用 zipfile 与 xml,最快
Excel 2007+ :xlsx/xlsm/xltx/xltm
import xml.etree.ElementTree as ETimport zipfiledef xlsxSheets(f):    zf = zipfile.ZipFile(f)    f = zf.open(r'xl/workbook.xml')    l = f.readline()    l = f.readline()    root = ET.fromstring(l)    sheets=[]    for c in root.findall('{http://schemas.openxmlformats.org/spreadsheetml/2006/main}sheets/*'):        sheets.append(c.attrib['name'])    return sheetsxlsxSheets(file)
ods 格式:.odf, .ods, .odt
def odsSheets(f):    zf = zipfile.ZipFile(f)    f = zf.open(r'content.xml')    l = f.readline()    l = f.readline()    root = ET.fromstring(l)    sheets=[]    for elem in root.findall('{urn:oasis:names:tc:opendocument:xmlns:office:1.0}body/*/*'):        for k in elem.keys():            if k =="{urn:oasis:names:tc:opendocument:xmlns:table:1.0}name":                sheets.append(elem.attrib['{urn:oasis:names:tc:opendocument:xmlns:table:1.0}name'])    return sheetsodsSheets(file)
xlsb 格式: .xlsb
import xml.etree.ElementTree as ETimport zipfiledef xlsbSheets(f):    zf = zipfile.ZipFile(f)    f = zf.open(r'docProps/app.xml')    l = f.readline()    l = f.readline()    root = ET.fromstring(l)    sheets=[]    path= '{http://schemas.openxmlformats.org/officeDocument/2006/extended-properties}TitlesOfParts/*/*'    for c in root.findall(path):        sheets.append(c.text)    return sheets
使用对应的库
直接使用 openpyxl, 支持 Excel 2007+ 的 xlsx/xlsm/xltx/xltm
from openpyxl import load_workbookdef get_sheetnames_xlsx(filepath):    wb = load_workbook(filepath, read_only=True, keep_links=False)    return wb.sheetnamesget_sheetnames_xlsx(file)
xlsb 格式: .xlsb
from pyxlsb import open_workbookdef get_sheetnames_xlsb(filepath):  with open_workbook(filepath) as wb:     return wb.sheets
一次把所有 sheet 都读到 pandas 的 DataFrame
import pandas as pddfs = pd.read_excel(file, None)
返回的 dfs 是一个 dict,key 就是 sheet_name, value 则是对应的 DataFrame。
最慢!
具体请根据需要选择合适的方法。
到顶部