Проблемы с сохранением форматирования Excel с помощью Python xlrd и xlutils [дубликаты]

Проще говоря, я хотел бы сохранить все форматирование одного файла Excel в другом. Однако, несмотря на использование флага formatting_info=True, форматирование отображается только для всех неизмененных ячеек в измененной строке. Любой совет?

import xlrd, xlutils
from xlrd import open_workbook
from xlutils.copy import copy

inBook = xlrd.open_workbook(r"path/to/file/format_input.xls", formatting_info=True, on_demand=True)
outBook = xlutils.copy.copy(inBook)

outBook.get_sheet(0).write(0,0,'changed!')
outBook.save(r"path/to/file/format_output.xls")

введите описание изображения здесь

введите здесь описание изображения

введите здесь описание изображения


person user1185790    schedule 30.01.2015    source источник


Ответы (2)


xlwt.write принимает информацию о стиле в качестве третьего аргумента. К сожалению, xlrd и xlwt используют два очень разных формата объекта XF. Таким образом, вы не можете напрямую скопировать стиль ячейки из книги, прочитанной xlrd, в книгу, созданную xlwt.

Обходной путь — использовать xlutils.XLWTWriter для копирования файла, а затем получить информацию о стиле этого объекта, чтобы сохранить стиль обновляемой ячейки.

Сначала вам нужна функция patch от Джона Мачина, представленная в очень похожий вопрос:

from xlutils.filter import process,XLRDReader,XLWTWriter

#
# suggested patch by John Machin
# https://stackoverflow.com/a/5285650/2363712
# 
def copy2(wb):
    w = XLWTWriter()
    process(
        XLRDReader(wb,'unknown.xls'),
        w
        )
    return w.output[0][1], w.style_list

Затем в вашем основном коде:

import xlrd, xlutils
from xlrd import open_workbook
from xlutils.copy import copy

inBook = xlrd.open_workbook(r"/tmp/format_input.xls", formatting_info=True, on_demand=True)
inSheet = inBook.sheet_by_index(0)

# Copy the workbook, and get back the style
# information in the `xlwt` format
outBook, outStyle = copy2(inBook)

# Get the style of _the_ cell:    
xf_index = inSheet.cell_xf_index(0, 0)
saved_style = outStyle[xf_index]

# Update the cell, using the saved style as third argument of `write`:
outBook.get_sheet(0).write(0,0,'changed!', saved_style)
outBook.save(r"/tmp/format_output.xls")
person Sylvain Leroux    schedule 30.01.2015
comment
Сильвен Леру - извините за поздний ответ. Это именно то, что мне нужно. Спасибо! - person user1185790; 31.01.2015

У меня были аналогичные проблемы при использовании openpyxl - по какой-то причине это не очень хорошо обрабатывается в доступных модулях. В итоге я просто изменил стиль ячеек по мере необходимости после того, как ввел свои данные, используя приведенный ниже синтаксис:

#Formatting
from openpyxl.styles import Style, Color, PatternFill, Alignment, Font, NumberFormat
#Allows for conditional formatting
from openpyxl.formatting import CellIsRule #Allows for Conditional Formatting

for cell in changed_cells:
    cell.style = Style(fill=PatternFill(patternType='solid', fgColor=Color('FFff8888')), 
                         font=Font(name="Arial",size=11), 
                         alignment=Alignment(horizontal="center"))

Информацию о синтаксисе для реализации такого рода вещей с помощью xlrd можно найти здесь.

person Alecg_O    schedule 30.01.2015
comment
Я ценю помощь, Alecg_O. Я рад, что вы указали, как переформатировать ячейку. Я буду помнить об этом в будущем, но Сильвен Леру предложил решение без необходимости переформатирования — это именно то, что я искал. Еще раз спасибо! - person user1185790; 31.01.2015