Python使用xlsxwriter导出GPG公钥到Excel时出现写入错位、内容拆分异常
异常根本原因
核心是对xlsxwriter的write_row方法参数逻辑的误用,叠加可迭代对象的特性触发了内容错位,和你观察到的所有现象完全匹配:
- 公钥ID被逐字符拆分写入相邻单元格:
keyid本身是字符串类型,当你把单个字符串作为第三个参数传给write_row时,方法会把传入的可迭代对象逐元素拆解写入。字符串是逐字符的可迭代序列,自然会把整个公钥ID的每个字符依次写到从当前列开始的相邻单元格里,形成拆字符的错位效果。 - 第一列只显示过期epoch值的开头数字“1”:python-gnupg在部分场景下会把
expires的epoch时间返回为字符串类型。当你调用write_row写入这个字符串时,本来会从A列开始逐字符写入整个epoch的所有数字;但紧接着的内层循环会在B列、C列等位置执行新的写入操作,把之前逐字符写到B、C及更靠后位置的数字全部覆盖,最后A列就只剩最开头的第一个字符“1”。 - 第二列UID显示正常:
key["uids"]本身是列表类型,当你把这个列表传给write_row时,方法只会把列表里的单个UID元素写入当前的B列单元格——因为这个列表只有1个元素,不会继续向右拆分覆盖其他列,所以这一列的显示效果符合预期。
补充说明
write_row的设计逻辑:这个方法的初衷是一次性写入一整行的连续单元格,第三个参数需要传入整行所有单元格值组成的序列,方法会自动从指定的起始列开始,把序列里的每个元素依次填入对应列的单元格,不会对单个单元格的值做迭代拆分。你的代码里错误地把每一个单独的单元格值,反复传给write_row作为待写入的序列,才触发了所有错位问题。
修正方案
两种改法都可以解决问题:
- 利用write_row本来的设计用途,去掉多余的内层循环。你已经提前把每一行的内容组装成了列表,直接把整行的列表传给write_row即可:
for row_num, row_data in enumerate(datalist): # 从第0列开始,把整行数据依次写入单元格 worksheet.write_row(row_num, 0, row_data) - 如果要保留逐单元格写入的逻辑,就把误用的
write_row换成专门写单个单元格的write方法:for row_num, row_data in enumerate(datalist): for col_num, col_data in enumerate(row_data): worksheet.write(row_num, col_num, col_data)
内容的提问来源于stack exchange,提问作者illbeinmyoffice
相关产品推荐
相关产品推荐

