208 lines
8.2 KiB
Python
208 lines
8.2 KiB
Python
#!/usr/bin/env python
|
|
# -*- encoding: utf-8 -*-
|
|
"""
|
|
Topic: 通过一个schema.sql来生成excel表格的数据库设计文档
|
|
Desc :
|
|
"""
|
|
from openpyxl import Workbook
|
|
from openpyxl import load_workbook
|
|
from openpyxl.compat import range
|
|
from openpyxl.cell import get_column_letter
|
|
from openpyxl.drawing import Image
|
|
from openpyxl.writer.dump_worksheet import WriteOnlyCell
|
|
from openpyxl.comments import Comment
|
|
from openpyxl.styles import Style, PatternFill, Border, Side, Alignment, Protection, Font, Color
|
|
from openpyxl.styles import colors, borders, fills
|
|
|
|
|
|
def load_xlsx():
|
|
wb = Workbook()
|
|
ws = wb.active
|
|
ws.title = "首页列表"
|
|
ws = wb['首页列表']
|
|
print(wb.get_sheet_names())
|
|
print(ws['D5'], ws.cell(row=5, column=4))
|
|
cell_range = ws['A1':'C2']
|
|
|
|
wb2 = load_workbook('D:/work/MySQL数据库表.xlsx')
|
|
print(wb2.get_sheet_names())
|
|
|
|
|
|
def write_xlsx():
|
|
wb = Workbook()
|
|
dest_filename = 'empty_book.xlsx'
|
|
ws = wb.active
|
|
ws.title = "首页列表"
|
|
for col_idx in range(1, 10):
|
|
col = get_column_letter(col_idx)
|
|
for row in range(1, 20):
|
|
ws['%s%s' % (col, row)].value = '%s%s' % (col, row)
|
|
ws.merge_cells('A1:B1') # 合并单元格
|
|
ws.unmerge_cells('A1:B1')
|
|
ws = wb.create_sheet()
|
|
ws.title = 'Pi'
|
|
ws['F5'] = 3.14
|
|
# img = Image('logo.png')
|
|
# img.drawing.top = 100
|
|
# img.drawing.left = 150
|
|
|
|
wb.save(filename=dest_filename)
|
|
|
|
wb = load_workbook(filename='empty_book.xlsx')
|
|
sheet_ranges = wb['首页列表']
|
|
print(sheet_ranges['D18'].value)
|
|
|
|
|
|
def write_only():
|
|
wb = Workbook()
|
|
ws = wb.create_sheet()
|
|
ws.title = "首页列表"
|
|
c = ws['A1']
|
|
c.style = Style(font=Font(name='Courrier', size=36)
|
|
, fill=PatternFill(fill_type=None, start_color='FFFFFFFF',
|
|
end_color='FF000000')
|
|
, protection=Protection(locked='inherit', hidden='inherit')
|
|
, alignment=Alignment(horizontal='general', vertical='bottom',
|
|
shrink_to_fit=True)
|
|
, border=Border(left=Side(border_style=None, color='FF000000')))
|
|
c.value = '姓名'
|
|
# cell = WriteOnlyCell(ws, value="hello world")
|
|
# cell.style = Style(font=Font(name='Courrier', size=36))
|
|
# cell.comment = Comment(text="A comment", author="Author's Name")
|
|
|
|
# ws.header_footer.center_header.text = 'My Excel Page'
|
|
# ws.header_footer.center_header.font_size = 14
|
|
# ws.header_footer.center_header.font_name = "Tahoma,Bold"
|
|
# ws.header_footer.center_header.font_color = "CC3366"
|
|
wb.save(filename='empty_book.xlsx')
|
|
|
|
|
|
def load_schema(filename):
|
|
"""先加载schema.sql文件来获取所有建表语句"""
|
|
result = []
|
|
with open(filename, encoding='utf-8') as sqlfile:
|
|
each_table = [] # 每张表定义
|
|
for line in sqlfile:
|
|
if line.startswith('--'):
|
|
each_table.insert(0, line.split('--')[1].strip())
|
|
elif 'DROP TABLE' in line:
|
|
each_table.insert(1, line.strip().split()[-1][:-1])
|
|
elif ' COMMENT ' in line and 'ENGINE=' not in line:
|
|
col_arr = line.split()
|
|
col_name = col_arr[0]
|
|
col_type = col_arr[1]
|
|
if 'PRIMARY KEY' in line or 'NOT NULL' in line:
|
|
col_null = 'NOT NULL'
|
|
else:
|
|
col_null = ''
|
|
col_remark = col_arr[-1]
|
|
each_table.append((col_name, col_type, col_null, col_remark))
|
|
elif 'ENGINE=' in line:
|
|
# 单个表定义结束
|
|
result.append(list(each_table))
|
|
each_table.clear()
|
|
return result
|
|
|
|
|
|
def write_dest(xlsx_name, schema_name):
|
|
border = Border(
|
|
left=Side(border_style=borders.BORDER_THIN, color='FF000000'),
|
|
right=Side(border_style=borders.BORDER_THIN, color='FF000000'),
|
|
top=Side(border_style=borders.BORDER_THIN, color='FF000000'),
|
|
bottom=Side(border_style=borders.BORDER_THIN, color='FF000000')
|
|
)
|
|
alignment = Alignment(horizontal='justify', vertical='bottom',
|
|
text_rotation=0, wrap_text=False,
|
|
shrink_to_fit=True, indent=0)
|
|
fill = PatternFill(fill_type=None, start_color='FFFFFFFF')
|
|
# 基本的样式
|
|
basic_style = Style(font=Font(name='Microsoft YaHei')
|
|
, border=border, alignment=alignment
|
|
, fill=fill)
|
|
title_style = basic_style.copy(
|
|
font=Font(name='Microsoft YaHei', b=True, size=20, color='00215757'),
|
|
alignment=Alignment(horizontal='center', vertical='bottom',
|
|
text_rotation=0, wrap_text=False,
|
|
shrink_to_fit=True, indent=0),
|
|
fill=PatternFill(fill_type=fills.FILL_SOLID, start_color='00B2CBED'))
|
|
header_style = basic_style.copy(
|
|
font=Font(name='Microsoft YaHei', b=True, size=15, color='00215757'),
|
|
fill=PatternFill(fill_type=fills.FILL_SOLID, start_color='00BAA87F'))
|
|
common_style = basic_style.copy()
|
|
link_style = basic_style.copy(font=Font(
|
|
name='Microsoft YaHei', color=colors.BLUE, underline='single'))
|
|
table_data = load_schema(schema_name)
|
|
wb = Workbook()
|
|
wb.active.title = "首页列表"
|
|
|
|
for table in table_data:
|
|
ws = wb.create_sheet(title=table[0])
|
|
ws.merge_cells('E3:H3') # 合并单元格
|
|
ws['E3'].style = title_style
|
|
ws['F2'].style = Style(border=Border(
|
|
bottom=Side(border_style=borders.BORDER_THIN, color='FF000000')))
|
|
ws['G2'].style = Style(border=Border(
|
|
bottom=Side(border_style=borders.BORDER_THIN, color='FF000000')))
|
|
ws['H2'].style = Style(border=Border(
|
|
bottom=Side(border_style=borders.BORDER_THIN, color='FF000000')))
|
|
ws['I3'].style = Style(border=Border(
|
|
left=Side(border_style=borders.BORDER_THIN, color='FF000000')))
|
|
ws['E3'] = table[0]
|
|
ws['E4'].style = header_style
|
|
ws['E4'] = '列名'
|
|
ws['F4'].style = header_style
|
|
ws['F4'] = '类型'
|
|
ws['G4'].style = header_style
|
|
ws['G4'] = '空值约束'
|
|
ws['H4'].style = header_style
|
|
ws['H4'] = '备注'
|
|
ws.column_dimensions['E'].width = 20
|
|
ws.column_dimensions['F'].width = 20
|
|
ws.column_dimensions['G'].width = 16
|
|
ws.column_dimensions['H'].width = 45
|
|
for idx, each_column in enumerate(table[2:]):
|
|
ws['E{}'.format(idx + 5)].style = common_style
|
|
ws['E{}'.format(idx + 5)] = each_column[0]
|
|
ws['F{}'.format(idx + 5)].style = common_style
|
|
ws['F{}'.format(idx + 5)] = each_column[1]
|
|
ws['G{}'.format(idx + 5)].style = common_style
|
|
ws['G{}'.format(idx + 5)] = each_column[2]
|
|
ws['H{}'.format(idx + 5)].style = common_style
|
|
ws['H{}'.format(idx + 5)] = each_column[3].strip().split('\'')[1]
|
|
ws = wb['首页列表']
|
|
ws.merge_cells('D3:F3')
|
|
ws['D3'].style = title_style
|
|
ws['E2'].style = Style(border=Border(
|
|
bottom=Side(border_style=borders.BORDER_THIN, color='FF000000')))
|
|
ws['F2'].style = Style(border=Border(
|
|
bottom=Side(border_style=borders.BORDER_THIN, color='FF000000')))
|
|
ws['G3'].style = Style(border=Border(
|
|
left=Side(border_style=borders.BORDER_THIN, color='FF000000')))
|
|
ws['D3'] = '贷快发数据库系统表'
|
|
ws['D4'].style = header_style
|
|
ws['D4'] = '编号'
|
|
ws['E4'].style = header_style
|
|
ws['E4'] = '表名'
|
|
ws['F4'].style = header_style
|
|
ws['F4'] = '详情链接'
|
|
ws.column_dimensions['D'].width = 15
|
|
ws.column_dimensions['E'].width = 25
|
|
ws.column_dimensions['F'].width = 35
|
|
for inx, val in enumerate(table_data):
|
|
ws['D{}'.format(inx + 5)].style = common_style
|
|
ws['D{}'.format(inx + 5)] = inx + 1
|
|
ws['E{}'.format(inx + 5)].style = common_style
|
|
ws['E{}'.format(inx + 5)] = val[1]
|
|
linkcell = ws['F{}'.format(inx + 5)]
|
|
linkcell.style = link_style
|
|
linkcell.value = val[0]
|
|
linkcell.hyperlink = '#{0}!{1}'.format(val[0], 'E3')
|
|
wb.save(filename=xlsx_name)
|
|
|
|
|
|
if __name__ == '__main__':
|
|
# write_xlsx()
|
|
# write_only()
|
|
write_dest('贷快发数据库设计.xlsx', 'schema.sql')
|
|
pass
|