Нахождение цвета ТЕКСТА с использованием openpyxl - PullRequest
0 голосов
/ 21 октября 2019

Итак, мое приложение должно найти значение и цвет текста внутри ячейки. Я могу найти цвет фона текста. Например, у меня есть значение ячейки «Привет , меня зовут ... приятно познакомиться» (жирный текст означает красный цвет), поэтому, когда я нахожу цвет и вижу красный текст, я хочу удалитьэто у меня есть идея, как удалить его, но не знаю, как найти цвет текста, если значение ячейки.

1 Ответ

0 голосов
/ 21 октября 2019

Удивительно, но это не так просто, как могло бы быть, но если вы следуете логике, это имеет смысл для стандартного форматирования цвета текста.

Чтобы определить значение цвета шрифта, вам нужно пройти через свойства ячейки:

ячейка вернет объект Cell
cell.font вернет объект Font
cell.font.color вернет объект Color

Нижеявляется выводом REPL из существующей книги в качестве примера:

>> from openpyxl import load_workbook
>> from openpyxl.styles import Font
>> wb = load_workbook('example.xlsx')
>> sheet0 = wb['FEB 2019']
>>> print(sheet0['C20'].font)
<openpyxl.styles.fonts.Font object>
Parameters:
name='Calibri', charset=None, family=None, b=False, i=False, strike=False, outline=None, shadow=None, condense=None, color=<openpyxl.styles.colors.Color object>
Parameters:
rgb='00ffffff', indexed=None, auto=None, theme=None, tint=0.0, type='rgb', extend=None, sz=11.0, u=None, vertAlign=None, scheme=None
>>> print(sheet0['A1'].font.color)
<openpyxl.styles.colors.Color object>
Parameters:
rgb='00ffffff', indexed=None, auto=None, theme=None, tint=0.0, type='rgb'

Важным моментом, который следует отметить в этом примере, является цвет, заданный в rgb (не уверен, что его можно вывестив CMYK или другом параметре)

Это приводит к атрибуту объекта

cell.font.color.rgb

, как в

>>> print(sheet0['A1'].font.color.rgb)
00ffffff

Если содержимое ячейки форматированный текст , openpyxl не сможет обработать это. Оказывается, для применения цвета к части ячейки требуется форматирование текста. Сведения об известной проблеме в библиотеке см. В https://bitbucket.org/openpyxl/openpyxl/issues/20/richtext-request.

Это можно сделать в xlrd, но только в старом формате xls, а не в современном xlsx. Смотрите ответ на этот стек: 1033 * Как найти форматирование для подмножества текста в ячейке документа Excel (это код на python2, но его легко преобразовать в python3) (см. Ниже - я также добавил строку print('colour:', segment['font'].colour_index), чтобы показать, что это за конкретный цвет.

#! /usr/bin/env python
# -*- coding: utf-8 -*-

import xlrd

# accessing Column 'C' in this example
COL_IDX = 2

book = xlrd.open_workbook('example.xls', formatting_info=True)
first_sheet = book.sheet_by_index(0)

for row_idx in range(first_sheet.nrows):
  text_cell = first_sheet.cell_value(row_idx, COL_IDX)
  text_cell_xf = book.xf_list[first_sheet.cell_xf_index(row_idx, COL_IDX)]

  # skip rows where cell is empty
  if not text_cell:
    continue
  print(text_cell)

  text_cell_runlist = first_sheet.rich_text_runlist_map.get((row_idx, COL_IDX))
  if text_cell_runlist:
    print('(cell multi style) SEGMENTS:')
    segments = []
    for segment_idx in range(len(text_cell_runlist)):
      start = text_cell_runlist[segment_idx][0]
      # the last segment starts at given 'start' and ends at the end of the string
      end = None
      if segment_idx != len(text_cell_runlist) - 1:
        end = text_cell_runlist[segment_idx + 1][0]
      segment_text = text_cell[start:end]
      segments.append({
        'text': segment_text,
        'font': book.font_list[text_cell_runlist[segment_idx][1]]
      })
    # segments did not start at beginning, assume cell starts with text styled as the cell
    if text_cell_runlist[0][0] != 0:
      segments.insert(0, {
        'text': text_cell[:text_cell_runlist[0][0]],
        'font': book.font_list[text_cell_xf.font_index]
      })

    for segment in segments:
      print(segment['text'])
      print('italic:', segment['font'].italic)
      print('bold:', segment['font'].bold)
      print('colour:', segment['font'].colour_index)

  else:
    print('(cell single style)')
    print('italic:', book.font_list[text_cell_xf.font_index].italic)
    print('bold:', book.font_list[text_cell_xf.font_index].bold)
    print('colour:', book.font_list[text_cell_xf.font_index].colour_index)

Преобразование вашего example.xlsx в example.xls, для ячейки C24 это дает следующий вывод:

Person O,£ 216 САД
(сотовый мульти-стиль) СЕГМЕНТЫ:
Персона О, £ 216
курсив: 0
жирный: 1
цвет: 8
САД
курсив: 0
полужирный: 1
цвет: 10

Курсив / полужирный 0/1, вероятно, является логическим (1 - True).

цвет зависит от сохраненной карты цветовв книгах (поскольку пользователи могут определять свои собственные карты цветов: https://xlrd.readthedocs.io/en/latest/formatting.html#palette). 0-7 - фиксированная система, 8+ - определяемая пользователем. 8 по умолчанию - определенный пользователем черный, 10 - по умолчанию определенный пользователем красный.

...