使用Xlsxwriter Autofilter报错:'float'对象不可迭代
Xlsxwriter 自动筛选隐藏非空白行报错解决
错误根源
write_row()参数类型错误:这个方法要求第三个参数是可迭代对象(比如列表、元组),但你传的row_data是DataFrame列里的单个元素,当单元格是空白时会被识别为NaN(float类型),自然无法迭代,直接触发TypeError。- 代码缩进完全错误:
if判断、write_row和行号递增的代码都在for循环外面,导致循环只遍历完所有数据后,拿最后一个元素执行一次操作,逻辑完全走偏。 - 空白值判断不匹配:DataFrame里的空白是
NaN(float类型),你用status == "Blanks"判断永远不会成立,和自动筛选的条件逻辑脱节。
修正后的代码
import pandas as pd import xlsxwriter # 示例DataFrame,替换成你的实际数据 df_owners = pd.DataFrame({"Status": ["", None, "Active", pd.NA, "Inactive"]}) with pd.ExcelWriter("output.xlsx", engine="xlsxwriter") as writer: df_owners.to_excel(writer, sheet_name="Sheet1", index=False) worksheet1 = writer.sheets["Sheet1"] # 设置自动筛选范围:从表头行(第0行)到最后一行的第8列(索引从0开始) worksheet1.autofilter(0, 8, len(df_owners), 8) # 设置筛选条件:显示空白行 worksheet1.filter_column(8, "Status == Blanks") row = 1 # 从数据行开始,表头是第0行 for status in df_owners["Status"]: # 正确判断空白值:覆盖NaN、pd.NA、空字符串 is_blank = pd.isna(status) or status == "" if not is_blank: # 隐藏非空白行 worksheet1.set_row(row, options={"hidden": True}) # 单个单元格用write(),而非write_row() worksheet1.write(row, 8, status) row += 1
核心修正点
- 把
write_row()换成write():你只需要写入单个单元格,write()专门处理单个值,避免迭代要求。 - 修复缩进:把所有循环内的操作放进
for代码块里,保证每一行数据都被处理。 - 空白值判断逻辑对齐:用
pd.isna()识别缺失值,同时兼容空字符串,和筛选条件保持一致。 - 补全
autofilter()范围:必须先定义筛选的行和列范围,筛选条件才会生效。
内容的提问来源于stack exchange,提问作者Calarian
相关产品推荐
相关产品推荐

