#前提:同事的工作是每天做合同下单,每天要从好多个word中粘贴数据到excel太麻烦了,然后让帮忙看看能不能做一个.exe的程序,每次自动填写,需要手敲的地方在自行填写,也会方便很多,于是有了这篇~
需求:(1)要求两份word模板都能写入excel模板中(根据word表格数量来判断);
(2)从word中获取公司名称、地址、邮编等等信息写入excel右侧表格中(根据固定坐标写入);
(3)产品数量每次不同,需要识别每次有多少再写入到excel中(根据此表的行数使用循环);
(4)地址要求字符长度为17,大于17写入下一行(根据固定长度切割字符串);
(5)公司名称和地址的字符串长度显示出来(len()获取字符串长度)。
代码如下:
import docx
from docx import Document #导入读取word模块
import os
import os.path
import openpyxl
from openpyxl import * #导入读写excel模块
from pythonwin import win32ui #导入打开文件选择框模块
import re
#打开word文件
dlg = win32ui.CreateFileDialog(1) #1表示打开文件对话框
dlg.SetOFNInitialDir('C:/Users') #设置打开文件对话框中的初始显示目录
dlg.DoModal()
WordName = dlg.GetPathName() #获取选择的文件名称
WordPath = os.path.join(os.getcwd(),WordName) #获取选择的文件路径
doc = Document(WordPath) #读取word文档
#读取word中的表格
tables = doc.tables
a = len(doc.tables) #获取word中的表格数量
#打开excel文件
dlg = win32ui.CreateFileDialog(1) #1表示打开文件对话框
dlg.SetOFNInitialDir('C:/Users') #设置打开文件对话框中的初始显示目录
dlg.DoModal()
ExcelName = dlg.GetPathName() #获取选择的文件名称
ExcelPath = os.path.join(os.getcwd(),ExcelName) #获取选择的文件路径
excel = load_workbook(ExcelPath) #读取excel
table = excel.active #读取excel中的sheet1,.active为第一张表
#定义拆分地址的函数
def cut_text(text, lenth):
textArr = re.findall('.{' + str(lenth) + '}', text) #使用了re模块的findall功能
textArr.append(text[(len(textArr) * lenth):])
return textArr
#判断表格数量来区分word版本
if a > 3:
t = tables[5]
table.cell(2,6).value = t.cell(1,3).text.lstrip()
table.cell(4,4).value = t.cell(11,3).text.lstrip()
table.cell(6,4).value = t.cell(1,3).text.lstrip()
table.cell(10,4).value = t.cell(5,3).text.lstrip()
table.cell(13,4).value = t.cell(7,3).text.lstrip()
table.cell(14,4).value = t.cell(10,3).text.lstrip()
table.cell(15,4).value = t.cell(8,3).text.lstrip()
t2 = tables[3]
b = len(t2.rows)
x = [2,b-2]
y = [19,19+(b-4)]
#获取和写入产品型号和数量
for i,j in zip(x,y):
table.cell(j,2).value = t2.cell(i,1).text.lstrip()
table.cell(j,4).value = t2.cell(i,4).text.lstrip()
#字符串个数
table.cell(6,9).value = len(t.cell(1,3).text.lstrip())
table.cell(7,9).value = len(t.cell(3,3).text.lstrip())
#地址拆分
st = cut_text(t.cell(3,3).text,17)
c = len(st)
m = [0,c-1]
n = [7,7+c-1]
for l,k in zip(m,n):
table.cell(k,4).value = st[l]
else:
t = tables[1]
table.cell(2,6).value = t.cell(1,3).text.lstrip()
table.cell(4,4).value = t.cell(4,3).text.lstrip()
table.cell(6,4).value = t.cell(0,1).text.lstrip()
table.cell(10,4).value = t.cell(4,1).text.lstrip()
table.cell(13,4).value = t.cell(0,3).text.lstrip()
table.cell(14,4).value = t.cell(3,3).text.lstrip()
table.cell(15,4).value = t.cell(1,3).text.lstrip()
t2 = tables[0]
b = len(t2.rows)
x = [1,b-3]
y = [19,19+(b-4)]
for i,j in zip(x,y):
table.cell(j,2).value = t2.cell(i,1).text.lstrip()
table.cell(j,4).value = t2.cell(i,5).text.lstrip()
# 字符串个数
table.cell(6,9).value = len(t.cell(0,1).text.lstrip())
table.cell(7,9).value = len(t.cell(2,1).text.lstrip())
#地址拆分
st = cut_text(t.cell(2,1).text,17)
c = len(st)
m = [0,c-1]
n = [7,7+c-1]
for l, k in zip(m,n):
table.cell(k,4).value = st[l]
#保存成新的文件(默认的保存位置为.py的文件位置)
excel.save('new.xlsx')
把.py打包成.exe文件的命令(这样别人可以直接使用.exe文件运行而无需安装python环境)
pyinstaller -w -F word.py -p "D:\software install\Python\project\venv\Lib\site-packages"
注:-w是不显示命令窗口
-F是.py的名称
-p为导入模块的路径,不加会报错为找不到模块XXX
执行此命令可以打开cmd窗口使用cd进入到.py文件的上一层目录,也可以在目录shift + 右键,选择在此处打开命令窗口