类型错误:预期<class 'openpyxl.styles.fills.Fill'>

问题描述 投票:0回答:2

我正在尝试下载并使用 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”之后)。只有在那之后,您才能正确运行代码的第二部分,不会出现错误。谁能帮我解决这个问题吗?

python excel openpyxl
2个回答
0
投票

我遇到了同样的问题,“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


0
投票

我认为 EOF 与这个问题有关。 阅读 Rodolfo 的评论后,我用手删除了 excel 文件中的行尾,它成功了。

© www.soinside.com 2019 - 2024. All rights reserved.