Можно ли извлечь данные, которые я написал, в xlsxwriter.worksheet?
Да. Несмотря на то, что XlsxWriter предназначен только для записи, он сохраняет значения таблицы во внутренней структуре и записывает их в файл только при выполнении workbook.close()
.
Каждый рабочий лист имеет атрибут table
. Это словарь, содержащий записи для всех заполненных строк (номера строк, начинающиеся с 0, являются ключами). Эти записи снова являются словарями, содержащими записи для всех заполненных ячеек в строке (номера столбцов, начинающиеся с 0, являются ключами).
Следовательно, table[row][col]
даст вам запись в желаемой позиции (но только в если есть запись, в противном случае она не удастся).
Обратите внимание, что эти записи по-прежнему не являются текстом, числом или формулой, которые вы ищете, а представляют собой именованные кортежи, которые также содержат формат ячейки. Вы можете ввести проверку записей и извлечь содержимое в зависимости от их характера. Вот возможные результаты type(entry)
и доступных полей именованных кортежей:
xlsxwriter.worksheet.cell_string_tuple
: строка, формат xlsxwriter.worksheet.cell_number_tuple
: число, формат xlsxwriter.worksheet.cell_blank_tuple
: формат xlsxwriter.worksheet.cell_boolean_tuple
: логический, формат xlsxwriter.worksheet.cell_formula_tuple
: формула, формат, значение xlsxwriter.worksheet.cell_arformula_tuple
: формула, формат, значение, диапазон
Для чисел, логических значений и формул доступ к содержимому можно получить, прочитав соответствующее поле именованного кортежа.
Для формул массива содержимое присутствует только в верхней левой ячейке выходного диапазона, в то время как остальные ячейки представлены числовыми записями со значением 0.
Для строк ситуация более сложная, поскольку концепция хранилища Excel имеет общую строку table, в то время как отдельные записи ячеек указывают только на индекс этой таблицы. Доступ к таблице общих строк можно получить как атрибут str_table.string_table
рабочего листа. Это словарь, где ключи представляют собой строки, а значения - соответствующие индексы. Чтобы получить доступ к строкам по индексу, вы можете сгенерировать отсортированный список из словаря следующим образом:
shared_strings = sorted(worksheet.str_table.string_table, key=worksheet.str_table.string_table.get)
Я расширил ваш пример сверху, чтобы включить все описанные функции. Теперь это выглядит так:
import xlsxwriter
output = "test.xlsx"
workbook = xlsxwriter.Workbook(output)
worksheet = workbook.add_worksheet()
worksheet.write(0, 0, 'top left')
worksheet.write(0, 1, 42)
worksheet.write(0, 2, None)
worksheet.write(2, 1, True)
worksheet.write(2, 2, '=SUM(X5:Y7)')
worksheet.write_array_formula(2,3,3,4, '{=TREND(X5:X7,Y5:Y7)}')
worksheet.write(4,0, 'more text')
worksheet.write(4,1, 'even more text')
worksheet.write(4,2, 'more text')
worksheet.write(4,3, 'more text')
for row in range(5):
row_dict = worksheet.table.get(row, None)
for col in range(5):
if row_dict != None:
col_entry = row_dict.get(col, None)
else:
col_entry = None
print(row,col,col_entry)
shared_strings = sorted(worksheet.str_table.string_table, key=worksheet.str_table.string_table.get)
print()
if type(worksheet.table[0][0]) == xlsxwriter.worksheet.cell_string_tuple:
print(shared_strings[worksheet.table[0][0].string])
# type checking omitted for the rest...
print(worksheet.table[0][1].number)
print(bool(worksheet.table[2][1].boolean))
print('='+worksheet.table[2][2].formula)
print('{='+worksheet.table[2][3].formula+'}')
workbook.close()