xlutils работает только с xls, а не с xlsx?

У меня есть рабочая книга Excel, Workbook_A. Я создаю идентичную книгу Workbook_B, а затем вставляю несколько значений в некоторые ячейки новой книги.

Упрощенная версия того, что я делаю:

from xlrd import open_workbook
from xlutils.copy import copy

rb = open_workbook(Workbook_A)
wb = copy(rb)
s = wb.get_sheet(0)
s.write(row, col, value)
wb.save(Workbook_B)

Workbook_A здесь может быть файлом xlsx, но я должен сохранить его как файл xls, Workbook_B.xls. В противном случае файл становится поврежденным и его невозможно открыть.

Есть ли способ исправить это? Могу ли я использовать xlutils с xlsx, или модуль не совместим с этим форматом Excel?

Является ли openpyxl решением?

Я не первый, кто столкнулся с эта проблема, но я не могу найти решение.


person Stewie Griffin    schedule 28.08.2017    source источник


Ответы (1)


Поскольку xlutils полагается на xlrd (для чтения файлов) и xlwt (для записи файлов), таким образом, функция save xlutils фактически использует xlwt.

.xlsx — это более новый и совершенно другой формат файлов (в основном заархивированные xml-файлы) от .xls. В то время как xlrd был обновлен для чтения .xlsx файлов, xlwt не был обновлен для записи таких файлов (поддерживает ли xlwt формат xlsx).

Поскольку xlwt записывает только старые файлы Excel (.xls), передача расширения .xlsx не изменить вещь. Базовый формат по-прежнему .xls (и MS Excel считает его поврежденным, потому что он полагается на расширение, а не на содержимое, чтобы решить, как открыть файл)

Итак, либо используйте openpyxl, чтобы делать то, что вы хотите (полностью отбросьте xlutils, xlrd, xlwt, поскольку вас не волнует устаревший формат .xls), либо сохраните как временный файл .xls, используя текущий процесс, а затем прочитайте его с помощью xlrd. и напишите ответ openpyxl.

В зависимости от сложности вашего текущего кода вы можете выбрать между полным переписыванием или грязным обходным путем, включающим гораздо больше пакетов (но избегая перезаписи текущего кода).

person Jean-François Fabre    schedule 28.08.2017