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

4

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

xlwriter支持多个字体颜色,但仅用于写入而不是读取。

xlwt也仅用于写入。

根据其文档,xlwings不支持富文本。

根据这个threadxlrd显然支持从单元格中读取“富文本”数据,但我无法在其API规范中找到适当的方法,并且在他们的documentation中没有涉及此问题。

总之,该项目未维护,建议使用openpyxl

看来我走到了死路。

您知道在Python中是否有可能检索出这样一个单元格的全部数据:

rich-text formatted cell

特别是完整的样式数据,即单元格字符串中使用的不同颜色和格式(粗体等)。
非常感谢您的帮助。
PS:如果您知道如何通过Google Sheet API来完成这项工作,那也可以适用于我。(或者甚至在.odt格式中)
1个回答

2

我遇到了同样的问题。我需要在一些富文本单元格中找到红色文字范围。在深入研究 openpyxl (v3.0.9) 的源代码后,我发现它确实解析了富文本标签,但是格式被读取器剥离了,因为Text对象的content属性在read_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

完整的补丁脚本可以在这里找到。您需要导入它并在直接导入任何openpyxl模块之前调用patch_read_string_table函数。应用此补丁后,富文本单元格的value将是一个包含所需所有样式信息的Text对象。
根据您的用例,这可能不是最佳解决方案,但它向您展示了格式被剥离的位置以及如何恢复它们。我希望未来可以提出更优雅的解决方案,并最终合并到官方代码中。

我们如何使用这种方法提取单元格文本中加粗的部分? - Francesco Pettini
富文本完全支持,详见https://openpyxl.readthedocs.io/en/latest/rich_text.html - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接