python xlsxwriter извлечь значение из ячейки - PullRequest
1 голос
/ 12 июля 2020

Можно ли извлечь данные, которые я написал, в xlsxwriter.worksheet?

import xlsxwriter

output = "test.xlsx"
workbook = xlsxwriter.Workbook(output)
worksheet = workbook.add_worksheet()


worksheet.write(0, 0, 'top left')
if conditional:
    worksheet.write(1, 1, 'bottom right')

for row in range(2):
  for col in range(2):
    # Now how can I check if a value was written at this coordinate?
    # something like worksheet.get_value_at_row_col(row, col)

workbook.close()

Ответы [ 2 ]

2 голосов
/ 04 августа 2020

Можно ли извлечь данные, которые я написал, в 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()
0 голосов
/ 12 июля 2020

Можно ли извлечь данные, которые я написал, в xlsxwriter.worksheet?

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

...