使用 xlsxwriter 将自定义类类型数据写入 excel TypeError: Unsupported type <class '__main__.node'> in write()

Posted

技术标签:

【中文标题】使用 xlsxwriter 将自定义类类型数据写入 excel TypeError: Unsupported type <class \'__main__.node\'> in write()【英文标题】: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'

【问题讨论】:

【参考方案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,我已经按照说明进行了尝试,但是我仍然没有得到正确的输出,我刚刚更新了更新的部分,请您对此发表评论吗?谢谢! 我在答案中添加了一个小的工作示例。

以上是关于使用 xlsxwriter 将自定义类类型数据写入 excel TypeError: Unsupported type <class '__main__.node'> in write()的主要内容,如果未能解决你的问题,请参考以下文章

JSON 写入错误中的类型无效,尝试通过 JSON 将自定义类发送到 .NET Web 服务

如何强制Python XlsxWriter以自定义格式写入单元格

Jmeter FileWriter类,用于将自定义响应结果写到excel/txt/word/csv

使用“xlsxwriter”在 Excel 中写入时没有输出

如何从 ADLS 将自定义数据框写入 eventthub

使用 pandas 和 XlsxWriter 写入现有的 .xlsm