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 шт):
Столкнулся с похожей проблемой. При открытии файла библиотека 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:
- В терминале:
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())
Попробуйте использовать wb = openpyxl.load_workbook('file_66.xlsx')