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

Python读取Excel提取字符串单元格并执行查询失败求助

问题描述

我上传了一份Excel文件,需要把文件中每个单元格的值提取为str对象,再针对每个单元格值执行查询操作,但目前代码无法正常运行。

我的代码
def read_agent_list(request):
    request.session.clear_expired()
    
    if request.is_ajax():
        if request.method == "POST":
            userfile = request.FILES['userfile'].read()  
            df = pd.read_excel(userfile,header=0)
            df=df.fillna('')
            df=df.astype(str)
            

            for index, row in df.iterrows():
                agentcode=tuple(list(df['Agentcode']) )
                agentlist=df.apply(lambda x: x.str.strip())
                qry=getData("""
                SELECT U.USER_ID AS AGENTCODE""".format()

                dff=getViaData(qry)
代码里的明显问题
  • 语法错误:qry=getData("""SELECT ...""".format()这里括号不匹配,format()缺右括号,SQL字符串也没闭合,直接会抛出语法异常。
  • SQL语句无效:SELECT U.USER_ID AS AGENTCODE没有指定表名,也没有关联Excel里的agentcode条件,等于没做有效查询;而且format()调用没有传入任何参数,完全是多余的。
  • 循环逻辑浪费:在iterrows循环里每次都重新提取整个DataFrame的Agentcode转元组,还重复对整个df做strip处理,完全没必要,应该在循环外统一处理数据。
  • 参数未传入:查询语句根本没用到从Excel里提取的agentcode,等于没把Excel数据作为查询条件。
修正后的代码示例
def read_agent_list(request):
    request.session.clear_expired()
    
    # 合并条件判断,简化代码
    if request.is_ajax() and request.method == "POST":
        userfile = request.FILES['userfile'].read()  
        df = pd.read_excel(userfile, header=0)
        
        # 一次性完成空值填充、转字符串、去除首尾空格的处理
        df = df.fillna('').astype(str).apply(lambda col: col.str.strip())
        
        # 提取有效Agentcode(排除空字符串)
        valid_agents = df['Agentcode'][df['Agentcode'] != ''].tolist()
        
        if valid_agents:
            # 用批量查询减少数据库请求(推荐),这里以MySQL参数化写法为例
            placeholders = ', '.join(['%s'] * len(valid_agents))
            # 必须补充你的实际表名,替换掉`你的用户表`
            qry = f"""
            SELECT U.USER_ID AS AGENTCODE
            FROM 你的用户表 U
            WHERE U.USER_ID IN ({placeholders})
            """
            # 假设getViaData支持传入参数列表,把agentcode作为参数传入
            dff = getViaData(qry, valid_agents)
        
        # 如果非要逐行查询(效率低,不推荐)
        # for agent in valid_agents:
        #     qry = """
        #     SELECT U.USER_ID AS AGENTCODE
        #     FROM 你的用户表 U
        #     WHERE U.USER_ID = %s
        #     """
        #     dff = getViaData(qry, (agent,))
关键注意事项
  • 必须补充SQL语句中的实际表名,否则查询无法执行。
  • 用参数化查询(不要直接拼接字符串),避免SQL注入风险。
  • 根据你使用的数据库类型,调整参数占位符(比如PostgreSQL用%s,SQL Server用?)。
  • 确认getViaData函数是否支持传入查询参数,若不支持需对应调整调用方式。

内容的提问来源于stack exchange,提问作者Ajitarth Gupta

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 15:35:24