Python实现Office办公自动化,以商务流程为例
-
- 一、 Pycharm 2018(Mac版)的下载
- 二、Welcome to PyCharm
- 三、使用DocxTemplate功能模块,实现python对Office Word文档进行基本操作,批量修改模板。
- 四、实现Python对Office Excel表格文档进行自动化操作(添加行或列、增加内容、合并单元格等等):
- 五、实现Python对Office word文档进行添加表格的自动化操作:
- 六、实现Python对一般网页进行爬虫取图或取数据并导入Word文档中的自动化操作(实现在“信用中国”网站上自动爬取三家公司的信用信息查询的截图,并且导入Word文档的特定位置):
- 七、实现GUI的搭建,可视化输入
- 八、云服务的使用,Python上云(暂未实现)
- 九、搭建web网页,实现办公自动化系统(暂未实现)
一、 Pycharm 2018(Mac版)的下载

- PyCharm简介
如果您初次使用 Pycharm ,首先要知道PyCharm是一种Python IDE(IDE,全称Integrated Development Environment ,集成开发环境,是用于提供程序开发环境的应用程序)。Pycharm是一个跨平台的IDE,可在Windows,macOS和Linux操作系统上提供一致的体验。PyCharm带有一整套可以帮助用户在使用Python语言开发时提高其效率的工具,比如调试、语法高亮、Project管理、代码跳转、智能提示、自动完成、单元测试、版本控制。 - PyCharm的下载安装
Pycharm安装包推荐选择在官方网站下载,其他网址下载方式可能相对繁琐而且有限速(通常是网盘下载,速度非常慢,至少花费1h),所以推荐官网下载;

点击[DOWNOAD],选择合适自己电脑的Pycharm版本,再点击Other versions,选择2018年的版本;
选择“2018.2.8 - macOS (dmg)”进行下载,我们首选专业版。在专业版中,可以开发Django,Flask和Pyramid应用程序。此外,它完全支持HTML(包括HTML5),CSS,JavaScript和XML:这些语言通过插件捆绑在IDE中,并且默认情况下会为您打开。

大约几分钟的时间可以下载完成,得到下载好的“pycharm-professional-2018.2.8.dmg”文件。
下载完成后,点击dmg文件,再将左侧的Pycharm图标拖入右侧Applications文件夹里实现安装。
二、Welcome to PyCharm

- 什么是Virtualenv
点击“Create New Project”,选择“Pure Python”,会出现“New environment using”默认“Virtualenv”。Pycharm可以指定解释器。什么是“Virtualenv”,在操作系统下,我们会安装很多版本的Python解释器。同样,我们也有可能因为各种原因,需要不同版本的模块。virtualenv就是用来为一个应用创建一套“隔离”的Python运行环境。在Python3.4之前,virtualenv需要独立手动安装后,方可执行。之后的版本中,Python自带了一个venv库,执行Python –m venv就可以达到与virtalenv同样的效果。更多的用户习惯上还是使用virtualenv的方式。
virtualenv可以指定虚拟的Python解释器版本,只要你本地操作系统下安装了这个版本。 - 选择项目解释器
点击“Project Interpreter”(项目解释器),在“Base interpreter”处选择python的要使用的虚拟环境。选择python的版本。再然后点击“Create”进行创建。
如何选择Python的版本(如果您已经安装了Python3)。首先打开终端,输入whereis python3,得到如下地址/usr/bin/python3。

PS:Mac终端快捷键大全:
Ctrl+c:中断终端中正在执行的任务。
Esc键:连续按3次显示所有的支持的终端命令。
Ctrl+p:上一个使用的历史命令。 (p:previous)
Ctrl+n:下一个使用的历史命令。(n:next)
Ctrl + d:相信这个快捷键在很多交换式情景下都能退出交换式模式。
随即进入Pycharm的开发界面。

- 新建python代码
点击File–New…–Python File


输入python文件名,点击OK。

打开pycharm,新建python项目时,提示“no python interpreter configured for the project”,理解为没有找到解释器,可手动设置添加解释器。1. 点击Configure Python interpreter,进入project interpreter设置页面。

点击“Show All”





会出现很多的包,例如:Django、Jinja2等

如果有需要的python包可以添加下载。本项目需要用到的有:docxtpl、math、openpyxl、docx、os、jinja2、selenium、time、re、pandas等等(这是代码里面的名称)
导入库
from docxtpl import DocxTemplate
import os
Python字符串与变量(出于商业隐私,相关信息暂时删去,可以参考代码修改成自己所需)
Equipment_prices=0#设备部分限价
Service_prices=0 #服务部分限价
Total_prices=Equipment_prices+Service_prices #项目总价
Ne=0#设备数量
Ns=0 #服务数量(除了集成服务费、安全生产费两个之外的数量,一般可为0)
Branch=""#某某支局
Address="" #地址
Company_name= "" #公司名称
Legal_representative="" #法人
time_limit_for_a_project="" #工期
warranty_period="" #维保期
type_of_payment= ""#付款条件
Account_Bank= "" #开户行
Bank_account=""#银行帐户
Tax_identification_number=""#纳税人识别号#
Equipment_and_related_integration_services=""#设备材料服务等等
Amount_of_performance="" #业绩金额(万元)
Time="2020年 月 日" # 询价文件发布时间
Qua23="" # 2.3资质条件,例如安全生产许可证等等
Qua24=""#电工证等等
Application_materials=""#报名所需材料
T31="2020 年 月日17:30:00(北京时间,下同)至 2020 年 月日17:00:00 。" #询价文件获取时间
Tax_included= ""#含税税率
Cost_item="" #合同主体
三、使用DocxTemplate功能模块,实现python对Office Word文档进行基本操作,批量修改模板。
首先要安装docxtpl:




选择使用清华镜像,速度会很快(https://pypi.tuna.tsinghua.edu.cn/simple)


python里面DocxTemplate模块的使用:
doc = DocxTemplate("【询价文件】模板.docx") # 对要操作的docx文档进行初始化
context = {
'Address': Address,
'Company_name': Company_name,
'Legal_representative': Legal_representative,
'time_limit_for_a_project': time_limit_for_a_project,
'warranty_period':warranty_period,
'type_of_payment':type_of_payment,
'Account_Bank':Account_Bank,
'Bank_account': Bank_account,
'Tax_identification_number': Tax_identification_number,
'Project_name':Project_name,
'Equipment_and_related_integration_services':Equipment_and_related_integration_services,
'Amount_of_performance':Amount_of_performance,
'Equipment_prices':str(Equipment_prices),
'Service_prices':str(Service_prices),
'Total_prices':str(Total_prices),
'Time':Time,
'Qua23':Qua23,
'Qua24':Qua24,
'Application_materials':Application_materials,
'T31':T31
} # company_name 是存在于1.docx文档里面的变量,就像这样{
{**********}},直接放在1.docx文件的明确位置就行
doc.render(context) # 这里是有jinjia2的模板语言进行变量的替换,然后便可以在1.docx文档里面看到{
{*********}}变成了World company
以下是Word里面的模板形式:

以“Project_name”为例,在python里下图的形式书写,与word模板进行对应。调整python里面字符串的内容,word里对于位置也随之变化。实现一个模板快速调整的功能。

4、最后输出新的生成文件:
pwd = os.getcwd()
filename = pwd +'/'+str(Project_name)+"---询价文件"
print(filename)
if not os.path.exists(filename): #判断文件夹是否存在
os.makedirs(filename) #新建文件夹
else:
print('文件夹已存在')
doc.save(str(filename)+"/"+str(Project_name+"【询价文件】.docx")) # 保存

四、实现Python对Office Excel表格文档进行自动化操作(添加行或列、增加内容、合并单元格等等):

#coding=utf-8
import math
import Inquiry_Document
import docx
import openpyxl # 导包读取
from docx import Document
from docx.enum.text import WD_ALIGN_PARAGRAPH
from docx.oxml.ns import qn
from docx.shared import Pt, RGBColor
from openpyxl import load_workbook
from openpyxl.styles import Font, Border, Side, PatternFill, Alignment
Project_name=Inquiry_Document. Project_name#项目名称
Equipment_prices=Inquiry_Document.Equipment_prices#设备部分限价
Ne=Inquiry_Document.Ne #设备数量
Service_prices=Inquiry_Document.Service_prices#服务部分限价
Ns=Inquiry_Document.Ns #服务数量(除了集成服务费、安全生产费两个之外的数量,一般可为0)
Total_prices=Inquiry_Document.Total_prices #项目总价
wb = openpyxl.load_workbook("【明细报价表】模板.xlsx") #加载表格模板文件
sheet1 = wb["报价汇总单"] #获取sheet1对象,修改单元格内容
sheet1["A1"] = Project_name+"--报价汇总单" #修改内容
sheet1["F4"] = Equipment_prices
sheet1["F5"] = Service_prices
sheet1["F6"] = Total_prices
sheet2 = wb["明细报价表"] #获取sheet2对象,修改单元格内容
sheet2["A1"] = Project_name+"--报价明细表"
sheet2.insert_rows(4,Ne-1) #添加设备行
A1="A3:"
A2="A"
A3=str(Ne+3)
A=A1+A2+A3
for i in range(Ne):
B='B'+str(3+i)
J='J'+str(3+i)
sheet2[B]=i+1 #添加设备序号
sheet2[J]="13%" #添加设备税率
sheet2.merge_cells(A) #合并单元格
B="B"+str(Ne+3)+":I"+str(Ne+3)
sheet2["B"+str(Ne+3)] ="合计(最高限价"+str(Equipment_prices)+"元)"
sheet2.merge_cells(B) #合并单元格
def set_cells(cells,type,color=None):
aligncenter=Alignment(horizontal='center',vertical='center') #居中
sidestyle=Side(border_style='thin')
border=Border(left=sidestyle,right=sidestyle,top=sidestyle,bottom=sidestyle)
for i in cells:
for j in i:
if(type=='percent'):
j.number_format='0.00%'
elif(type=='bold'):
j.style='Pandas'
elif(type=='center'):
j.alignment=aligncenter
elif(type=='border'):
j.border=border
elif(type=='color'):
j.fill = PatternFill("solid", fgColor=color)
sheet2.insert_rows(Ne+5,Ns) #添加设备行
for j in range(Ns+2):
B1='B'+str(Ne+4+j)
J='J'+str(Ne+4+j)
sheet2[B1]=j+Ne+1 #添加设备序号
sheet2[J] = "6%"
A4="A"+str(Ne+4)+":A"+str(Ne+Ns+6)
A5="B"+str(Ne+Ns+6)+":I"+str(Ne+Ns+6)
A6="A"+str(Ne+Ns+7)+":J"+str(Ne+Ns+7)
sheet2.merge_cells(A4) #合并单元格
sheet2.merge_cells(A5) #合并单元格
sheet2.merge_cells(A6) #合并单元格
sheet2["N"+str(Ne+3)]=Equipment_prices
sheet2["N"+str(Ne+Ns+6)]=Service_prices
sheet2["B"+str(Ne+3)]="合计(最高限价"+str(Equipment_prices)+"元)"
sheet2["B"+str(Ne+Ns+6)]="合计(最高限价"+str(Service_prices)+"元)"
sheet2["A"+str(Ne+Ns+7)]="含增值税总计(最高限价"+str(Total_prices)+"元)"
sheet2["M"+str(Ne+Ns+5)]=math.ceil(Service_prices*0.015)
sheet2["L"+str(Ne+Ns+5)]=round(((math.ceil(Service_prices*0.015))/1.06),2)
sheet2["K"+str(Ne+Ns+5)]=math.ceil(Service_prices*0.015)
sheet2["I"+str(Ne+Ns+5)]=round(((math.ceil(Service_prices*0.015))/1.06),2)
All='A1:N'+str(Ne+Ns+10)
A7="A"+str(Ne+Ns+8<

2468

被折叠的 条评论
为什么被折叠?



