python办公自动化实例(二):批量生成派工单
场景:实现效果:代码如下:
·
场景:
实现效果:
如下图1所示,有如下多条工单,需要向施工单位派发,每条工单都有一个相同模板,如图2所示
图1

图2

通过使用python程序,批量生成这些工单,并转为pdf文件,方便打印,效果如下图所示

PDF有两种生成模式,通过设置参数,程序可以实现每条工单一个pdf,也可以合并所有工单为一个pdf,如下图所示

代码如下:
#!user/bin/python3
# _*_ coding:utf-8 _*_
# author TingXiao-UI
from win32com import client
from PyPDF2 import PdfFileReader,PdfFileWriter
import os
class Dispatching:
def __init__(self,name):
self.xlsName = name
def run(self,model=False):
rootPath = os.getcwd()
# 创建派工单汇总文件夹
folderPath = rootPath + '\\派工单'
if os.path.exists(folderPath) is False:
os.mkdir(folderPath)
#启动Excle应用程序
xlApp = client.Dispatch("Excel.Application")
xlApp.Visible = False # False:软件不可见,后台运行,不显示; True为可见
xlApp.DisplayAlerts = 0 ##是否关闭保存弹出框
#读取excel数据
xlsPath = rootPath + '\\' + self.xlsName
xlBook = xlApp.Workbooks.Open(xlsPath)
## xlSheet_1 = xlBook_1.Worksheets(1) # 打开第1个表
info = xlBook.Worksheets["信息填写"] # 打开名为“信息填写”的sheet作为数据源
template = xlBook.Worksheets["模板"]# 打开名为“模板”的sheet作为数据源
#批量生成
nrows = info.UsedRange.Rows.Count#行数
for i in range(2,nrows,1):
if info.cells(i,1).value =='是':
template.UsedRange.cells(2,2).value = info.UsedRange.cells(i,2).value#工程名称
template.UsedRange.cells(3,2).value=info.UsedRange.cells(i,3).value#委派部门
template.UsedRange.cells(4,2).value=info.UsedRange.cells(i,4).value#施工单位
template.UsedRange.cells(5,2).value=info.UsedRange.cells(i,5).value#委派人
template.UsedRange.cells(5,4).value=info.UsedRange.cells(i,6).value#委派时间
template.UsedRange.cells(6,2).value=info.UsedRange.cells(i,7).value#工作地点
template.UsedRange.cells(6,4).value=info.UsedRange.cells(i,8).value#预计完成时间
template.UsedRange.cells(7,2).value=info.UsedRange.cells(i,9).value#委派内容
#保存
name = info.UsedRange.cells(i,4).value+'-'+info.UsedRange.cells(i,9).value+'.pdf'
# template.Activate()
# template.Select()
template.SaveAs(folderPath + '\\' + name,FileFormat=57)
xlBook.Close()#关闭excle文档
xlApp.Quit()#关闭excel应用程序
if model:#判断是否合并PDF
self.mergePdf(folderPath)
#获取PDF文件页码
def getPdfPagesNum(self,p):
reader = PdfFileReader(p)
if reader.isEncrypted:
reader.decrypt('')
PdfPagesNum = reader.getNumPages()
# print(PdfPagesNum)
return(PdfPagesNum)
#遍历PDF文件,批量合并
def mergePdf(self,rp):
print('开始合并PDF文件!')
# 实例化写入对象
outPdf = PdfFileWriter()
outPdfPages = 0
#遍历PDF文件
for root,dirs,files in os.walk(rp):
for file in files:
curPdf = os.path.join(file)
curPdfPath = os.path.join(root,file)
if curPdfPath.find('.pdf')>=0 and curPdfPath.find('合并')<0:
# 读取PDF文件
inPdf = PdfFileReader(open(curPdfPath, "rb"))
# 获取源PDF文件页数
pageNum = inPdf.getNumPages()
outPdfPages += pageNum
# 逐个合并PDF
# print('合并:'+curPdf)
for iPage in range(pageNum):
# direction = inPdf.getPage(iPage).get('/Rotate')
# print(direction)
outPdf.addPage(inPdf.getPage(iPage))
# 创建合并文件夹
mergeFlodPath = rp + '\\合并PDF'
a = os.path.exists(mergeFlodPath)
if a!=True:
os.mkdir(mergeFlodPath)
#写入到目标PDF文件
pdfPath = './派工单/合并PDF/'+str(outPdfPages)+'条'+'派工单.pdf'#os.path.join(mergeFlodPath+'\\'+str(outPdfPages)+'条'+'派工单.pdf')
with open(pdfPath,'wb') as outputfile:
outPdf.write(outputfile)
print(str(outPdfPages)+'页PDF并完毕!')
if __name__=='__main__':
xlsName = '派工单.xlsx'
xx = Dispatching(xlsName)
model = True#True:合并PDF,False:不合并
xx.run(model)
更多推荐




所有评论(0)