104e4d2f
“wangming”
feat: 增强门店数据分析功能,...
|
1
2
3
|
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
|
a2653749
“wangming”
整理项目文件结构:将md、sh、p...
|
4
|
生成2025年12月客户开单数据Excel文件
|
104e4d2f
“wangming”
feat: 增强门店数据分析功能,...
|
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
包含字段:客户档案号、姓名、注册时间、来源、开单业绩、时间、归属门店
"""
import pymysql
import pandas as pd
from datetime import datetime
import os
# 数据库配置(从appsettings.json读取)
DB_CONFIG = {
'host': 'rm-2vccze142rc9a8f58bo.mysql.cn-chengdu.rds.aliyuncs.com',
'port': 3306,
'user': 'lvqiansql',
'password': 'LvQ1@n!20251211',
'database': 'lqerp_dev',
'charset': 'utf8mb4'
}
def query_data():
|
a2653749
“wangming”
整理项目文件结构:将md、sh、p...
|
24
|
"""查询2025年12月的客户开单数据"""
|
104e4d2f
“wangming”
feat: 增强门店数据分析功能,...
|
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
|
connection = None
try:
connection = pymysql.connect(**DB_CONFIG)
sql = """
SELECT
COALESCE(kh.dah, '') AS 客户档案号,
COALESCE(kh.khmc, '') AS 姓名,
kh.zcsj AS 注册时间,
COALESCE(kd.khly, '') AS 来源,
CAST(kd.sfyj AS DECIMAL(18,2)) AS 开单业绩,
kd.kdrq AS 时间,
COALESCE(md.dm, '') AS 归属门店
FROM lq_kd_kdjlb kd
INNER JOIN lq_khxx kh ON kd.kdhy = kh.F_Id
LEFT JOIN lq_mdxx md ON kh.gsmd = md.F_Id
WHERE kd.F_IsEffective = 1
AND kh.F_IsEffective = 1
AND YEAR(kd.kdrq) = 2025
|
a2653749
“wangming”
整理项目文件结构:将md、sh、p...
|
44
|
AND MONTH(kd.kdrq) = 12
|
104e4d2f
“wangming”
feat: 增强门店数据分析功能,...
|
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
|
ORDER BY kd.kdrq DESC
"""
df = pd.read_sql(sql, connection)
# 格式化时间字段
if '注册时间' in df.columns:
df['注册时间'] = pd.to_datetime(df['注册时间']).dt.strftime('%Y-%m-%d %H:%M:%S')
df['注册时间'] = df['注册时间'].replace('NaT', '')
if '时间' in df.columns:
df['时间'] = pd.to_datetime(df['时间']).dt.strftime('%Y-%m-%d %H:%M:%S')
# 确保开单业绩为数值类型
df['开单业绩'] = pd.to_numeric(df['开单业绩'], errors='coerce').fillna(0)
return df
except Exception as e:
print(f"查询数据时发生错误: {e}")
raise
finally:
if connection:
connection.close()
|
a2653749
“wangming”
整理项目文件结构:将md、sh、p...
|
70
|
def generate_excel(df, output_file='2025年12月客户开单数据.xlsx'):
|
104e4d2f
“wangming”
feat: 增强门店数据分析功能,...
|
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
|
"""生成Excel文件"""
try:
# 创建Excel写入器
with pd.ExcelWriter(output_file, engine='openpyxl') as writer:
df.to_excel(writer, sheet_name='客户开单数据', index=False)
# 获取工作表对象进行格式设置
worksheet = writer.sheets['客户开单数据']
# 设置列宽
column_widths = {
'A': 20, # 客户档案号
'B': 15, # 姓名
'C': 20, # 注册时间
'D': 15, # 来源
'E': 15, # 开单业绩
'F': 20, # 时间
'G': 20 # 归属门店
}
for col, width in column_widths.items():
worksheet.column_dimensions[col].width = width
# 设置表头样式
from openpyxl.styles import Font, Alignment, PatternFill
header_fill = PatternFill(start_color='4472C4', end_color='4472C4', fill_type='solid')
header_font = Font(bold=True, color='FFFFFF', size=11)
for cell in worksheet[1]:
cell.fill = header_fill
cell.font = header_font
cell.alignment = Alignment(horizontal='center', vertical='center')
# 设置数据对齐方式
for row in worksheet.iter_rows(min_row=2, max_row=worksheet.max_row):
for cell in row:
if cell.column_letter == 'E': # 开单业绩列右对齐
cell.alignment = Alignment(horizontal='right', vertical='center')
else:
cell.alignment = Alignment(horizontal='left', vertical='center')
print(f"Excel文件已生成: {output_file}")
print(f"共 {len(df)} 条记录")
return output_file
except Exception as e:
print(f"生成Excel文件时发生错误: {e}")
raise
def main():
"""主函数"""
|
a2653749
“wangming”
整理项目文件结构:将md、sh、p...
|
123
|
print("开始查询2025年12月客户开单数据...")
|
104e4d2f
“wangming”
feat: 增强门店数据分析功能,...
|
124
125
126
127
128
129
130
131
132
133
134
|
df = query_data()
if df.empty:
print("未查询到数据")
return
print(f"查询到 {len(df)} 条记录")
print("\n前5条数据预览:")
print(df.head())
# 生成Excel文件
|
a2653749
“wangming”
整理项目文件结构:将md、sh、p...
|
135
|
output_file = f"2025年12月客户开单数据_{datetime.now().strftime('%Y%m%d_%H%M%S')}.xlsx"
|
104e4d2f
“wangming”
feat: 增强门店数据分析功能,...
|
136
137
138
139
140
141
|
generate_excel(df, output_file)
print(f"\n文件保存路径: {os.path.abspath(output_file)}")
if __name__ == '__main__':
main()
|