我正在尝试下载并使用 openpyxl 打开市场生成的 Excel 文件(报告)。
import requests
import config
import openpyxl
link = 'https://api.telegram.org/file/bot' + config.TOKEN + '/documents/file_66.xlsx'
def save_open(link):
filename = link.split('/')[-1]
r = requests.get(link)
with open(filename, 'wb') as new_file:
new_file.write(r.content)
wb = openpyxl.open ('file_66.xlsx')
ws = wb.active
cell = ws['B2'].value
print (cell)
save_open(link)
运行此代码后,我得到了上述内容:
Traceback (most recent call last):
File "C:\Python 3.9\lib\site-packages\openpyxl\descriptors\base.py", line 55, in _convert
value = expected_type(value)
TypeError: Fill() takes no arguments
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "C:\Users\Home\Documents\myPython\bot_WB\main.py", line 20, in <module>
save_open(link)
File "C:\Users\Home\Documents\myPython\bot_WB\main.py", line 14, in save_open
wb = openpyxl.open ('file_66.xlsx')
File "C:\Python 3.9\lib\site-packages\openpyxl\reader\excel.py", line 317, in load_workbook
reader.read()
File "C:\Python 3.9\lib\site-packages\openpyxl\reader\excel.py", line 281, in read
apply_stylesheet(self.archive, self.wb)
File "C:\Python 3.9\lib\site-packages\openpyxl\styles\stylesheet.py", line 198, in apply_stylesheet
stylesheet = Stylesheet.from_tree(node)
File "C:\Python 3.9\lib\site-packages\openpyxl\styles\stylesheet.py", line 103, in from_tree
return super(Stylesheet, cls).from_tree(node)
File "C:\Python 3.9\lib\site-packages\openpyxl\descriptors\serialisable.py", line 103, in from_tree
return cls(**attrib)
File "C:\Python 3.9\lib\site-packages\openpyxl\styles\stylesheet.py", line 74, in __init__
self.fills = fills
File "C:\Python 3.9\lib\site-packages\openpyxl\descriptors\sequence.py", line 26, in __set__
seq = [_convert(self.expected_type, value) for value in seq]
File "C:\Python 3.9\lib\site-packages\openpyxl\descriptors\sequence.py", line 26, in <listcomp>
seq = [_convert(self.expected_type, value) for value in seq]
File "C:\Python 3.9\lib\site-packages\openpyxl\descriptors\base.py", line 57, in _convert
raise TypeError('expected ' + str(expected_type))
TypeError: expected <class 'openpyxl.styles.fills.Fill'>
[Finished in 1.6s]
如果运行文件属性/详细信息,您可以看到该文件是由“Go Exelize”(作者:xuri)生成的。要运行此文件,您需要将代码分为两部分。第一:下载文件。然后您需要使用 MS Excel 手动打开它,保存文件并关闭它(在此“Go Excelize”切换到“Microsoft Excel”之后)。只有在那之后,您才能正确运行代码的第二部分,不会出现错误。谁能帮我解决这个问题吗?
我遇到了同样的问题,“TypeError('expected ' + str(expected_type))”,使用 pandas.read_excel,它使用 openpyxl。如果我打开文件,保存并关闭它,它将适用于 pandas 和 openpyxl。
经过进一步尝试,我可以使用 openpyxl 中的“read_only=True”打开文件,但是在迭代行时我仍然会收到错误,但只有当所有行都结束时,在文件末尾。
我相信这可能是 EOF(文件结尾)中的某些内容,而 openpyxl 没有处理它的方法。
这是我用来测试并为我工作的代码:
import openpyxl
wb = openpyxl.load_workbook(my_file_name, read_only=True)
ws = wb.worksheets[0]
lis = []
try:
for row in ws.iter_rows():
lis.append([cell.value for cell in row])
except TypeError:
print('Skip error in EOF')
使用openpyxl==3.0.10
我认为 EOF 与这个问题有关。 阅读 Rodolfo 的评论后,我用手删除了 excel 文件中的行尾,它成功了。