python-3.x - python 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()
解决方案
是否可以提取我已写入 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)
我从上面扩展了您的示例,以包含所有已解释的功能。现在看起来像这样:
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()
推荐阅读
- typescript - 从编译中排除打字稿文件的某些部分?
- ios - 无法使用 Alamofire 从数组上传多个文件
- javafx - JavaFX - 通过场景构建器访问嵌套属性
- typescript - ts-jest 不识别 es6 导入
- sql - 如何将字符串行旋转到多列?
- android - 如何在没有 startService 的情况下使用 resultReceiver?
- c++11 - 从内部类继承并同时将其传递给外部模板?
- eclipse - 将 Codename One 4.4.0 作为 eclipse 插件安装时出错
- r - 将当前行与 r 中的后续行(按日期和组排序)进行比较
- android - 为什么我的 Pixel 2 上的 Wifi Mac 地址发生了变化(Android Pie)?