我有一个简单的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并为每个文件创建它,但是我敢肯定,您可以说这只是示例数据。我将要制作数千个Excel文件。
如何使用Python中的内容使其中一列像图片中的内容一样下拉?有没有我可以利用的模板选项,我愿意接受任何东西。我可以控制SQL数据,因此可以添加值(如果有帮助的话)。预先感谢!
答案 0 :(得分:0)
我无法使用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]))
可能有一种更聪明的方法来执行此操作,但是对于一次导出和发送它,这很好用!在此示例中,下拉列表一直沿工作表一直延伸到指定的行号。在此示例中,我还放置了两个不同的下拉菜单。感谢您为我指出正确的方向!