TypeError: expected

Я пытаюсь загрузить, а затем открыть файл excel (отчет), созданный marketplace с помощью openpyxl.

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). Чтобы открыть этот файл через Python, нужно разделить код на две части. Во-первых: загрузить файл. Затем нужно вручную открыть его с помощью MS Excel, сохранить файл и закрыть его (после этого "Go Excelize" переключится на "Microsoft Excel"). И только после этого можно правильно запустить вторую часть кода без ошибок. Кто-нибудь может помочь мне справиться с этой проблемой?


Ответы (2 шт):

Автор решения: Valery Mamontov

Столкнулся с похожей проблемой. При открытии файла библиотека openpyxl порождала ошибку "TypeError: Fill() takes no arguments":

Traceback (most recent call last): File "C:\Users\Mamontov.virtualenvs\flask-J0o7RS21\lib\site-packages\openpyxl\descriptors\base.py", line 57, in _convert value = expected_type(value) TypeError: Fill() takes no arguments

Причём проблема возникала только на автоматически сгенерированных xlsx-файлах (выгрузки, отчёты, регистры из различных систем).
И если открыть такой файл и пересохранить его вручную, то потом библиотека openpyxl обрабатывает пересохранённый файл без ошибок. Очевидно при пересохранении меняется внутренняя структура файла. Кроме того размер нового файла значительно больше.

Чтобы избежать ручного пересохранения установил pandas и xlrd:

  1. В терминале:
pip install pandas==1.1.5
pip install xldr==1.2.0

ВАЖНО: библиотеки нужно ставить именно указанных версий (pandas==1.1.5 и xldr==1.2.0). Свежий pandas поддерживает только последние версии xlrd, которые в свою очередь вызывают ошибку при открытии xlsx-файлов. Замкнутый круг.

2. В консоле:

import pandas as pd

url = 'd:\\flask_project\\files\\123.xlsx'
data = pd.read_excel(url, engine='xlrd', header=0, skiprows=1)
data.head()

==========================================
UPD:
Немного помучившись с подбором библиотек, написал скрипт для обработки экселевского файла через библиотеку xlrd. Все строки пишутся в словарь, где:
ключи словаря - названия колонок
значения словаря - данные из столбцов (в виде списков)
На основе словаря создаётся DataFrame. Теперь с данными работать намного удобнее.

import pandas as pd
import xlrd

book = xlrd.open_workbook(url)
sh = book.sheet_by_index(0)

xlsx_dict = {sh.cell_value(rowx=0, colx=i): []
             for i in range(sh.ncols)}

for i in range(1, sh.nrows):
    for n, (k, v) in enumerate(xlsx_dict.items()):
        v.append(sh.cell_value(rowx=i, colx=n))

data = pd.DataFrame.from_dict(xlsx_dict)
print(data.columns)
print(data.head())
→ Ссылка
Автор решения: Sten Horland

Попробуйте использовать wb = openpyxl.load_workbook('file_66.xlsx')

→ Ссылка