Загрузите лист с помощью openpyxl и проигнорируйте другой лист, который содержит сводную таблицу - PullRequest
0 голосов
/ 02 марта 2020

У меня есть файл .xlsx, который содержит 2 листа. Первый содержит обычные данные (ничего особенного), а второй содержит сводные таблицы. Мне нужны только данные из первого листа, и я хочу игнорировать второй, но в сводных таблицах возникает ошибка: TypeError: expected <type 'basestring'> при вызове openpyxl.load_workbook.

Ошибка возникает в: openpyxl/reader/excel.py , в строке: pivot_caches = parser.pivot_caches.

Я пробовал с openpyxl версиями 2.6.4 и 2.5.1. Я использую Python 2.7.

После удаления 2-го рабочего листа ошибка исчезает, и данные с 1-го рабочего листа читаются правильно. Однако эти файлы загружаются пользователями, и, хотя мне не нужны сводные таблицы, я бы не стал заставлять пользователей удалять ненужные рабочие таблицы, если это возможно.

Пример кода:

from io import BytesIO

import openpyxl

pivot = '~/Downloads/file_with_pivot_tables.xlsx'

with open(pivot) as fin:
    content = BytesIO(fin.read())
    wb = openpyxl.load_workbook(content)  # this line fails
    ws = wb.get_sheet_by_name('Sheet1')

Полная трассировка ошибок:

  File "/Users/gi/lib/openpyxl/reader/excel.py", line 224, in load_workbook
    pivot_caches = parser.pivot_caches
  File "/Users/gi/lib/openpyxl/packaging/workbook.py", line 125, in pivot_caches
    cache = get_rel(self.archive, self.rels, id=c.id, cls=CacheDefinition)
  File "/Users/gi/lib/openpyxl/packaging/relationship.py", line 162, in get_rel
    obj.deps = get_dependents(archive, rels_path)
  File "/Users/gi/lib/openpyxl/packaging/relationship.py", line 130, in get_dependents
    rels = RelationshipList.from_tree(node)
  File "/Users/gi/lib/openpyxl/descriptors/serialisable.py", line 84, in from_tree
    obj = desc.expected_type.from_tree(el)
  File "/Users/gi/lib/openpyxl/descriptors/serialisable.py", line 100, in from_tree
    return cls(**attrib)
  File "/Users/gi/lib/openpyxl/packaging/relationship.py", line 50, in __init__
    self.Target = Target
  File "/Users/gi/lib/openpyxl/descriptors/base.py", line 44, in __set__
    raise TypeError('expected ' + str(self.expected_type))
TypeError: expected <type 'basestring'>

1 Ответ

0 голосов
/ 02 марта 2020

Вы можете указать лист, которым вы хотите манипулировать:

wb = openpyxl.load_workbook('H:\\myfile.xlsx')
ws = wb['sheet1']
ws['E1'] = 'The sky is gray.'
wb.save('H:\\myfile.xlsx')
wb.close()

Вы также можете получить список всех имен листов, если вам нужно сначала проверить их:

print(wb.sheetnames)
...