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

Python提取Excel写入SQL Server返回数值异常求助

Python Excel数据提取至SQL Server的Oil值异常问题解决

问题说明

SQL Server表字段定义:

  • Well Name: varchar
  • Date: date
  • Oil: float

Excel数据位置:

  • 井名存于B44行
  • 原油值存于B78行(部分为空或0)

当前问题:提取后所有Oil值均为Null,不符合预期——仅无值/Null记录需跳过,有效数值需保留。

现有代码示例

import pandas as pd
import pyodbc

# 读取Excel文件
excel_data = pd.read_excel("well_production.xlsx", header=None)
well_name = excel_data.iloc[43, 1]  # B44行对应索引(43,1)
oil_val = excel_data.iloc[77, 1]    # B78行对应索引(77,1)

# 连接SQL Server
conn_str = "DRIVER={SQL Server};SERVER=your_server;DATABASE=your_db;UID=your_user;PWD=your_pwd"
conn = pyodbc.connect(conn_str)
cursor = conn.cursor()

# 处理Oil值逻辑
if not oil_val:
    oil_val = None

# 插入数据
insert_sql = """INSERT INTO WellProduction ([Well Name], [Date], [Oil]) VALUES (?, GETDATE(), ?)"""
cursor.execute(insert_sql, well_name, oil_val)
conn.commit()

# 关闭连接
cursor.close()
conn.close()

当前输出

SQL表中所有记录的Oil字段均为NULL,包括Excel中B78行存在有效数值的情况。

预期输出

  • Excel中B78行为空/无值时:Oil字段存NULL或跳过该记录
  • Excel中B78行为有效数值(含0,若业务认定0为有效)时:Oil字段保留对应数值

问题根源与解决方法

问题根源

代码中if not oil_val:的判断逻辑存在缺陷:在Python中,数值0的布尔值为False,会被误判为空值,进而被设置为None,导致所有Oil值写入SQL时都变成NULL。

修正方案

调整Oil值的判断逻辑,仅将真正的空值(如pd.NA、None、空字符串)设为None,保留有效数值(包括0,若业务允许):

# 修正后的Oil值处理逻辑
if pd.isna(oil_val) or oil_val == '':
    oil_val = None
# 若业务认定0为无效值,需设为NULL则添加判断:
# if pd.isna(oil_val) or oil_val == '' or oil_val == 0:
#     oil_val = None

完整修正代码

import pandas as pd
import pyodbc

# 读取Excel文件
excel_data = pd.read_excel("well_production.xlsx", header=None)
well_name = excel_data.iloc[43, 1]
oil_val = excel_data.iloc[77, 1]

# 连接SQL Server
conn_str = "DRIVER={SQL Server};SERVER=your_server;DATABASE=your_db;UID=your_user;PWD=your_pwd"
conn = pyodbc.connect(conn_str)
cursor = conn.cursor()

# 修正后的空值判断
if pd.isna(oil_val) or oil_val == '':
    oil_val = None

# 若需跳过空值记录,可添加判断:if oil_val is not None: 再执行插入
insert_sql = """INSERT INTO WellProduction ([Well Name], [Date], [Oil]) VALUES (?, GETDATE(), ?)"""
cursor.execute(insert_sql, well_name, oil_val)
conn.commit()

cursor.close()
conn.close()

验证结果

修正后,Excel中B78行的有效数值(包括0,若未额外排除)会被正确写入SQL的Oil字段,仅空值/无值的情况会被设为NULL或跳过(若添加跳过逻辑)。

内容的提问来源于stack exchange,提问作者Justin Massaro

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 06:36:17