Как применить стиль ко всей строке, используя XLWT Python Excel? - PullRequest
1 голос
/ 23 февраля 2012

Я пытаюсь применить стиль, который будет выделять всю строку, если один из столбцов содержит значение «Активы».Код ниже выделит только столбец с «Активами», а не всю строку.Есть ли способ применить стиль ко всей строке?

for row in csv_input:
     #Iterate through each column
      for col in range(len(row)):
           #Apply different styles depending on row
           if row_count == 0:
               sheet.write(row_count,col,row[col],headerStyle)
           elif row_count == 3:
               sheet.write(row_count,col,row[col],subheadStyle)
           elif "Assets" in row[col]:
               sheet.write(row_count,col,row[col],highlightStyle)             
           else:
               if (is_number(row[col]) == True):
                   sheet.write(row_count,col,float(row[col]),rowStyle)
               else:
                   sheet.write(row_count,col,row[col],rowStyle)

Как видите, в зависимости от строки я применяю разные стили.Как сделать так, чтобы любая строка, содержащая ключевое слово «Активы», была подсвечена?Спасибо!

1 Ответ

1 голос
/ 04 марта 2012

Ваша основная проблема в том, что ваш код проверяет наличие «Активов» после того, как он записал несколько ячеек в строке.Вам нужно выполнить тесты «какой стиль использовать для всей строки» до того, как вы напишете все ячейки в строке.Установка стиля для объекта xlwt Row не работает;это стиль по умолчанию для использования с ячейками, к которым не применяется форматирование.

Другие проблемы:

содержит значение «Активы».Код ниже выделит только столбец с «Активами» в нем

Это неоднозначно.Предположим, что значение ячейки точно равно «Активам капитала»;что ты хочешь делать?Примечание: ваш код выделит такую ​​ячейку и те, что справа от нее.Кроме того, неясно, должна ли быть первая ячейка, содержащая «Активы» (например, в вашем комментарии к другому ответу), или какая-либо ячейка (согласно вашему коду).

Некоторые из ваших вариантов выбора имен переменных делают вашкод очень трудно читаемый, например, row - это список значений ячеек, но col - это индекс столбца.Используйте enumerate(), где это возможно.

Попробуйте что-то вроде этого:

for row_index, cell_values in enumerate(csv_input):
    # Determine what style to use for the whole row
    if row_index == 0:
        common_style = headerStyle
    elif row_index == 3:
        common_style = subheadStyle
    elif "Assets" in cell_values:
        # perhaps elif any("Assets" in cell_value for cell_value in cell_values):
        # perhaps elif cell_values and cell_values[0] == "Assets":
        # perhaps elif cell_values and "Assets" in cell_values[0]:
        common_style = highlightStyle
    else:
        common_style = rowStyle
    # Iterate over the columns
    for col_index, cell_value in enumerate(cell_values):
        if common_style == rowStyle and is_number(cell_value):
            cell_value = float(cell_value)
        sheet.write(row_index, col_index, cell_value, common_style)

Мне интересно узнать о функции is_number ... Я бы использовал это:

def is_number(s):
    try:
        float(s)
        return True
    except ValueError:
        return False

, что автоматически приводит к:

        if common_style == rowStyle:
            try:
                cell_value = float(cell_value)
            except ValueError:
                pass

, а также поднимает вопрос о том, должны ли у вас быть разные стили для чисел и текста.

...