2013-05-08 4 views
4

Я хотел бы отформатировать таблицу (xls или xlsx), чтобы любые ячейки, содержащие слово или заканчивающиеся на определенную строку, форматировались путем заполнения фона определенным цветом.Условно форматирование текстовых строк из Excel с использованием python

Например, если ячейка содержит слово «удалить», заполните его черным цветом и нарисуйте текст белым цветом. , если ячейка заканчивается на .pf, окрашивайте ячейку в красный цвет.

Я нашел подобный вопрос от несколько лет назад, что предложил следующее:

import xlrd 
import xlutils.copy 

inBook = xlrd.open_workbook('input.xls', formatting_info=True) 
outBook = xlutils.copy.copy(inBook) 

def _getOutCell(outSheet, colIndex, rowIndex): 
    """ HACK: Extract the internal xlwt cell representation. """ 
    row = outSheet._Worksheet__rows.get(rowIndex) 
    if not row: return None 
    cell = row._Row__cells.get(colIndex) 
    return cell 

def setOutCell(outSheet, col, row, value): 
    """ Change cell value without changing formatting. """ 
    # HACK to retain cell style. 
    previousCell = _getOutCell(outSheet, col, row) 
    # END HACK, PART I 
    outSheet.write(row, col, value) 
    # HACK, PART II 

    if previousCell: 
     newCell = _getOutCell(outSheet, col, row) 
    if newCell: 
     newCell.xf_idx = previousCell.xf_idx 
    # END HACK 


outSheet = outBook.get_sheet(0) 
setOutCell(outSheet, 5, 5, 'Test') 
outBook.save('output.xls') 

В то время как это делает скопировать значения из input.xls в output.xls, это, кажется, не передать форматирование (тестовые значения из input.xls больше не форматируются при открытии output.xls, равно как и правила условного форматирования, присутствующие в «правилах управления» в excel.

Операции «если» для значений чисел, похоже, работают, но опять же, I Я ищу способ форматировать ячейки, содержащие определенные строки.

+0

Вы пытались изменить файл на месте? Вы можете создать резервную копию файла перед запуском скрипта. – Alfe

+0

я не думаю редактирование на месте возможен. от того, что я понимаю, xlutils позволяет копировать и изменять копию. если win32com может это сделать, это будет крутое направление, но я не знаю об этом. win32com также не является моей предпочтительной тактикой, потому что я хотел бы, чтобы этот скрипт работал на машинах без установленного excel (linux). – user2363458

ответ

2

Сохранение оригинального input.xls форматирование, когда вы открываете его:

from xlrd import open_workbook 

input_wb = open_workbook('input.xls', formatting_info=True) 

Создать новую рабочую книгу на основе этого шаблона:

from xlutils.copy import copy as copy_workbook 

output_wb = copy_workbook(input_wb) 

Define некоторые новые стили ячеек:

from xlwt import easyxf 

red_background = easyxf("pattern: pattern solid, fore_color red;") 
black_with_white_font = easyxf('pattern: pattern solid, fore_color black; font: color-index white, bold on;") 

Evaluate и изменить ваши ячейки:

input_ws = input_wb.sheet_by_name('StackOverflow') 
output_ws = output_wb.get_sheet(0) 

for rindex in range(0, input_ws.nrows): 
    for cindex in range(0, input_ws.ncols): 
     input_cell = input_ws.cell(rindex, cindex) 
     if input_cell.value[ input_cell.value.rfind('.'): ] == 'pf': 
      output_ws.write(rindex, cindex, input_cell.value, red_background) 
     elif input_cell.value.find('deleted') >= 0: 
      output_ws.write(rindex, cindex, input_cell.value, black_with_white_font) 
     else: 
      pass # we don't need to modify it 

Сохраните ваш новую книгу

output_wb.save('output.xls') 

Используя приведенный выше пример, неизмененные клетки должны иметь их исходное форматирование нетронутым.

Если вам необходимо изменить содержимое ячейки и хотели бы сохранить исходное форматирование (т.е. НЕ использовать пользовательские easyxf экземпляра), вы можете использовать этот фрагмент кода:

def changeCell(worksheet, row, col, text): 
    """ Changes a worksheet cell text while preserving formatting """ 
    # Adapted from https://stackoverflow.com/a/7686555/1545769 
    previousCell = worksheet._Worksheet__rows.get(row)._Row__cells.get(col) 
    worksheet.write(row, col, text) 
    newCell = worksheet._Worksheet__rows.get(row)._Row__cells.get(col) 
    newCell.xf_idx = previousCell.xf_idx 

# ... 

changeCell(worksheet_instance, 155, 2, "New Value") 

Для сравнения, вы можете использовать строковые методы find и rfind (который ищет справа). Они возвращают индекс позиции подстроки внутри строки. Они возвращают -1, если подстрока не найдена. Ergo, вы видите выше input_cell.value.find('deleted') >= 0, чтобы оценить, существует или нет подстрока 'deleted'. Для сравнения .pf я использовал rfind, а также что-то в Python под названием slicing.

+0

это приводит к следующей ошибке: 'Traceback (самый последний вызов последнего): " \ stacksolution.py" файла, строка 14, в input_ws = input.sheet_by_name ('Лист1') #eval и модификации ячеек AttributeError : 'builtin_function_or_method объект не имеет атрибута' sheet_by_name'' ... кроме того, я не понимаю, как вы применяете сравнения строк в логике. например, ваша логика 'if input_cell.value == идет здесь ''. Это нормально, если вы говорите «<50 or > 60, но как вы его пишете для« заканчивается на .pf »или« содержит слово delete » где-то в строке. " – user2363458

+1

Для ошибки я имел typo'd' input' в качестве имени экземпляра книги, когда это было фактически 'input_wb' (то же самое для' output_wb') - обязательно обновите эти две строки. для отображения условных выражений в нескольких. – pztrick

+0

Это лучший результат до сих пор. с исправлением опечатки к input_wb и output_wb, скрипт теперь успешно копирует input.xls в output.xls со всем содержимым ячейки, а также сохраняет некоторые форматирование, например, тип шрифта, размер шрифта, цвет шрифта. Что это такое ** не делает, сохраняет условное форматирование или мои условные правила форматирования (возможно, это ограничение xlutils.copy). файлы, содержащие слово «удалить» где-то i n их, но не '.pf'. если я использую оператор 'delete' с '.pf', он должен работать с несколькими ложными срабатываниями. благодаря! – user2363458

Смежные вопросы