先来看下代码,需求注释在代码中;
代码功能及运行步骤:
1.获取word文件路径(模板)。
2.获取excel文件路径(数据维护)。
3.用excel内的数据,批量添加、替换模板中的内容来生成文件,解决冗长重复性劳动。
#库
import xlrd
import tkinter as tk
import ttkbootstrap as ttk
from docx import *
from tkinter import *
from tkinter import filedialog
from docx.shared import Pt, Inches
from docx.enum.text import WD_PARAGRAPH_ALIGNMENT
from ttkbootstrap import Style
from ttkbootstrap.constants import *
root = tk.Tk()
#窗口设置(固定位置、大小、美化)
sw = root.winfo_screenwidth()
sh = root.winfo_screenheight()
ww = 450
wh = 280
x = (sw-ww) / 2
y = (sh-wh) / 2
root.geometry("%dx%d+%d+%d" % (ww, wh, x, y))
root.title("批量制作岗位卡")
root.minsize(450, 280)
root.maxsize(450, 280)
style = Style(theme='litera')
window = style.master
#打开word文件(模板)
def selectdocx():
global filepath
filepath = filedialog.askopenfilename(filetypes=[('docx', '*.docx')])
filename.set(filepath)
#打开excel文件(数据维护)
def selectxls():
global filepath1
filepath1 = filedialog.askopenfilename(filetypes=[('xls', '*.xls')])
filename1.set(filepath1)
filename = tk.StringVar()
filename1 = tk.StringVar()
#按钮设置
tk.Label(root, text='选择word文件(.docx)').grid(
row=1, column=2, padx=5, pady=5, sticky="w")
tk.Entry(root, textvariable=filename).grid(row=1, column=0, padx=5, pady=5)
b1 = ttk.Button(root, text='打开文件', bootstyle=(INFO, OUTLINE),
command=selectdocx).grid(row=1, column=1, padx=5, pady=5)
tk.Label(root, text='选择excel文件(.xls) *注意文件格式').grid(row=2,
column=2, padx=5, pady=5, sticky="w")
tk.Entry(root, textvariable=filename1).grid(row=2, column=0, padx=5, pady=5)
b2 = ttk.Button(root, text='打开文件', bootstyle=(INFO, OUTLINE),
command=selectxls).grid(row=2, column=1, padx=5, pady=5)
'''
现状:
代码可正常运行,但运行逻辑和按钮b3存在问题;
b3 无法command 到 change_data 这个主程序,因此现在只能将 change_data 的代码放到 tkinter 代码的下方;
且让 b3 按钮暂时 command " root.quit ",这样程序选择好文件路径后,窗口消失,再运行了主程序。
(但这绝对是错误的逻辑)
需求:
纠正逻辑
将 change_data 主程序代码放到 tkinter 代码上方,且b3 按钮正确 command 到 change_data (主程序)
希望聪明善良的热心网友可以附上代码解决问题!
PS:若有闲情雅致,优化一下我的主程序,那是极好的!
'''
b3 = ttk.Button(root, text='开始运行', bootstyle=(PRIMARY, OUTLINE),
command=root.quit).grid(row=3, column=1, padx=5, pady=5)
root.mainloop()
#主程序:
def change_data(wjbh, hh, pm, gd, zw, zlbz, lb, bz, bzgg, bzd, sl):
bz = str(bz)
lb = str(lb)
bzgg = str(bzgg)
bzd = str(bzd)
sl = str(sl)
pm = str(pm)
document = Document(filepath)
for i in document.paragraphs:
i.text = i.text.replace('***', gd)
i.text = i.text.replace('&&&', zw)
i.text = i.text.replace('¥¥¥', zlbz)
i.text = i.text.replace('#', bz)
i.text = i.text.replace('&-&-&', bzgg)
i.text = i.text.replace('*-*-*', bzd)
i.text = i.text.replace('¥-¥-¥', sl)
i.paragraph_format.line_spacing = 1.25
i.paragraph_format.left_indent = Inches(0.15)
head = document.sections[0].header
for b in head.paragraphs:
b.text = b.text.replace('@', pm)
b.text = b.text.replace('=', hh)
for q in b.runs:
q.font.size = Pt(12)
q.font.bold = True
w = head.paragraphs[0].add_run('公司')
w.font.bold = True
w.font.size = Pt(14)
e = head.paragraphs[1].add_run('操作卡')
e.font.bold = True
e.font.size = Pt(22)
head.paragraphs[0].alignment = WD_PARAGRAPH_ALIGNMENT.CENTER
head.paragraphs[1].alignment = WD_PARAGRAPH_ALIGNMENT.CENTER
head.paragraphs[2].alignment = WD_PARAGRAPH_ALIGNMENT.DISTRIBUTE
foot = document.sections[0].footer
k = foot.paragraphs[0].add_run(wjbh)
k.font.size = Pt(8)
foot.paragraphs[0].alignment = WD_PARAGRAPH_ALIGNMENT.RIGHT
document.save(lb + pm + gd + '#' + bz + '.docx')
excel = xlrd.open_workbook(filepath1)
table = excel.sheet_by_index(0)
nows = table.nrows
for i in range(nows):
wjbh = table.cell(i, 0).value
hh = table.cell(i, 1).value
pm = table.cell(i, 2).value
gd = table.cell(i, 3).value
zw = table.cell(i, 4).value
zlbz = table.cell(i, 5).value
lb = table.cell(i, 6).value
bz = table.cell(i, 7).value
bzgg = table.cell(i, 8).value
bzd = table.cell(i, 9).value
sl = table.cell(i, 10).value
change_data(wjbh, hh, pm, gd, zw, zlbz, lb, bz, bzgg, bzd, sl)