【问题标题】:Write a self-defined class type data to excel using xlsxwriter TypeError: Unsupported type <class '__main__.node'> in write()使用 xlsxwriter 将自定义类类型数据写入 excel TypeError: Unsupported type <class '__main__.node'> in write()
【发布时间】:2021-08-01 06:08:33
【问题描述】:

我正在使用xlsxwriter将自定义类型的数据写入excel文件,但出现错误:

TypeError: Unsupported type <class '__main__.node'> in write()

代码:

import xlsxwriter

class node(object):
    def __init__(self, value):
        self.value = value
        self.children = []
    def __repr__(self, level=0):
        ret = "\t"*level+repr(self.value)+"\n"
        for child in self.children:
            ret += child.__repr__(level+1)
        return ret
    def add(self, nod):
        self.children.append(node(nod))
        
leaf_1 = ['AA','BB','CC','DD']


workbook = xlsxwriter.Workbook('print_def.xlsx')
worksheet = workbook.add_worksheet()    

tree = parent = node(leaf_1[0]) #### code 1
parent.add(leaf_1[1])
parent.add(leaf_1[2])
print(tree)
worksheet.write(1, 0, tree)

预期结果(将带有缩进空格的tree放在特定单元格中):

问题

有人对此错误有经验吗?或建议?提前致谢!

更新

我在print(tree)之后添加了以下部分,而不是使用worksheet.write(1, 0, tree)

def write_node(worksheet, row, col, tree, format = None):
    return worksheet.write_string(row, col, str(tree), format)
worksheet.add_write_handler(tree.children, write_node)
# worksheet.add_write_handler(tree.node, write_node)
worksheet.write('A1', tree)

但是,出现如下错误:

Traceback (most recent call last):
  File "/Users.../pythonProject/2021-05-16.py", line 137, in <module>
    worksheet.add_write_handler(tree.children, write_node)
  File "/Users.../pythonProject/lib/python3.9/site-packages/xlsxwriter/worksheet.py", line 1365, in add_write_handler
    self.write_handlers[user_type] = user_function
TypeError: unhashable type: 'list'

【问题讨论】:

    标签: python excel pandas xlsxwriter write


    【解决方案1】:

    XlsxWriter 不会写入任意数据类型,因此您的类中的 __repr__ 会被忽略。

    如果你想编写用户定义的类型,你需要使用 Xlsxwriter add_write_handler() 机制。请参阅Writing user defined types 上的 XlsxWriter 文档。它有详细的解释和几个例子。

    另外请注意,您应该首先验证您是否可以让 Excel 以您想要的方式显示数据。您至少需要添加一个 textwrap 格式。

    更新。这是一个基于您的代码的小型工作示例:

    import xlsxwriter
    
    
    class node(object):
        def __init__(self, value):
            self.value = value
            self.children = []
    
        def __repr__(self, level=0):
            ret = "    " * level + repr(self.value) + "\n"
            for child in self.children:
                ret += child.__repr__(level+1)
            return ret
    
        def add(self, nod):
            self.children.append(node(nod))
    
    
    def write_node(worksheet, row, col, tree, format=None):
        return worksheet.write_string(row, col, str(tree), format)
    
    workbook = xlsxwriter.Workbook('print_def.xlsx')
    worksheet = workbook.add_worksheet()
    
    text_wrap = workbook.add_format({'text_wrap': True})
    
    worksheet.add_write_handler(node, write_node)
    
    leaf_1 = ['AA', 'BB', 'CC', 'DD']
    tree = parent = node(leaf_1[0])
    parent.add(leaf_1[1])
    parent.add(leaf_1[2])
    
    worksheet.write(0, 0, tree, text_wrap)
    
    workbook.close()
    
    

    输出

    注意,我用 4 个空格替换了“\t”,因为这在 Excel 中显示得更好。此外,您需要添加文本环绕格式,如图所示。

    【讨论】:

    • 好的,非常感谢您的建议,那我试试看:)
    • 嗨@jmcnamara,我已经按照说明进行了尝试,但是我仍然没有得到正确的输出,我刚刚更新了更新的部分,请您对此发表评论吗?谢谢!
    • 我在答案中添加了一个小的工作示例。
    猜你喜欢
    • 2016-12-27
    • 2018-08-20
    • 2016-02-23
    • 1970-01-01
    • 2021-06-02
    • 1970-01-01
    • 1970-01-01
    • 2019-03-29
    • 1970-01-01
    相关资源
    最近更新 更多