2015-01-30 7 views
2

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

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") 

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

enter image description here

enter image description here

ответ

5

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

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

Прежде всего, необходимо, что патч функция Джоном Мачин представлена ​​в a very similar question:

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") 
+0

Sylvain Leroux - извините за поздний ответ. Это именно то, что мне нужно. Спасибо! – user1185790

2

Я имел аналогичные проблемы при использовании 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 можно найти here.

+0

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