You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 04:08:12