从字节串中读取.xlsx文件

6
我正在尝试从电子邮件中读取一个附加的.xlsx文件。
我已经能够获取一种类型为email.message.Message的邮件,并且其中有一部分是application/vnd.openxmlformats-officedocument.spreadsheetml.sheet类型的。我应该可以使用该类型来读取它。
file = part.get_payload(decode=True)

这使我得到了一个以字节对象开始的内容。
b'PK\x03\x04\x14\x00\x06\x00\x08\x00\x00\x00!\x00\x93\xe11\xb6\x93\x01\x00\x003\x07\x00\x00\x13\x00\

我希望使用以下方式将此内容解析成字典

io.BytesIO(gzip.decompress(file))

对于一些带有压缩的 .csv 文件的电子邮件,这种方法可以使用,但是采用这种方法无法打开 .xlsx 文件。我已经在网上搜索过,但没有找到任何解决方案。非常感谢您的任何帮助。


寻找一个可以读取 xlsx 文件的库。xlsx 是一个包含 XML 文件的 ZIP 包,其中包括样式、可重用字符串等单独的文件。如果想要读取这些 XML 文件,就必须了解 Open XML 格式的工作原理。 - Panagiotis Kanavos
3个回答

12

Excel文件以压缩形式存在,加载到Excel中时会自动解压缩。

openpyxl库能够直接加载这些Excel文件,例如:

import openpyxl
import io

xlsx = io.BytesIO(part.get_payload(decode=True))
wb = openpyxl.load_workbook(xlsx)
ws = wb['Sheet1']

for row in ws.iter_rows(values_only=True):
    print(row)

如果您需要每个单元格的额外信息:
for cells in ws.iter_rows():    
    print([cell.value for cell in cells])

3

.xlsx 是一种ZIP压缩文件格式,与GZip完全不同。

虽然您可以使用zipfile模块获取其内容,但仍需要一些专门用于解析Excel文件的软件包才能理解它们。


谢谢你的回答,Martin回答得更全面,所以我接受了他的答案。 - Nathan
我不想给出具体的例子,因为有大约六个库(大多数都非常不完整),而您的问题只涉及如何处理数据。 - ivan_pozdeev

1

在你的情况下,

import openpyxl
import io

# The bytes object (Something like b'PK\x03\x04\x14\x00\x06\x00\x08\x00\x00...)
file = part.get_payload(decode=True)

xlsx = io.BytesIO(file)
wb = openpyxl.load_workbook(xlsx)
ws = wb['Sheet1']

for cells in ws.iter_rows():    
    print([cell.value for cell in cells])

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接