从单元格中检索完整的富文本数据(单元格内的多种字体颜色/样式)

Atr*_*alb 5 python excel xls xlsx google-sheets-api

openpyxl每个单元格只能读取和写入一种字体颜色

xlwriter支持多种字体颜色,但仅用于书写,不用于阅读。

xlwt也仅用于写作。

xlwings根据他们的文档,不支持富文本。

xlrd显然支持根据此线程从单元格读取“富文本”数据,但我无法在他们的 API 规范中找到适当的方法,并且他们的文档中没有处理此 AFAIK 的文章。

最重要的是,该项目没有维护,建议使用openpyxl.

看来我已经走进了死胡同。

你知道是否有可能在 python 中检索这样一个单元格的完整数据:

富文本格式的单元格

特别是完整样式数据,即沿单元格字符串使用的不同颜色和格式(粗体等..)。

预先非常感谢您的帮助。

PS:如果您知道如何通过 Google Sheet API 使用 Google Sheet 来完成此操作,那也对我有用。(或者甚至是.odt格式)

小智 2

我遇到了同样的问题。我需要在一些富文本单元格中找到红色的文本范围。在深入研究 openpyxl (v3.0.9) 的源代码后,我发现它确实解析了富文本标签,但由于在函数中使用了对象的属性,因此格式被读者剥离contentTextread_string_table

因此,我编写了一个简单的补丁脚本来覆盖该read_string_table函数,以便Text在存在格式化文本时返回原始对象。修改后的read_string_table函数如下。

def read_string_table(xml_source):
    """Read in all shared strings in the table.
    If a shared string has formatted snippets, the raw Text object is appended to the returned list.
    Otherwise, only the plain text content of the shared string is appended to the list.
    """
    strings = []
    STRING_TAG = '{%s}si' % SHEET_MAIN_NS
    for _, node in iterparse(xml_source):
        if node.tag == STRING_TAG:
            text_obj = Text.from_tree(node)
            if text_obj.formatted:
                text = text_obj  # return raw Text object
            else:  # original processing
                text = text_obj.content
                text = text.replace('x005F_', '')
            node.clear()
            strings.append(text)
    return strings
Run Code Online (Sandbox Code Playgroud)

完整的补丁脚本可以在这里找到。在直接导入任何 openpyxl 模块之前,您需要导入它并调用该patch_read_string_table函数。应用此补丁后,value富文本单元格的 将会是一个Text包含您想要的所有样式信息的对象。

根据您的使用案例,这可能不是最好的解决方案,但它会向您显示格式被剥离的位置以及如何恢复它们。希望未来能够提出更优雅的解决方案并最终合并到官方代码中。