使用dataframe.torecords()时遇win32com内部错误:缓冲区长度与序列长度不符
解决win32com调用DataFrame.to_records()时的"buffer length is not the sequence length"错误
我之前也碰到过这个问题,核心原因是pandas的datetime64类型与win32com的类型交互不兼容:当你的DataFrame包含datetime类型列时,to_records()生成的numpy结构化数组,其内存布局和win32com期望的序列格式不匹配,从而触发这个内部错误。下面是几个经过验证的解决方案:
方案1:转换datetime列为字符串后再生成records
把datetime列转成Excel可识别的字符串格式,绕过numpy结构化数组的类型问题:
import win32com.client as win32 import pandas as pd excel_application = win32.Dispatch("Excel.Application") excel_application.Visible = True # 读取数据 lta_df = pd.read_excel("C:/Temp/temp_lta.xlsx", sheet_name=0, header=0, na_filter=False) # 将datetime列转换为标准字符串格式(YYYY-MM-DD HH:MM:SS) lta_df["Updated"] = lta_df["Updated"].dt.strftime("%Y-%m-%d %H:%M:%S") workbook = excel_application.Workbooks.Open("C:/Temp/temp_lta.xlsx") ws = workbook.Sheets(1) # 选择目标工作表 # 生成records并写入Excel(跳过表头,从A2开始) records = lta_df.to_records(index=False) ws.Range("A2").Resize(records.shape[0], records.shape[1]).Value = records.tolist() # 可选:如果需要把字符串转回Excel日期格式,设置单元格格式 col_index = lta_df.columns.get_loc('Updated') + 1 ws.Range(f"{chr(64+col_index)}:{chr(64+col_index)}").NumberFormat = "yyyy-mm-dd hh:mm:ss"
方案2:绕过to_records(),直接写入DataFrame的值列表
完全避开to_records(),直接用pandas的values.tolist()生成纯Python列表,win32com对这种原生类型支持更好:
import win32com.client as win32 import pandas as pd excel_application = win32.Dispatch("Excel.Application") excel_application.Visible = True lta_df = pd.read_excel("C:/Temp/temp_lta.xlsx", sheet_name=0, header=0, na_filter=False) lta_df["Updated"] = pd.to_datetime(lta_df["Updated"]) workbook = excel_application.Workbooks.Open("C:/Temp/temp_lta.xlsx") ws = workbook.Sheets(1) # 写入表头 header = lta_df.columns.tolist() ws.Range("A1").Resize(1, len(header)).Value = header # 写入数据行 data_rows = lta_df.values.tolist() ws.Range("A2").Resize(len(data_rows), len(header)).Value = data_rows # 设置Updated列为日期格式 col_index = lta_df.columns.get_loc('Updated') + 1 ws.Range(f"{chr(64+col_index)}:{chr(64+col_index)}").NumberFormat = "yyyy-mm-dd hh:mm:ss"
错误原因解析
DataFrame.to_records()返回的是numpy结构化数组,其中datetime64类型的存储格式和win32com期望的序列长度不匹配。win32com在处理Python序列时,会依赖元素的内存大小计算缓冲区长度,但numpy结构化数组的内存布局和原生Python列表差异较大,导致内部解析时出现长度不匹配的错误。
内容的提问来源于stack exchange,提问作者Vighneshwar Jaiswal
相关产品推荐
相关产品推荐

