首页 > 解决方案 > 使用 Pandas 将 SQL 导出到 Excel,如何进行下拉?

问题描述

我有一个简单的 MSSQL 表,其中包含如下数据:


IF OBJECT_ID('MY_BIG_TABLE') IS NOT NULL
    DROP TABLE [dbo].[MY_BIG_TABLE]

CREATE TABLE [dbo].[MY_BIG_TABLE](
    [ID] [int] NOT NULL,
    [PERSON] [varchar](50) NOT NULL,
    [STREET] [varchar](50) NOT NULL,
    [PHONE] [varchar](50) NOT NULL,
    [BATCH_ID] [int] NOT NULL
) ON [PRIMARY]
GO

INSERT INTO MY_BIG_TABLE (ID, PERSON, STREET, PHONE, BATCH_ID)
VALUES 
    (1, 'BOB', 'MAIN STREET', '555-555-5555', 100),
    (2, 'SANDY', 'ELM', '666-555-5555', 100),
    (3, 'FRED', 'PINE', '777-555-5555', 200),
    (8, 'BOB', 'DIRT', '888-555-5555', 200),
    (52, 'GEORGE', 'RIVER ROAD', '999-555-5555', 700)

我正在使用以下方式将数据从中导出到Excel文件PythonPandas

import pypyodbc
import pandas

def main():

    server_name = "SERVER_NAME"
    database = "TEST_DATABASE"

    connection = pypyodbc.connect(
        "Driver={SQL Server};"
        "Server=" + server_name + ";"
        "Database=" + database + ";"
        "Trusted_Connection=yes;"
        )


    batch_id_list = [100,200,700]

    for batch_id in batch_id_list:
            print ("--------------------------------------------")
            print ("".join(["reading batch_id:", str(batch_id)]))
            file_name = "".join(["EXPORT_", str(batch_id), ".xlsx"])
            the_sql = """
            SELECT * FROM
            MY_BIG_TABLE
            WHERE BATCH_ID = ?"""
            data = pandas.read_sql(the_sql, connection, params=[batch_id])
            print ("".join(["writing batch_id:", str(batch_id)]))
            data.to_excel("".join(["c:/temp/", file_name]))

if __name__ == "__main__":
    main()

我得到了一小堆 Excel 文件。每个文件BATCH_ID都加载了所有这些结果。效果很好。我需要做的是让其中一列成为 Excel 下拉列表,如下所示:

Excel_图片

我当然可以进入 Excel 并为每个文件制作它,但我相信你可以说这只是示例数据。我将制作数千个 Excel 文件。

如何使用我在 Python 中拥有的内容使其中一列像我在图片中所拥有的那样下拉?是否有某种模板选项我可以利用,我对任何事情都持开放态度。我可以控制 SQL 数据,因此如果这有助于使其更容易,我可以添加值。提前致谢!

标签: pythonsql-serverexcelpandas

解决方案


我无法使用Pandas添加下拉菜单,但我能够重新读取文件,更新它,然后将其写回,如下所示:

from openpyxl.worksheet.datavalidation import DataValidation
from openpyxl import load_workbook

def add_drop_down(file_path, file_name, row_total):
    print("adding drop down")
    wb = load_workbook("".join([file_path, file_name]))
    ws = wb['Sheet1']
    ws['S2'] = 'Yes'
    ws['S3'] = 'No'
    ws['S4'] = 'Maybe'
    ws['S5'] = 'OK'
    ws['S6'] = 'Not OK'
    ws['S7'] = 'Check'

    ws['T2'] = 'What1'
    ws['T3'] = 'What2'
    ws['T4'] = 'What3'

    current_row = 2
    while current_row < row_total + 2:
        data_val_results = DataValidation(type="list",formula1='=S2:S7')
        data_val_status = DataValidation(type="list",formula1='=T2:T4')

        ws.add_data_validation(data_val_results)
        ws.add_data_validation(data_val_status)

        row_results = "".join(["O", str(current_row)])
        row_status = "".join(["P", str(current_row)])

        data_val_results.add(ws[row_results])
        data_val_status.add(ws[row_status])

        current_row += 1
    wb.save("".join([file_path, file_name]))

在此处输入图像描述

可能有一种更聪明的方法可以做到这一点,但是对于一次性出口和运输来说,这很好用!在此示例中,下拉菜单一直沿工作表向下直至指定的行号。在此示例中,我还放置了两个不同的下拉菜单。感谢您为我指明正确的方向!


推荐阅读