使用 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