экспортировать SQL в Excel с помощью Pandas, как сделать выпадающий список? - PullRequest
3 голосов
/ 29 марта 2019

У меня есть простая таблица 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 файлы, используя Python и Pandas, например так:

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_Picture

Я, конечно, мог бы зайти в Excel и сделать это длякаждый файл, но, как я уверен, вы можете сказать, что это просто пример данных.Я собираюсь делать тысячи файлов Excel.

Как я могу использовать то, что у меня есть в Python, сделать один из столбцов выпадающим, как на моем рисунке?Есть ли какая-то опция шаблона, которой я могу воспользоваться, я открыт для всего.У меня есть контроль над данными SQL, поэтому я могу добавлять значения, если это помогает сделать это проще.Заранее спасибо!

1 Ответ

0 голосов
/ 29 марта 2019

Мне не удалось использовать 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]))

enter image description here

Вероятно, есть более разумный способ сделать это, но для экспорта и доставки одним выстрелом это прекрасно работает!В этом примере раскрывающиеся списки проходят весь лист вниз до указанного номера строки.Я также поместил два разных раскрывающихся списка в этом примере.Спасибо, что указали мне правильное направление, ребята!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...