python
import pymysql
import openpyxl
import unicodedata
from openpyxl import Workbook
from openpyxl.styles import Font, PatternFill, Alignment, Border, Side
from openpyxl.utils import get_column_letter
# ===================== 请您修改以下MySQL连接配置 =====================
MYSQL_CONFIG = {
'host': '*', # 数据库地址
'port': 33061, # 端口
'user': 'root', # 账号
'password': '***H', # 密码(请替换为您的实际密码)
'database': '*', # 要导出的数据库名(请替换)
'charset': 'utf8mb4'
}
# ======================================================================
# 列宽自动计算函数(适配中文/英文)
def display_width(text):
return sum(2 if unicodedata.east_asian_width(c) in ('F','W') else 1 for c in str(text or ''))
def auto_fit_columns(ws, min_w=8, max_w=50, padding=3):
for col_cells in ws.columns:
letter = col_cells[0].column_letter
w = max((display_width(c.value) for c in col_cells
if not isinstance(c, openpyxl.cell.cell.MergedCell) and c.value is not None), default=0)
ws.column_dimensions[letter].width = max(min_w, min(w * 1.1 + padding, max_w))
# 样式定义
# 表头样式
header_fill = PatternFill('solid', fgColor='0070C0')
header_font = Font(name='Arial', bold=True, color='FFFFFF', size=11)
center_align = Alignment(horizontal='center', vertical='center')
left_align = Alignment(horizontal='left', vertical='center')
# 数据行样式
thin_gray = Side(style='thin', color='D9D9D9')
h_border = Border(bottom=thin_gray)
ZEBRA_BLUE = 'EBF1F8'
WHITE = 'FFFFFF'
# 1. 连接MySQL数据库
conn = pymysql.connect(**MYSQL_CONFIG)
cursor = conn.cursor()
# 2. 获取数据库所有表名
cursor.execute("SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = %s", (MYSQL_CONFIG['database'],))
tables = [table[0] for table in cursor.fetchall()]
# 3. 创建Excel工作簿
wb = Workbook()
# 删除默认创建的Sheet
wb.remove(wb.active)
# 4. 定义表头(与您的示例完全一致)
headers = ['序号', '列名', '数据类型', '长度', '主键', '自增', '允许空', '默认值', '列说明']
# 5. 遍历每个表,创建Sheet并写入数据
for table_name in tables:
# 创建Sheet,名称为表名
ws = wb.create_sheet(title=table_name)
# 写入表头
for col_idx, header in enumerate(headers, 1):
cell = ws.cell(row=1, column=col_idx, value=header)
cell.font = header_font
cell.fill = header_fill
cell.alignment = center_align
cell.border = h_border
ws.row_dimensions[1].height = 25
# 查询表结构信息
sql = """
SELECT
COLUMN_NAME,
DATA_TYPE,
CHARACTER_MAXIMUM_LENGTH,
COLUMN_KEY,
EXTRA,
IS_NULLABLE,
COLUMN_DEFAULT,
COLUMN_COMMENT
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_SCHEMA = %s AND TABLE_NAME = %s
ORDER BY ORDINAL_POSITION
"""
cursor.execute(sql, (MYSQL_CONFIG['database'], table_name))
columns = cursor.fetchall()
# 写入数据行
for row_idx, col_info in enumerate(columns, 2):
# 序号
ws.cell(row=row_idx, column=1, value=row_idx-1).alignment = center_align
# 列名
ws.cell(row=row_idx, column=2, value=col_info[0]).alignment = left_align
# 数据类型
ws.cell(row=row_idx, column=3, value=col_info[1]).alignment = left_align
# 长度
ws.cell(row=row_idx, column=4, value=col_info[2] if col_info[2] else '').alignment = center_align
# 主键
is_primary = '是' if col_info[3] == 'PRI' else '否'
ws.cell(row=row_idx, column=5, value=is_primary).alignment = center_align
# 自增
is_auto_increment = '是' if 'auto_increment' in col_info[4] else '否'
ws.cell(row=row_idx, column=6, value=is_auto_increment).alignment = center_align
# 允许空
is_nullable = '是' if col_info[5] == 'YES' else '否'
ws.cell(row=row_idx, column=7, value=is_nullable).alignment = center_align
# 默认值
ws.cell(row=row_idx, column=8, value=col_info[6] if col_info[6] else '').alignment = left_align
# 列说明
ws.cell(row=row_idx, column=9, value=col_info[7] if col_info[7] else '').alignment = left_align
# 交替背景色
bg = ZEBRA_BLUE if (row_idx-2) % 2 == 0 else WHITE
fill = PatternFill('solid', fgColor=bg)
for col in range(1, 10):
ws.cell(row=row_idx, column=col).fill = fill
ws.cell(row=row_idx, column=col).border = h_border
# 自动调整列宽
auto_fit_columns(ws)
# 冻结表头
ws.freeze_panes = 'A2'
# 6. 保存Excel文件
output_file = f"{MYSQL_CONFIG['database']}_表结构导出.xlsx"
wb.save(output_file)
# 7. 关闭连接
cursor.close()
conn.close()
print(f"导出完成!文件已保存为:{output_file}")
print(f"共导出 {len(tables)} 个表,每个表对应一个独立Sheet")
将数据库按照这种格式导出来
