python xlsxwriter 从单元格中提取值

Hei*_*ich 6 python-3.x xlsxwriter

是否可以提取我写入 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()
Run Code Online (Sandbox Code Playgroud)

Fra*_*anz 10

是否可以提取我写入 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的存储概念有一个共享的字符串表,而各个单元格条目仅指向该表的索引。共享字符串表可以作为str_table.string_table工作表的属性进行访问。它是一个字典,其中键是字符串,值是关联的索引。为了通过索引访问字符串,您可以从字典生成排序列表,如下所示:

shared_strings = sorted(worksheet.str_table.string_table, key=worksheet.str_table.string_table.get)
Run Code Online (Sandbox Code Playgroud)

我从上面扩展了您的示例以包含所有解释的功能。现在看起来像这样:

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()
Run Code Online (Sandbox Code Playgroud)

  • 我是 XlsxWriter 的作者。这是一个很好的逆向工程或概念验证,但我建议不要在实践中这样做。无法保证(无论是显式的还是隐式的)数据在通过 XlsxWriter API 后得到或将会得到维护。处理此类用例的最佳方法是跟踪库外部的数据。Python 拥有丰富的工具包来处理数据,这比依赖不是为了跟踪数据而编写的库的内部更好。 (8认同)

jmc*_*ara 3

是否可以提取我写入 xlsxwriter.worksheet 的数据?

不可以。XlsxWriter 是只写的。如果您需要跟踪数据,则需要在 XlsxWriter 之外使用您自己的代码来执行此操作。

  • 虽然我同意在代码中跟踪数据是最简单的,但我认为 @Franz 中 xlsxwriter 的创建者的回复是值得的。 (3认同)