Как прочитать ячейку Excel и сохранить или определить ее формат в Python

Мне дают файл Excel, который содержит некоторое форматирование текста. Некоторые из них могут быть выделены жирным шрифтом, некоторые выделены курсивом, некоторые - заглавными буквами 1, а некоторые - другими форматами (но не такими, как три упомянутых выше).

Примеры:

  • Ku'lah 2 ku.lah v; определение: некоторое определение; использование: некоторое использование;
  • He'lahsa 2 he.lah.sa n; определение: некоторое определение; использование: некоторое использование;
  • И так далее

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

Но это все в клетке Excel.

Когда я пытаюсь просто прочитать файл Excel напрямую с помощью инструмента базы данных, такого как Toad for Oracle, формат исчезает!

  1. Есть ли способ прочитать файл Excel и при этом сохранить формат?
  2. Альтернативно, есть ли способ обнаружить форматирование? Пока мы можем определить формат, я могу просто заменить текст некоторым HTML-форматом, таким как <b>v</b> и это будет моей работой. Я только хочу знать, как мы сохраняем или определяем текстовый формат ячейки Excel в Python. (в частности, эти три формата: полужирный, курсив и верхний регистр)

Редактировать:

Я пытаюсь получить текстовый формат с пакетом xlrd, но я не могу найти способ получить стиль текстового формата как cell объект состоит только из: ctype, value, а также xf_index, У него нет информации о текстовом формате, и когда я создаю экземпляр с formatting_info=True:

book = xlrd.open_workbook("HuluHalaDict.xlsx", sys.stdout, 0, xlrd.USE_MMAP, None, None, \
                          formatting_info=True, on_demand=False, ragged_rows=False)

Я получил следующую ошибку:

NotImplementedError: formatting_info = True еще не реализовано

Поднято этой линией в xlsx.py файл из xlrd пакет:

if formatting_info:
    raise NotImplementedError("formatting_info=True not yet implemented")

Что мне показалось странным, так как я использую версию 0.9.4 xlrd (последняя) и в документации сказано, что начиная с версии выше 0.6.1, информация о форматировании включена:

Форматирование по умолчанию

Форматирование по умолчанию применяется ко всем пустым ячейкам (те, которые не описаны в записи ячейки). Во-первых, по умолчанию используется информация о строке (запись ROW, класс Rowinfo). В противном случае используется информация о столбце по умолчанию (запись COLINFO, класс Colinfo), если она доступна. В качестве последнего средства будет использоваться формат ячейки по умолчанию для рабочего листа / рабочей книги; это всегда должно присутствовать в файле Excel, описанном записью XF с фиксированным индексом 15 (на основе 0). По умолчанию он использует стиль ячейки по умолчанию для рабочего листа / рабочей книги, описанный самой первой записью XF (индекс 0). Функции форматирования, не включенные в xlrd версии 0.6.1

Форматированный текст, т.е. строки, содержащие частичный полужирный курсив и подчеркнутый текст, изменение шрифта внутри строки и т. Д. См. OOo docs s3.4 и s3.2 Азиатский фонетический текст (известный как "ruby"), используемый для японского фуригана. См. OOo docs s3.4.2 (p15) Условное форматирование. См. OOo docs s5.12, s6.21 (запись CONDFMT), s6.16 (запись CF). Разные элементы уровня листа и книги, например, макет печати, панели экрана. Современные версии файлов Excel не сохраняют большинство встроенных "числовых форматов" в файле; Excel загружает форматы в соответствии с языком пользователя. В настоящее время эмуляция xlrd этого ограничена жестко привязанной таблицей, которая применима к английскому языку в США. Это может означать, что символы валюты, порядок дат, разделитель тысяч, разделитель десятичных дробей и т. Д. Не подходят. Обратите внимание, что это не влияет на пользователей, которые копируют файлы XLS, только на тех, кто визуализирует ячейки.

Я ошибся здесь? Мой код просто как показано:

book = xlrd.open_workbook("HuluHalaDict.xlsx", sys.stdout, 0, xlrd.USE_MMAP, None, None, \
                          formatting_info=True, on_demand=False, ragged_rows=False)

Изменить 2:

Пример, показанный в посте, показывает, что он создает экземпляр класса (book) с formatting_info=True, Но я проверяю это в своей реализации. Это поднимает ошибку выше. Любая идея?

1 ответ

Решение

Я предлагаю вам библиотеку xlrd https://secure.simplistix.co.uk/svn/xlrd/trunk/xlrd/doc/xlrd.html?p=4966

На GitHub здесь https://github.com/python-excel/xlrd

Вы можете найти простой пример того, как использовать xlrd для определения стиля шрифта здесь. Использование модуля XLRD и Python для определения стиля шрифта ячейки (курсив или нет)

Вот практический пример:

from xlrd import open_workbook

path = '/Users/.../Desktop/Workbook1.xls'
wb = open_workbook(path, formatting_info=True)
sheet = wb.sheet_by_name("Sheet1")
cell = sheet.cell(0, 0) # The first cell
print("cell.xf_index is", cell.xf_index)
fmt = wb.xf_list[cell.xf_index]
print("type(fmt) is", type(fmt))
print("Dumped Info:")
fmt.dump()

Это выводит следующее:

cell.xf_index is 62
type(fmt) is <class 'xlrd.formatting.XF'>
Dumped Info:
_alignment_flag: 0
_background_flag: 0
_border_flag: 0
_font_flag: 1
_format_flag: 0
_protection_flag: 0
alignment (XFAlignment object):
    hor_align: 0
    indent_level: 0
    rotation: 0
    shrink_to_fit: 0
    text_direction: 0
    text_wrapped: 0
    vert_align: 2
background (XFBackground object):
    background_colour_index: 65
    fill_pattern: 0
    pattern_colour_index: 64
border (XFBorder object):
    bottom_colour_index: 0
    bottom_line_style: 0
    diag_colour_index: 0
    diag_down: 0
    diag_line_style: 0
    diag_up: 0
    left_colour_index: 0
    left_line_style: 0
    right_colour_index: 0
    right_line_style: 0
    top_colour_index: 0
    top_line_style: 0
font_index: 6
format_key: 0
is_style: 0
lotus_123_prefix: 0
parent_style_index: 0
protection (XFProtection object):
    cell_locked: 1
    formula_hidden: 0
xf_index: 62

куда _font_flag: 1 указывает, что жирный шрифт

Другие вопросы по тегам