Python实现Office自动化办公(实现Python对word基本操作、对excel基本操作、在word中插入表格、word中插入网站爬虫取图)

Python 专栏收录该内容
10 篇文章 0 订阅

一、 Pycharm 2018(Mac版)的下载

PyCharm图标

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

在这里插入图片描述

  1. 什么是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解释器版本,只要你本地操作系统下安装了这个版本。
  2. 选择项目解释器
    点击“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的开发界面。
在这里插入图片描述

  1. 新建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)+":N"+str(Ne+Ns+8)
A8="A"+str(Ne+Ns+9)+":N"+str(Ne+Ns+9)
A9="A"+str(Ne+Ns+10)+":N"+str(Ne+Ns+10)
sheet2.merge_cells(A7) #合并单元格
sheet2.merge_cells(A8) #合并单元格
sheet2.merge_cells(A9) #合并单元格
cells=sheet2[All]
cells1=sheet2['A1:N'+str(Ne+Ns+7)]
set_cells(cells1,'center') # 居中

set_cells(sheet1['A1:F6'],'border') #sheet1 加边框
set_cells(cells,'border') # sheet2 加边框

for i in range(3,Ns+Ne+5):
  sheet2['B'+str(i)].font = Font(name=u'宋体', bold=True, italic=False, size=14)  # bold是否为粗体。italic是否为斜体。
  #sheet2['J' + str(i)].font = Font(name=u'宋体', bold=True, italic=False, size=14)  # bold是否为粗体。italic是否为斜体。
sheet2['B'+str(Ne+3)].font = Font(name=u'等线 (正文)', bold=True, italic=False, size=12)  # bold是否为粗体。italic是否为斜体。
wb.save(Inquiry_Document.filename+"/"+str(Inquiry_Document.Project_name)+"【明细报价表】.xlsx") #另存为文件名

五、实现Python对Office word文档进行添加表格的自动化操作:

mport docx
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
import Inquiry_Document
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=Equipment_prices+Service_prices #项目总价

def xlsx2docx(fn):
   wb=load_workbook(fn,data_only=True)
   document=Document()

   for ws in wb.worksheets:
       rows=list(ws.rows)
       #document.add_paragraph(ws.title)
       #document.add_paragraph("标题")
       #paragraph = document.add_paragraph(str(Project_name) + "技术规范书")
       #paragraph_format = paragraph.paragraph_format
       #paragraph_format.alignment = WD_ALIGN_PARAGRAPH.CENTER

       Head1 = document.add_heading("", level=2)  # 这里不填标题内容    "*****技术规范书" 大标题
       run = Head1.add_run(str(Project_name) + "技术规范书")
       run.font.name = u'Cambria'
       run._element.rPr.rFonts.set(qn('w:eastAsia'), u'宋体')
       run.font.color.rgb = RGBColor(0, 0, 0)
       Head1_format = Head1.paragraph_format
       Head1_format.alignment = WD_ALIGN_PARAGRAPH.CENTER

       # 标题等级如1,2,3这些数字,一级标题二级标题这样
       Head2= document.add_heading("", level=2)  # 这里不填标题内容     "下表为本项目采购清单及相关参数要求:"
       run = Head2.add_run('下表为本项目采购清单及相关参数要求:')
       run.font.name = u'Cambria'
       run._element.rPr.rFonts.set(qn('w:eastAsia'), u'宋体')
       run.font.color.rgb = RGBColor(0, 0, 0)

       table=document.add_table(rows=len(rows),
                                cols=len(rows[0]),
                                style='Table Grid')

       for irow,row in enumerate(rows):                      #      制作清单表格
           for icol,col in enumerate(row):
               table.cell(irow,icol).text=str(col.value)
   for i, p in enumerate(document.paragraphs):
       print(str(i) + ": " + str(p.text))
   document.styles['Normal'].font.name = u'宋体'
   document.styles['Normal']._element.rPr.rFonts.set(qn('w:eastAsia'), u'宋体')
   document.styles['Normal'].font.size = Pt(10.5)
   document.styles['Normal'].font.color.rgb = RGBColor(0, 0, 0)
   #document = document.add_paragraph()
   file = docx.Document('文字模板.docx')
   for para in file.paragraphs:
       document.add_paragraph(para.text)
   document.save(Inquiry_Document.filename+"/"+str(Inquiry_Document.Project_name)+"【技术规范书】.docx")
xlsx2docx('清单表格模板.xlsx')

六、实现Python对一般网页进行爬虫取图或取数据并导入Word文档中的自动化操作(实现在“信用中国”网站上自动爬取三家公司的信用信息查询的截图,并且导入Word文档的特定位置):

运用了selenium三方库,可以实现让浏览器完成自动化的操作。

首先要安装浏览器驱动driver,选择一种即可,我使用了Firefox的驱动geckodriver
1.chromedriver 下载地址:https://code.google.com/p/chromedriver/downloads/list
2.Firefox的驱动geckodriver 下载地址:https://github.com/mozilla/geckodriver/releases/
3.IE的驱动IEdriver 下载地址:http://www.nuget.org/packages/Selenium.WebDriver.IEDriver/

# 从火狐浏览器中,爬取"信用中国"中相关公司的信用信息并截图,这是爬取网页截图部分
from selenium.webdriver import Firefox
from selenium.webdriver import FirefoxOptions
from selenium.webdriver.common.keys import Keys
from time import sleep
import Basic_Info
import time,re
option = FirefoxOptions()
option.add_argument("--headless")  # 隐藏浏览器
browser=Firefox(executable_path=r'/usr/local/bin/geckodriver',options=option)
url1="https://www.creditchina.gov.cn/xinyongxinxixiangqing/xyDetail.html?searchState=1&entityType=1&keyword="+str(Basic_Info.company1)
url2="https://www.creditchina.gov.cn/xinyongxinxixiangqing/xyDetail.html?searchState=1&entityType=1&keyword="+str(Basic_Info.company2)
url3="https://www.creditchina.gov.cn/xinyongxinxixiangqing/xyDetail.html?searchState=1&entityType=1&keyword="+str(Basic_Info.company3)
#url = "https://www.creditchina.gov.cn/xinyongxinxi/index.html?index=0&scenes=defaultScenario&tableName=credit_xyzx_tyshxydm&searchState=2&entityType=1,2,4,5,6,7,8&keyword=%20"
browser.get(url1)
#browser.find_element_by_id("search_input").clear()
#browser.find_element_by_id('search_input').send_keys("股份有限公司")
#browser.find_elements_by_css_selector(".search_btn")[0].click()
#elements[0].click()
#sleep(6)
#sreach_window=browser.current_window_handle
#browser.find_element_by_xpath("/html/body/div[2]/div/div[1]/div[3]/ul[1]/li[1]").click()
#html = browser.page_source
#sreach_window1=browser.current_window_handle
sleep(5)
browser.set_window_size(1380,1100) #设置为固定分辨率大小
browser.get_screenshot_as_file("screenshot_company1.png")#截图
browser.get(url2)
sleep(5)
browser.set_window_size(1380,1100) #设置为固定分辨率大小
browser.get_screenshot_as_file("screenshot_company2.png")#截图
browser.get(url3)
sleep(5)
browser.set_window_size(1380,1100) #设置为固定分辨率大小
browser.get_screenshot_as_file("screenshot_company3.png")#截图

完整的代码:

#coding=utf-8
import math
import os
import Basic_Info
import docx
import openpyxl  # 导包读取
from docxtpl import DocxTemplate
from docxtpl import InlineImage
from docx.shared import Mm
import jinja2
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=Basic_Info. Project_name#项目名称
Equipment_prices=Basic_Info.Equipment_prices#设备部分限价
Ne=Basic_Info.Ne #设备数量
Service_prices=Basic_Info.Service_prices#服务部分限价
Ns=Basic_Info.Ns #服务数量(除了集成服务费、安全生产费两个之外的数量,一般可为0)
Total_prices=Basic_Info.Total_prices #项目总价
# 从火狐浏览器中,爬取"信用中国"中相关公司的信用信息并截图
from selenium.webdriver import Firefox
from selenium.webdriver import FirefoxOptions
from selenium.webdriver.common.keys import Keys
from time import sleep
import Basic_Info
import time,re
option = FirefoxOptions()
option.add_argument("--headless")  # 隐藏浏览器
browser=Firefox(executable_path=r'/usr/local/bin/geckodriver',options=option)
url1="https://www.creditchina.gov.cn/xinyongxinxixiangqing/xyDetail.html?searchState=1&entityType=1&keyword="+str(Basic_Info.company1)
url2="https://www.creditchina.gov.cn/xinyongxinxixiangqing/xyDetail.html?searchState=1&entityType=1&keyword="+str(Basic_Info.company2)
url3="https://www.creditchina.gov.cn/xinyongxinxixiangqing/xyDetail.html?searchState=1&entityType=1&keyword="+str(Basic_Info.company3)
#url = "https://www.creditchina.gov.cn/xinyongxinxi/index.html?index=0&scenes=defaultScenario&tableName=credit_xyzx_tyshxydm&searchState=2&entityType=1,2,4,5,6,7,8&keyword=%20"
browser.get(url1)
#browser.find_element_by_id("search_input").clear()
#browser.find_element_by_id('search_input').send_keys("股份有限公司")
#browser.find_elements_by_css_selector(".search_btn")[0].click()
#elements[0].click()
#sleep(6)
#sreach_window=browser.current_window_handle
#browser.find_element_by_xpath("/html/body/div[2]/div/div[1]/div[3]/ul[1]/li[1]").click()
#html = browser.page_source
#sreach_window1=browser.current_window_handle
sleep(5)
browser.set_window_size(1380,1100) #设置为固定分辨率大小
browser.get_screenshot_as_file("screenshot_company1.png")
browser.get(url2)
sleep(5)
browser.set_window_size(1380,1100) #设置为固定分辨率大小
browser.get_screenshot_as_file("screenshot_company2.png")
browser.get(url3)
sleep(5)
browser.set_window_size(1380,1100) #设置为固定分辨率大小
browser.get_screenshot_as_file("screenshot_company3.png")
wb = openpyxl.load_workbook("模版文件/Procurement_Results_Form_Template.xlsx")       #加载表格模板文件
sheet1 = wb["模版"] #获取sheet1模版对象,修改单元格内容
sheet1["A2"] = "项目名称:"+Project_name # 项目名称
sheet1["A3"] = "询价编号:"+Basic_Info.Inquiry_number #询价编号
sheet1["A4"]="日期:"+Basic_Info.Time
sheet1["A5"]="唱价时间:"+Basic_Info.Bid_opening_time_detailedness
sheet1["A8"]=Basic_Info.company1
sheet1["A9"]=Basic_Info.company2
sheet1["A10"]=Basic_Info.company3
sheet1["A13"]="询价文件发布时间:"+Basic_Info.Time
sheet1["A14"]="行贿信息与信用信息查询时间:"+Basic_Info.Bid_opening_time_1
sheet1["A15"]="结果编制时间:"+Basic_Info.Bid_opening_time
sheet1["A17"]=Total_prices
sheet1["A18"]=Basic_Info.time_limit_for_a_project
sheet1["A19"]=Basic_Info.warranty_period
sheet1["A20"]=Basic_Info.T31
sheet1["A21"]=Total_prices
sheet1["A22"]=0 #设备最高限价=0
sheet1["A23"]=Service_prices
sheet1["A24"]=Basic_Info.Company_name
sheet1["A25"]=Basic_Info.Legal_representative
sheet1["A26"]=Basic_Info.Group_leader
sheet1["A27"]=Basic_Info.Group_member
sheet1["A28"]=Basic_Info.Buyer_representative
sheet1["A29"]=Basic_Info.phone_number_1
sheet1["A30"]=Basic_Info.phone_number_2
sheet1["A31"]=Basic_Info.phone_number_3
sheet1["A32"]=Basic_Info.RAR1
sheet1["A33"]=Basic_Info.RAR1_phone
sheet1["A34"]=Basic_Info.RAR1_mail
sheet1["A35"]=Basic_Info.RAR2
sheet1["A36"]=Basic_Info.RAR2_phone
sheet1["A37"]=Basic_Info.RAR2_mail
sheet1["A38"]=Basic_Info.RAR3
sheet1["A39"]=Basic_Info.RAR3_phone
sheet1["A40"]=Basic_Info.RAR3_mail
sheet1["A41"]=Basic_Info.RAR1_total_prices
sheet1["A42"]=Basic_Info.RAR2_total_prices
sheet1["A43"]=Basic_Info.RAR3_total_prices

wb1 = openpyxl.load_workbook("模版文件/Credit_check_of_MSS.xlsx")     #加载MSS信用核查表格模板文件
sheet2 = wb1["信用管理"] #获取sheet2模版对象,修改单元格内容
sheet2["C2"]=Basic_Info.company1
sheet2["C3"]=Basic_Info.company2
sheet2["C4"]=Basic_Info.company3
sheet2["D2"]=Basic_Info.company1_legal_person
sheet2["D3"]=Basic_Info.company2_legal_person
sheet2["D4"]=Basic_Info.company3_legal_person
sheet2["E2"]=Basic_Info.company1_Registered_capital
sheet2["E3"]=Basic_Info.company2_Registered_capital
sheet2["E4"]=Basic_Info.company3_Registered_capital
sheet2["F2"]=Basic_Info.company1_Date_of_establishment
sheet2["F3"]=Basic_Info.company2_Date_of_establishment
sheet2["F4"]=Basic_Info.company3_Date_of_establishment
sheet2["G2"]=Basic_Info.company1_Operating_status
sheet2["G3"]=Basic_Info.company2_Operating_status
sheet2["G4"]=Basic_Info.company3_Operating_status
sheet2["H2"]=Basic_Info.company1_unified_social_credit_code
sheet2["H3"]=Basic_Info.company2_unified_social_credit_code
sheet2["H4"]=Basic_Info.company3_unified_social_credit_code
sheet2["I2"]=Basic_Info.company1_type_of_company
sheet2["I3"]=Basic_Info.company1_type_of_company
sheet2["I4"]=Basic_Info.company1_type_of_company
sheet2["J2"]=Basic_Info.company1_operating_period
sheet2["J3"]=Basic_Info.company2_operating_period
sheet2["J4"]=Basic_Info.company3_operating_period
sheet2["K2"]=Basic_Info.company1_used_name
sheet2["K3"]=Basic_Info.company2_used_name
sheet2["K4"]=Basic_Info.company3_used_name
sheet2["M2"]=Basic_Info.company1_total_legal_proceedings
sheet2["M3"]=Basic_Info.company2_total_legal_proceedings
sheet2["M4"]=Basic_Info.company3_total_legal_proceedings

doc = DocxTemplate("模版文件/评审报告.docx")  # 对要操作的docx文档进行初始化
context = {
           "Project_name":Project_name,
           'Company_name':Basic_Info.Company_name,
           'Bid_opening_time':Basic_Info.Bid_opening_time,
           'Total_prices':Basic_Info.Total_prices,
           'Time':Basic_Info.Time,
           'T31':Basic_Info.T31,
           'Bid_opening_time':Basic_Info.Bid_opening_time,
           'Response_deadline':Basic_Info.Response_deadline,
           'Bid_opening_time_detailedness':Basic_Info.Bid_opening_time_detailedness,
           'company1':Basic_Info.company1,
           'company2':Basic_Info.company2,
           'company3':Basic_Info.company3,
           'rank_prices1':int(Basic_Info.rank_prices1),
           'rank_prices2':int(Basic_Info.rank_prices2),
           'rank_prices3':int(Basic_Info.rank_prices3),
           'RAR1_total_prices':Basic_Info.RAR1_total_prices,
           'RAR2_total_prices':Basic_Info.RAR2_total_prices,
           'RAR3_total_prices':Basic_Info.RAR3_total_prices,
          }  # company_name 是存在于1.docx文档里面的变量,就像这样{{**********}},直接放在1.docx文件的明确位置就行
doc.render(context)  #

doc1 = DocxTemplate("模版文件/附件5_6_9_10等材料.docx")  # 对要操作的docx文档进行初始化
context1 = {
           "Project_name":Project_name,
           'Company_name':Basic_Info.Company_name,
           'Bid_opening_time':Basic_Info.Bid_opening_time,
           'Bid_opening_time_1':Basic_Info.Bid_opening_time_1,
           'Amount_of_performance':Basic_Info.Amount_of_performance,
           'Total_prices':Basic_Info.Total_prices,
           'Qua23':Basic_Info.Qua23,
           'Qua24':Basic_Info.Qua24,
           'Time':Basic_Info.Time,
           'T31':Basic_Info.T31,
           'Inquiry_number':Basic_Info.Inquiry_number,
           'Response_deadline':Basic_Info.Response_deadline,
           'Bid_opening_time_detailedness':Basic_Info.Bid_opening_time_detailedness,
           'company1':Basic_Info.company1,
           'company2':Basic_Info.company2,
           'company3':Basic_Info.company3,
           'rank_prices1':int(Basic_Info.rank_prices1),
           'rank_prices2':int(Basic_Info.rank_prices2),
           'rank_prices3':int(Basic_Info.rank_prices3),
           'screenshot_company1': InlineImage(doc1, 'screenshot_company1.png', width=Mm(160), height=Mm(60)),
           'screenshot_company2': InlineImage(doc1, 'screenshot_company2.png',width=Mm(160), height=Mm(60)),
           'screenshot_company3': InlineImage(doc1, 'screenshot_company3.png',width=Mm(160), height=Mm(60))
          }  # company_name 是存在于1.docx文档里面的变量,就像这样{{**********}},直接放在1.docx文件的明确位置就行
doc1.render(context1)  #


doc2 = DocxTemplate("模版文件/采购结果签报.docx")  # 对要操作的docx文档进行初始化
context2 = {

           'Group_leader': Basic_Info.Group_leader,
           'Group_member': Basic_Info.Group_member,
           'Buyer_representative': Basic_Info.Buyer_representative,
           'RAR1_total_prices': Basic_Info.RAR1_total_prices,
           'RAR2_total_prices': Basic_Info.RAR2_total_prices,
           'RAR3_total_prices': Basic_Info.RAR3_total_prices,
           'Equipment_and_related_integration_services':Basic_Info.Equipment_and_related_integration_services,
           'Tax':Basic_Info.Tax,
           'RAR1_total_prices_Excluding_tax':Basic_Info.RAR1_total_prices_Excluding_tax,
           'RAR2_total_prices_Excluding_tax': Basic_Info.RAR2_total_prices_Excluding_tax,
           'RAR3_total_prices_Excluding_tax': Basic_Info.RAR3_total_prices_Excluding_tax,

           'Tax_included':Basic_Info.Tax_included,
           'Cost_item':Basic_Info.Cost_item,
           'Project_name':Project_name,
           'Company_name':Basic_Info.Company_name,
           'Bid_opening_time':Basic_Info.Bid_opening_time,
           'Bid_opening_time_1':Basic_Info.Bid_opening_time_1,
           'Amount_of_performance':Basic_Info.Amount_of_performance,
           'Total_prices':Basic_Info.Total_prices,
           'Inquiry_number':Basic_Info.Inquiry_number,
           'Response_deadline':Basic_Info.Response_deadline,
           'Bid_opening_time_detailedness':Basic_Info.Bid_opening_time_detailedness, #
           'company1':Basic_Info.company1,
           'company2':Basic_Info.company2,
           'company3':Basic_Info.company3,
           'rank_prices1':int(Basic_Info.rank_prices1),
           'rank_prices2':int(Basic_Info.rank_prices2),
           'rank_prices3':int(Basic_Info.rank_prices3),

          }  # company_name 是存在于1.docx文档里面的变量,就像这样{{**********}},直接放在1.docx文件的明确位置就行
doc2.render(context2)  doc.save(Basic_Info.filename+"/"+str(Basic_Info.Project_name)+"【评审报告】.docx") # 保存
doc1.save(Basic_Info.filename+"/"+str(Basic_Info.Project_name)+"---附件5_6_9等多个文件.docx") # 保存
wb.save(Basic_Info.filename+"/"+str(Basic_Info.Project_name)+"---多个附件表格.xlsx") #另存为文件名
wb1.save(Basic_Info.filename+"/"+str(Basic_Info.Project_name)+"---MSS信用核查.xlsx") #另存为文件名
doc2.save(Basic_Info.filename1+"/"+str(Basic_Info.Project_name)+"【采购结果签报】.docx") # 保存

最后的输出效果:
在这里插入图片描述

七、实现GUI的搭建,可视化输入

Python GUI的选择,首先要说的是:MACOS系统不支持PyQt5-tools,虽然可以下载PyQt5。

ERROR: Could not find a version that satisfies the requirement
pyqt5-plugins~=5.15.1.1.0.dev0 (from PyQt5-tools) (from versions:
none) ERROR: No matching distribution found for
pyqt5-plugins~=5.15.1.1.0.dev0 (from PyQt5-tools)

pip 安装wxPython

pip install wxpython

在这里插入图片描述
在这里插入图片描述
导入wxpython

import wx

wxPython TextCtrl类

wx.TextCtrl(parent, id, value, pos, size, style) 

wxPython ComboBox & Choice类

 text1=wx.StaticText(parent=panel,id=-1,pos=(10,5),label="选择签约主体:")
        list1=["某某1","某某2"]
        self.combobox1=wx.ComboBox(parent=panel,id=-1,pos=(100,5),value="某某1",choices=list1 )#wx.ComboBox 默认它的文本框是可以修改的

(11)wxPython Button控件

Wx.Button(parent, id, label, pos, size, style)
self.button = wx.Button(panel, -1, "提交", pos=(600, 40), size=(80, 80))  # 在面板上添加控件
        self.Bind(wx.EVT_BUTTON, self.OnClick, self.button)  # 将回调函数与按键事件绑定

(一)需求梳理一下,在UI界面中实现:下拉菜单点选或填写基本信息,点击“提交”按钮后,能够把点选或填写的保存下来,每一次点击“提交”按钮后,更新最新的填写的信息并且保存,最后这些信息能够作为其他python程序的输入信息,生成一系列信息完整的word或者excel文档为我所用。
1、模块举例一:

 text1=wx.StaticText(parent=panel,id=-1,pos=(10,5),label="选择签约主体:")
        list1=["南京电信","中电鸿信"]
        self.combobox1=wx.ComboBox(parent=panel,id=-1,pos=(100,5),value="南京电信",choices=list1 )#wx.ComboBox 默认它的文本框是可以修改的

在这里插入图片描述
2、模块举例二:
st16 = wx.StaticText(panel, -1, “付款方式:”, pos=(180, 150))
self.txt16 = wx.TextCtrl(panel,-1, pos=(260, 150), size=(300, 20))
在这里插入图片描述
3、模块举例三:

 #提交模块
self.button = wx.Button(panel, -1, "提交", pos=(600, 40), size=(80, 80))  # 在面板上添加控件
self.Bind(wx.EVT_BUTTON, self.OnClick, self.button)  # 将回调函数与按键事件绑定

在这里插入图片描述
4、数据信息保存(涉及20左右的信息保存),保存至“abc.npz”文件。

             a=self.combobox1.GetValue()
             b = self.combobox2.GetValue()
             c1=self.txt1.GetValue()
             c2= self.txt2.GetValue()
             c3= self.txt3.GetValue()
             c4 = self.txt4.GetValue()
             c5= self.txt5.GetValue()
             c6= self.txt6.GetValue()
             c7= self.txt7.GetValue()
             c8= self.txt8.GetValue()
             c9= self.txt9.GetValue()
             c10= self.txt10.GetValue()
             c11= self.txt11.GetValue()
             c12= self.txt12.GetValue()
             c13= self.txt13.GetValue()
             c14= self.txt14.GetValue()
             c15 = self.txt15.GetValue()
             c16 = self.txt16.GetValue()
             c17 = self.txt17.GetValue()
             c18 = self.txt18.GetValue()
             c19 = self.txt19.GetValue()
             c20= self.combobox20.GetValue()

             np.savez('abc.npz', k_a=a, k_b=b,k_c1=c1,k_c2=c2,k_c3=c3,k_c4=c4,k_c5=c5,k_c6=c6,k_c7=c7,k_c8=c8,k_c9=c9,k_c10=c10,k_c11=c11,k_c12=c12,k_c13=c13,k_c14=c14,k_c15=c15,k_c16=c16,k_c17=c17,k_c18=c18,k_c19=c19,k_c20=c20)

5、完整代码:(其中涉及商业机密的部分内容已经用“*****************************”替代。

import wx
import numpy as np
import wx.grid
APP_TITLE = 'Log in'
class MyFrame(wx.Frame):
    ClickNum = 0
    def __init__(self):      #__init__(self) 是类的初始化方法,也称构造方法,是一种特殊的魔法方法。__init__(self)在实例化后,会自动调用,而不用手动调用,所以一般把属性设置在_init__()里。
        super().__init__(parent=None,title="采购基本信息填写",size=(1000,700))  # 初始化窗口信息
        panel=wx.Panel(self)   #框架的父窗口。对于顶级窗口,这个值是None 。#创建面板
        #模块1 选择签约主体
        #self.Center()


        text1=wx.StaticText(parent=panel,id=-1,pos=(10,5),label="选择签约主体:")
        list1=["******","*******"]
        self.combobox1=wx.ComboBox(parent=panel,id=-1,pos=(100,5),value="****",choices=list1 )#wx.ComboBox 默认它的文本框是可以修改的

        #提交模块
        self.button = wx.Button(panel, -1, "提交", pos=(600, 40), size=(80, 80))  # 在面板上添加控件
        self.Bind(wx.EVT_BUTTON, self.OnClick, self.button)  # 将回调函数与按键事件绑定

        #模块2 选择支局
        list2=["六合竹镇支局","六合龙池支局","六合雄州支局","六合马鞍支局","六合冶山支局","六合横梁支局","六合龙袍支局","六合东沟支局","六合行客支局","六合新城支局","六合金牛湖支局","六合程桥支局","六合六城支局"]
        text2 = wx.StaticText(parent=panel, id=-1, pos=(10,100),label="选择支局:")
        self.combobox2=wx.ComboBox(parent=panel,id=-1,pos=(80,100),choices=list2) #wx.Choice 是只读不可以修改的
        #choice.SetSelection(0)
        #self.Bind(wx.EVT_CHOICE,self.on_choice,self.choice)
        hbox2 = wx.BoxSizer()

        list20=["(含税13%、含税6%)","(含税6%)","(含税13%)","(含税9%)"]
        text20 = wx.StaticText(parent=panel, id=-1, pos=(260,100),label="含税税率:")
        self.combobox20=wx.ComboBox(parent=panel,id=-1,pos=(360,100),choices=list20)

        st1 = wx.StaticText(panel, -1, "项目名称:", pos=(10, 50))
        self.txt1 = wx.TextCtrl(panel,-1, pos=(80, 40), size=(200, 50),style=wx.TE_MULTILINE | wx.HSCROLL)

        sizer = wx.FlexGridSizer(cols=2, hgap=6, vgap=6)

        st2 = wx.StaticText(panel, -1, "工期(天):", pos=(10,  150))
        self.txt2 = wx.TextCtrl(panel,-1, pos=(90, 150), size=(50, 20))

        st16 = wx.StaticText(panel, -1, "付款方式:", pos=(180,  150))
        self.txt16 = wx.TextCtrl(panel,-1, pos=(260, 150), size=(300, 20))

        st3 = wx.StaticText(panel, -1, "维保期(年):", pos=(10,  200))
        self.txt3 = wx.TextCtrl(panel,-1, pos=(100, 200), size=(50, 20))

        st4 = wx.StaticText(panel, -1, " 2.3资质条件:", pos=(10,  250))
        list4=["********************************************************************************** "]
        self.txt4 = wx.ComboBox(parent=panel,id=-1,pos=(100,250),value="**********************************************************************************",choices=list4)
        #self.Bind(wx.EVT_CHOICE, self.on_choice, choice)

        st5 = wx.StaticText(panel, -1, " 2.4资质条件:", pos=(10, 300))
        list5 = ["**********************************************************************************",
                 "********************************************************************************** "]
        self. txt5 = wx.ComboBox(parent=panel, id=-1, pos=(100, 300), value="*******************************************************************",
                           choices=list5)
        st6 = wx.StaticText(panel, -1, " 报名方式:", pos=(10, 350))
        list6 = ["**********************************************************************************"]
        self.txt6 = wx.ComboBox(parent=panel, id=-1, pos=(100, 350), value="**********************************************************************************",
                           choices=list6)
        st7 = wx.StaticText(panel, -1, "设备部分限价(元):", pos=(10, 400))
        self.txt7 = wx.TextCtrl(panel, -1, pos=(140, 400), size=(100, 20))

        st8 = wx.StaticText(panel, -1, "服务部分限价(元):", pos=(10, 450))
        self.txt8 = wx.TextCtrl(panel, -1, pos=(140, 450), size=(100, 20))

        st17 = wx.StaticText(panel, -1, "业绩(万元):", pos=(300, 450))
        self.txt17 = wx.TextCtrl(panel, -1, pos=(440, 450), size=(100, 20))

        st9 = wx.StaticText(panel, -1, "设备数量:", pos=(10, 500))
        self.txt9 = wx.TextCtrl(panel, -1, pos=(140, 500), size=(100, 20))

        st15=wx.StaticText(panel, -1, "服务数量:", pos=(300, 500))
        self.txt15 = wx.TextCtrl(panel, -1, pos=(430, 500), size=(100, 20))


        st10 = wx.StaticText(panel, -1, "设备及相关集成服务:", pos=(10, 550))
        self.txt10 = wx.TextCtrl(panel, -1, pos=(140, 550), size=(600, 20))

        st11 = wx.StaticText(panel, -1, "询价文件发布时间:", pos=(10, 600))
        self.txt11 = wx.TextCtrl(panel, -1, pos=(140, 600), value="2020年11月日",size=(600, 20))

        st12 = wx.StaticText(panel, -1, "询价文件获取时间:", pos=(10, 650))
        self.txt12 = wx.TextCtrl(panel, -1, pos=(140, 650), value="2020年11月日8:30:00(北京时间,下同)至 2020年11月日17:30:00。", size=(600, 20))

        st13 = wx.StaticText(panel, -1, "开标时间:", pos=(10, 700))
        self.txt13 = wx.TextCtrl(panel, -1, pos=(140, 700), value="2020年11月日",size=(500, 20))

        st18 = wx.StaticText(panel, -1, "开标具体时间:", pos=(700, 700))
        self.txt18 = wx.TextCtrl(panel, -1, pos=(800, 700), value="2020年11月日下午15时30分",size=(400, 20))


        st14 = wx.StaticText(panel, -1, "应答截止时间:", pos=(10, 750))
        self.txt14 = wx.TextCtrl(panel, -1, pos=(140, 750), value="2020年11月日",size=(500, 20))

        st19 = wx.StaticText(panel, -1, "开标前一天:", pos=(700, 750))
        self.txt19 = wx.TextCtrl(panel, -1, pos=(800, 750), value="2020年11月日",size=(400, 20))
        self.CreateStatusBar()
        self.SetStatusText("准备就绪")
    def OnClick(self, event):  #回调函数事件
         self.button.SetLabel("提交成功") #设置
         self.ClickNum+=1
         if self.ClickNum % 2 == 1:  #根据按下次数判断
             self.button.SetLabel("已经提交")#修改按键的标签
             a=self.combobox1.GetValue()
             b = self.combobox2.GetValue()
             c1=self.txt1.GetValue()
             c2= self.txt2.GetValue()
             c3= self.txt3.GetValue()
             c4 = self.txt4.GetValue()
             c5= self.txt5.GetValue()
             c6= self.txt6.GetValue()
             c7= self.txt7.GetValue()
             c8= self.txt8.GetValue()
             c9= self.txt9.GetValue()
             c10= self.txt10.GetValue()
             c11= self.txt11.GetValue()
             c12= self.txt12.GetValue()
             c13= self.txt13.GetValue()
             c14= self.txt14.GetValue()
             c15 = self.txt15.GetValue()
             c16 = self.txt16.GetValue()
             c17 = self.txt17.GetValue()
             c18 = self.txt18.GetValue()
             c19 = self.txt19.GetValue()
             c20= self.combobox20.GetValue()

             np.savez('abc1.npz', k_a=a, k_b=b,k_c1=c1,k_c2=c2,k_c3=c3,k_c4=c4,k_c5=c5,k_c6=c6,k_c7=c7,k_c8=c8,k_c9=c9,k_c10=c10,k_c11=c11,k_c12=c12,k_c13=c13,k_c14=c14,k_c15=c15,k_c16=c16,k_c17=c17,k_c18=c18,k_c19=c19,k_c20=c20)

             print("签约主体: " + self.combobox1.GetValue())
             print("选择支局: " + self.combobox2.GetValue())
             print("项目名称: " + self.txt1.GetValue())
             print("工期(天): " + self.txt2.GetValue())
             print("维保期(年): " + self.txt3.GetValue())
             print("2.3资质条件: " + self.txt4.GetValue())
             print("2.4资质条件: " + self.txt5.GetValue())
             print("报名方式: " + self.txt6.GetValue())
             print("设备部分限价(元): " + self.txt7.GetValue())
             print("服务部分限价(元): " + self.txt8.GetValue())
             print("设备数量: " + self.txt9.GetValue())
             print("设备及相关集成服务: " + self.txt10.GetValue())
             print("询价文件发布时间: " + self.txt11.GetValue())
             print("询价文件获取时间: " + self.txt12.GetValue())
             print("开标时间: " + self.txt13.GetValue())
             print("应答截止时间: " + self.txt14.GetValue())
             print(self.button.GetLabel())#打印信息(返回按键的标签信息)

         else:
             #self.button.SetLabel("登录")
             self.ClickNum = 0
             print(self.button.GetLabel())



class mainApp(wx.App):
    """
    在OnInit() 里边申请Frame类,这样能保证一定是在app后调用,
    这个函数是app执行完自己的__init__函数后就会执行
    """

    def OnInit(self):
        self.Frame = MyFrame(None)
        self.Frame.Show()
        return True

    """
    在def OnExit(self):这个是窗口关闭后调用的函数,
    把要释放的非wx资源或者要保存的放到这个函数里,
    优雅的退出不留遗憾
    """

    def OnExit(self):
        self.Frame.ExitFrame()
        print("关闭窗口后调用,可以在这里保存一些相关的配置")
        pass


class App(wx.App):
    def OnInit(self):
        frame=MyFrame()
        frame.Show()
        return True


if __name__=="__main__"  :#在python中使用__开头 并以__结尾的方法,称之为魔法方法;
    app=App()
    app.MainLoop()

最后的UI输入界面:
在这里插入图片描述
点击“提交”按钮后,
在这里插入图片描述
在这里插入图片描述
在其他程序里面,通过np.load('abc.npz')就可以实现调用数据,一键生成word以及excel文档!

import numpy as np
from decimal import Decimal

data_a = np.load('abc.npz')

Project_name=data_a['k_c1']#项目名称

八、云服务的使用,Python上云(暂未实现)

(正在搭建中,后续更新…)

九、搭建web网页,实现办公自动化系统(暂未实现)

(正在搭建中,后续更新…)

  • 7
    点赞
  • 6
    评论
  • 49
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

绿叶OA协同软件基于Web应用程序平台,是一款功能实用、成熟稳定、安全易用、界面大方、服务可靠的协同管理软件。以工作流程管理、文档管理、信息共享为主导,结合信息交流、业务管理、文件管理、权限管理、组织管理等管理模块,涵盖办公管理的各项事务,实现提高企业的运作效率、节省企业的办公与管理费用。 绿叶OA功能亮点 1、自定义工作流程,可无限拓展行政、财务、人事、生产、销售等流程应用。 2、专业快捷的文件传输与共享应用,支持目录式访问的网络硬盘,让企业文件交换处理高效有序运转。 3、独有的文件编辑模块,支持任意类型文件线编辑保存服务器端,广泛应用于office、CAD设计、工业电子线路、图片等格式文件,适合多人网络协同文件编辑管理。     4、多种信息提醒方式,包括开机自动登陆的小秘书,消息提醒、手机提醒、即时弹窗。  5、内嵌office控件,自持手写批注、痕迹保留、电子签名、防止文档篡改。 6、灵活的模块架构引擎,可自定义功能模块,随时屏蔽自己不需要的功能或启用需要的功能,具备良好的扩展性。 7、方便好用的即时通讯,类似QQ、MSN 软件,可发送消息、消息广播、文件、共享、让员工沟通更方便快捷。     8、支持与指纹考勤机集成,实现考勤数据与OA一体访问。领导家就可以看到每个人的上班考勤时间。
©️2021 CSDN 皮肤主题: 游动-白 设计师:白松林 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值