精华内容
下载资源
问答
  • Office自动化

    千次阅读 2016-11-22 16:17:31
    office自动化选择,一些资料。 一、技术选型 日常生活工作中,对数据(信息)处理经常用到oiifce套件,除去套件初始功能,处理内容多,烦琐时,要从重复劳动中解脱出来。比如100个工作表每个表头部自动合并设置...

    摘要

      只为方便平时工作,干点有价值含量的事,重复的让计算机去做。office自动化选择,一些资料。

    一、技术选型

    日常生活工作中,对数据(信息)处理经常用到oiifce套件,除去套件初始功能,处理内容多,烦琐时,要从重复劳动中解脱出来。比如100个工作表每个表头部自动合并设置字体;从其他文件中读取操作数据并分析;或者是每天自动从数据库、网页抓取数据,在excel实时更新完成分析,可视化。

    有多种途径达到目的:1,编程语言(python,js等)读写Excel文件,或将处理好的数据写入excel;2.使用excel自身功能,这些工作需要自动执行一组命令(宏),或解决某类问题的预制模板(office应用程序开发)。就我非专业coder而言,简洁、高效,易用、解决日常问题,我选择第二种,达到娴熟使用,并可改装制造自己生产工具。。

    在MSOffice提供一套技术,参考微软MS ignite/BPK3306,国内优酷


      总结如下:

    内置插件

    JavaScript APIS

    COM

    VBA(保持现状,不额外增加,不开发跨平台特性)

    VSTO(已经太监)

    office-js,microsoftgraph,office365api, office365connectors,

    web-addins, (跨平台,web应用,商店发布,mac和ipad,office365web)

      就我而言,日常办公,我也不 data onthe go;mobile first ,cloud first,所以选择VBA。表格备份到Icloud,百度网盘,打开一样样看,MS的onedirve在国内太慢,设想好,效果一般,我也不需要excel as server,用微软的BOT,况且虽然工作一般,但安全上至少也得有个样子。

    二、资料来源

    相关资料找的话还是去官网找,其次才是市面上的各种。吸收别人思考过总结的精华,自己可以高效的学习利用不用再多处理糟粕。除了使用excel技术之外还得有与之匹配的世界观,下边是我自己看的,仅供参考。

    1、图书教程

    罗拉的奋斗:excel菜鸟升职记  Excelhomehttps://book.douban.com/subject/20480738/
    Excel2013大全           
    Excel数据透视表应用大全
     
    ExelVBA编程实战宝典 伍高远https://book.douban.com/subject/26649840/
    谁说菜鸟不会数据分析
    (入门篇、工具篇) 小蚊子
    https://book.douban.com/subject/20373356/


    http://study.163.com/u/wzdata


    http://weibo.com/xiaowenzi22
    “偷懒”的技术:打造财务Excel达人 罗惠民https://book.douban.com/subject/26301996/

    Excel图表之道 刘万祥 https://book.douban.com/subject/4326057/


    http://study.163.com/u/ExcelPro


    http://weibo.com/excelpro
    罗刚君,曾贤志俩人都了好多书和视频教程 
      
      

    2、网站

    网有好多,挑选几个自己上的

     

    excelhome

    http://club.excelhome.net/forum.php

     

    Office官方实例及说明在github上

    www.github.com/office-Dev

    docs.microsoft.com是全新的
    Microsoft 统一技术文档体验

    https://docs.microsoft.com/zh-cn/

    有关 Microsoft 产品或服务的其他文档,请访问 MSDN 或 Technet

    第九频道

    https://channel9.msdn.com/

    TechNet

    https://technet.microsoft.com/zh-cn/

    MSDN

    https://msdn.microsoft.com/zh-cn/

    MicrosoftAPI和参考目录

    https://msdn.microsoft.com/library

    office开发人员文档

    https://msdn.microsoft.com/zh-cn/library/office/

    office开发中心

    https://dev.office.com/

    Microsoft Visual Academy

    https://mva.microsoft.com/

    其他网站

    如51cto;我要自学网;网易云课堂

     

    coursea
    从 Excel 到 MySQL:商业分析技术 专项课程

    https://www.coursera.org/specializations/excel-mysql

     



     

    展开全文
  • Microsoft Visual C# 2005 Office自动化编程实例(源码)
  • C++2008Office自动化编程实例
  • Python通过win32实现office自动化
  • Office自动化编程实例锦集使用自动化生成Excel图表,C++.net源代码编写,VisualStudio.net
  • Office自动化编程实例锦集,使用自动化导出Word文件C++.net源代码编写,VisualStudio.net
  • office自动化选择

    2016-11-22 17:11:28
    office自动化,见博客http://blog.csdn.net/u012712186/article/details/53287448
  • Python-协程office自动化

    千人学习 2017-08-24 09:27:11
    带你了解办公工具的自动化操作
  • vsc#2005实例精粹书籍源码 罗斌的书 我水平不高觉得还不错 文件太大只能分章节上传 不是我想切开多赚分:-D
  • Python实现Office办公自动化Pycharm 2018(Mac版)的下载功能快捷键如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不...

    一、 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网页,实现办公自动化系统(暂未实现)

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

    展开全文
  • WebOffice自动化系统

    2012-05-31 21:08:05
    基于Intranet/Internet技术,完全采用B/S结构的办公系统实施方案。
  • 办公室自动化系统包括收文、发文、登录过程(人脸识别登录、短信验证登录)、预约事件、处理事件等功能
  • Office自动化解决方案

    2010-11-07 21:25:57
    Developing.Microsoft.Office.Solutions 有关Office自动化编程的很好教材!
  • OFFICE自动化(asp)

    2009-05-21 15:13:40
    满足日常需要 资源大小: 1.26MB 资源类型: application/x-rar 发布人: nanqingcheng 发布日期: 1天 资源分: 5
  • office自动化 读取office版本 查看office版本
  • Office自动化编程实例锦集,使用浏览器打开Office文档C++.net源代码编写,VisualStudio.net
  • Office自动化编程实例

    2007-06-06 20:38:12
    非C程序员C++入门自学教程.PDF http://download.csdn.net/source/178897<br/>设计模式完整版(PDF) http://download.csdn.net/source/183425 <br/>Visual C++2005程序设计(初学者版) ...
  • VC++之Office自动化开发

    千次阅读 2016-03-07 14:09:39
    去年底老板临时交给一个任务...用VC进行office自动化开发,网上有很多文章,我本不想在此画蛇添足。只是感于自己查资料时的苦痛,所以就厚着脸皮把一些心得拿出来见见阳光,有一些技术还是自己摸索出来的。最后,offic

    去年底老板临时交给一个任务,为一个试验数据管理系统编写一个电子报告生成程序。因为老板也不怎么重视这个项目(钱少啊,呵呵),所以这个任务只好落在我这种小硕身上了。我也是两眼瞎,万事从头干。三个月的苦斗,还算圆满交差。用VC进行office自动化开发,网上有很多文章,我本不想在此画蛇添足。只是感于自己查资料时的苦痛,所以就厚着脸皮把一些心得拿出来见见阳光,有一些技术还是自己摸索出来的。最后,office自动化开发与我专业无丁点关系,希望此文不至于太班门弄斧让你看得难堪,如果尚有所帮助,那真是不胜荣幸(本文只涉及如何解决问题,没有原理,所以,Don’t ask me why)

    1 前话  

    本文中,只讲述如何使用VC++(就是MFC)进行WORD、EXCEL自动化开发。有几个问题先交待于此。
    (1) office开发之VC与VB实现之比较。事实上,MFC实在不适合进行office自动化开发。相对VB而言,C++是一种强调类型的语言,这使得在实际编程时通常搞得你非常烦躁,不停地返回一些毫无意义的对象或指针(鸡肋啊!),而且整个程序会显得非常冗长。VB这种属性化的编程语言则非常适于自动化开发。
    (2)office版本。在你提交帮助文档的时候,一定要说明你是针对哪个office版本开发的,否则不同的office版本可能会导致程序无法正常运行,因为不同版本的office提供的接口函数可能是不同的(特别是使用VC开发这个问题就比较明显,不知VB是否有同样的问题)。本文中所述的是office20003版本。
    (3)两个重要的学习来源。初学office开发,两个不可忽视的学习来源是:word本身的VBA宏代码和微软官方网站。录制的VBA宏代码可以给我们提供非常有用的思路,而且通过调试可以获得很多所需的参数值(因为MFC通常并不支持很多VBA宏)。微软官方网提供了许多非常实用的技术文献(本文涉及的一些技术就来自于MSDN),如果英文基础还可以的话,建议到英文MSDN上去看看,那里的资料要比中国MSDN多。
    (4)由于所有权的一些问题,所以不能提供源代码,也许会给阅读带来一些不便,这点希望谅解(而且那代码确实太臭,被我们的大师兄客气地批评得体无完肤,也就不敢拿出来献丑了)

    2 自动化技术简述   

    自动化(以前称为 OLE 自动化)是一种允许您利用现有程序的功能并将其合并到您自己的应用程序中的技术。自动化是建立在组件对象模型 (COM) 的基础上。IDipatch是自动化技术的核心。
    VARIANT是另一个重要的概念。VARIANT结构是一个通用的数据类型,IDipatch利用它来传递参数和返回值。MFC小组创建了一个COleVariant类将VARIANT结构包装起来,并被很好地用于自动化客户和组件。需要注意的是COleVariant通常只支持short, long,float等数字类型,不支持int类型,使用时请注意强制转换。关于COleVariant类的更多信息可以参看MSDN。
    关于COM技术和自动化技术更多信息请参看一些公开出版的书籍及微软官方网站资料。
    另外提前交待的是:
    (1)在进行自动化开发前,必须首先初始化COM库。通常一种便利的方法是在应用程序类的InitInstance()函数里添加以下语句:

    if(!AfxOleInit())
         {
         AfxMessageBox("OLE Initialization Failed");
         return FALSE;
         }

    (2)在自动化开发中,微软还提供了一个方便的COleVariant类型的数值,COleVariant((long)DISP_E_PARAMNOTFOUND,VT_ERROR)。通常,如果我们不清楚参数含义,均可用此值进行代替,系统会自动选择默认值传递给参数。以下行文中,我们以VarOpt代替这个COleVariant对象。

    1  Word组件对象模型   
    Microsoft Office Word 2003 对象是按层次顺序排列的,层次结构顶端的两个主类是 Application 类和 Document 类。这两个类非常重要,因为在大部分时间里,您要么是在使用 Word 应用程序本身,要么是以某种方式处理 Word 文档。Word 对象模型严格遵循用户界面。Application 对象提供整个应用程序的包装,每个 Document 对象表示单个 Word 文档。这些对象各自都有很多方法和属性,您可以使用这些方法和属性操作对象或与对象交互。
    Application 对象。Application 对象表示 Word 应用程序,是其他所有对象的父级。它的所有成员通常作为一个整体应用于 Word。可以使用该对象的属性和方法来控制 Word 环境。
    Document 对象。Document 对象是 Word 编程的中枢。当您打开文档或创建新文档时,就创建了新的 Document 对象,该对象被添加到 Word 的 Documents 集合中。焦点所在的文档叫做活动文档,由 Application 对象的 ActiveDocument 属性表示。
    Selection 对象。Selection 对象表示当前选择的区域,Selection 对象只存在一个。在 Word 用户界面中执行某项操作(例如,对文本进行加粗)时,应首先选择或突出显示文本,然后应用格式设置。Selection 对象始终存在于文档中。如果未选中任何对象,它表示插入点。此外,该对象还可以表示多个不连续的文本块。
    Range 对象。Range 对象表示文档中的一个连续的区域,由一个起始字符位置和一个结束字符位置定义。Range 对象的数量并不局限于一个。您可以在同一文档中定义多个 Range 对象。
    Bookmark 对象。Bookmark 对象与 Range 对象类似,它也表示文档中的一个连续区域,并具有一个起始位置和一个结束位置。书签用于在文档中标记一个位置,或者用作文档中的文本容器。Bookmark 对象可以小到只有一个插入点,也可以大到整篇文档。您还可以在文档中定义多个书签。

    对于Microsoft OfficeWord 2010,通常可以在..//Microsoft Office//OFFICE14// MSWORD.OLB   获得相关接口类。

    常用的有_Application, Documents, _Document, Selection, Range等。此外,用于设置字体的_Font,段落格式的_ParagraphFormat,表格对象Tables及Table,目录对象TablesOfContents及TableOfContents等等也是常用的。


    2  Word启动与退出     
    使用Application 对象,关联接口、释放接口。具体代码如下:
    _Application theExcelApp;
    theExcelApp.CreateDispatch("word.application", NULL); //关联接口
    退出
    theExcelApp.Quit();  退出
    theExcelApp.ReleaseDispatch();  //释放接口

    3   Word表格操作    
    使用单文档对象_Document,表格集合对象Tables,表格对象Table,行对象Rows,单元格对象Cell,列集合对象Columns,列对象Column,区域对象Range等可对表格进行操作。
    插入表格。使用_Document:: GetTables返回一个Tables对象,使用Tables::Add在指定区域插入一个表格。
    获取列对象。使用Table:: GetColumns返回一个Columns对象,使用Columns:: Item返回一个Column对象。从而可以列为对象进行操作。
    单元格插入文字。使用Table:: Cell返回Cell对象,使用Cell:: GetRange返回区域对象,或者使用Cell::Select使得表格获得输入焦点,从而进行编辑。

    4  文字转换为表格    
    当需要把一个记事本(*.txt)文件转换为表格插入到Word文档中。最快捷的作法是将txt内容粘贴到word文档中,然后将内容转化为表格。步骤如下:
    首先确定一个插入txt内容的Range对象。
    使用Range::InsertFile函数。InsertFile函数声明为:
       void Range::InsertFile(LPCTSTR FileName, VARIANT* Range, VARIANT* ConfirmConversions, VARIANT* Link, VARIANT* Attachment)
    参数说明如下:
    FileName 插入文本路径。
    Range 插入文本内容的Range对象,设为NULL
    ConfirmConversions 确认转换,设为FALSE
    Link 链接到文件,设为FALSE
    Attachment 链接行为,设为FALSE
    使用Range:: ConvertToTable转换文字为表格,返回一个Table对象。ConvertToTable函数声明为:
    LPDISPATCH Range::ConvertToTable(VARIANT* Separator, VARIANT* NumRows, VARIANT* NumColumns, VARIANT* InitialColumnWidth, VARIANT* Format, VARIANT* ApplyBorders, VARIANT* ApplyShading, VARIANT* ApplyFont, VARIANT* ApplyColor, VARIANT* ApplyHeadingRows, VARIANT* ApplyLastRow, VARIANT* ApplyFirstColumn, VARIANT* ApplyLastColumn, VARIANT* AutoFit, VARIANT*, VARIANT* DefaultTableBehavior)
    参数说明如下:
    Separator 分隔符。通常设为1,即设置制表符为分隔符(如果采用其他分隔符,请适当修改)
    NumRows 表格行数目
    NumColumns 列数目
    InitialColumnWidth,Format,ApplyBorders,ApplyShading,ApplyFont,ApplyColor,ApplyBorders,ApplyFirstColumn,ApplyLastColumn, DefaultTableBehavior,均可设为VarOpt,由系统默认
    AutoFit 自动调整。设为0
    也可利用Selection对象代替Range对象进行文本转换表格,调用函数与Range对象的函数名称一致,参数略有出入。

    5 设置页码       
    通常我们需要在任意指定页开始插入新页码。网上很多文章都是只能在第二页开始设置。以下介绍我通过观察VBA宏代码得到的一种插入页码的方法(实现方法当然可能不止一种,我曾在网上看到曾有一篇文章提及这个问题,但是他的代码不能正常运行,估计是作者发布文章的时候有些不小心有遗漏)。要点在于插入分节符和取消,并且要注意返回当前节。步骤如下:
    0 在前一页使用Selection::InsertBreak插入分节符,参数值为2(参数值7为分页符)。
    1 使用_Document::GetActiveWindow返回窗口Window对象。
    2 使用Window:: GetActivePane返回当前活动Pane窗格对象
    3 使用Pane::GetView返回View视图对象,View::SetType(long(3))。
    4 使用SetSeekView(long(10))获得页眉页脚视图。
    5 使用Selection::GetHeaderFooter()获得页眉页脚对象HeaderFooter。
    6 使用HeaderFooter::SetLinkToPrevious(FALSE)取消“与上一节相同”。
    7此时输入较点Selction停留在上一节的页脚处。使用View::SetSeekView(long(0))将返回到当前节的文字视图中。
    8 使用View::SetSeekView(long(10))再次获得本节的页眉页脚视图。
    9 使用Selection::GetHeaderFooter()获得页眉页脚对象HeaderFooter。
    10 使用HeaderFooter::GetRange获得Range对象rangeheadfoot。
    11 使用Range:: GetFields获得Fields对象。
    12使用Fields:: Add获得Field对象,具体参数赋值为Add(rangeheadfoot,COleVariant(short(33)),varOpt,varOpt)。
    13 使用Fields::GetPageNumbers()获得PageNumbers页码对象。
    14使用PageNumbers对象的方法设置属性。特别要设置SetStartingNumber(long(1))。
    PageNumbers对象的其他设置可参考如下:
    SetNumberStyle(long(0));
     SetHeadingLevelForChapter(long(0));
     SetIncludeChapterNumber(FALSE);
     SetChapterPageSeparator(long(0));
     SetRestartNumberingAtSection(true);
    15 通过Range对象rangeheadfoot设置页码居中及文字大小。
    16 结束页码设置。使用View::SetSeekView(long(0))返回到文字视图。

    6 插入Excel图表    
    在Excel生成图表后,Word可将其嵌入文档中并改变其格式。用户可以通过双击图表对象激活,然后进行类似于Excel环境下的操作。具体操作如下:
    使用Selection:: GetInlineShapes。获得内嵌区域集合对象InlineShapes。
    使用InlineShapes::AddOLEObject插入表格,并获得内嵌区域对象InlineShape。AddOLEObject函数声明为:
    LPDISPATCH AddOLEObject(VARIANT* ClassType, VARIANT* FileName, VARIANT* LinkToFile, VARIANT* DisplayAsIcon, VARIANT* IconFileName, VARIANT* IconIndex, VARIANT* IconLabel, VARIANT* Range)
    参数说明如下:
    ClassType 插入类型,若为Excel对象,设为COleVariant("Excel.Sheet.8")。
    FileName 文件路径。
    LinkToFile 链接到文件。设为FALSE。
    DisplayAsIcon 显示为图标,设为FALSE。
    IconFileName 文件名图标,设为VarOpt。
    IconIndex 索引图标,设为VarOpt。
    IconLabel 标签图标,设为VarOpt。
    Range 区域,设为VarOpt。
    使用InlineShape的方法SetHeight、SetWidth调整大小。这些方法的参数值都是打印格式下的英磅数值。

    7 生成目录     
    单文档对象_Document,目录集合对象TablesOfContents,目录对象TableOfContents及Range对象。操作流程如下:
    使用_Document:: GetTablesOfContents返回TablesOfContents对象。
    TablesOfContents::Add返回TableOfContents对象。
    LPDISPATCH TablesOfContents::Add(LPDISPATCH Range, VARIANT* UseHeadingStyles, VARIANT* UpperHeadingLevel, VARIANT* LowerHeadingLevel, VARIANT* UseFields, VARIANT* TableID, VARIANT* RightAlignPageNumbers, VARIANT* IncludePageNumbers, VARIANT* AddedStyles, VARIANT* UseHyperlinks, VARIANT* HidePageNumbersInWeb, VARIANT* UseOutlineLevels)
    参数说明如下:
    Range 插入目录的Range对象。通常目录是文档生成结束时进行插入的,因此必须事先指定插入目录的区域Range对象。
    UseHeadingStyles 使用制表符前导符,设为TRUE
    UpperHeadingLevel 顶级目录,通常设为1
    LowerHeadingLevel 底级目录,根据需要赋值
    UseFields 使用区域,设为FALSE
    TableID 目录索引,以1起始
    RightAlignPageNumbers 页码右对齐,设为TRUE
    IncludePageNumbers 包含页码,
    AddedStyles 增加类型,设为NULL
    UseHyperlinks 使用超链接,设为TRUE
    HidePageNumbersInWeb Web页中隐藏页码,设为TRUE
    UseOutlineLevels 使用大纲级别,设为TRUE
    使用TableOfContents:: GetRange获取区域对象,进行其他例如文字大小控制等操作。
    TableOfContents:: UpdatePageNumbers更新页码。


    二 EXCEL篇及命名空间说明
    1 Excel组件对象模型     

    Microsoft Office Excel 2003文档中的数据是高度结构化的,因此Excel对象模型也具有层次结构并且简单明了。Excel 提供了数百个您可能需要与之交互的对象,但是最为重要的是以下四个对象:Application 对象、Workbook 对象、Worksheet 对象和Range 对象。很多工作都是围绕这四个对象进行的。

    对于Microsoft OfficeExcel 2010,通常可以在..//Microsoft Office//OFFICE14// EXCEL.exe    获得相关接口类。

    常用的有_Application, Workbooks, _Workbook, Worksheets, _Worksheet, Range,以及用于生成图表的_Chart等。


    Application 对象。Application 对象表示 Excel 应用程序本身。Application 对象提供了大量有关正在运行的应用程序、应用于该实例的选项以及在该实例中打开的当前用户的对象的信息。
    Workbook 对象。Workbook 类表示 Excel 应用程序内的单个工作簿。Application 类的许多成员同时也是 Workbook 类的成员。在这种情况下,属性应用于特定的工作簿(而非应用于活动工作簿)。
    Worksheet 对象。虽然 Worksheet 类提供了大量成员,但大部分属性、方法和事件都与 Application 和/或 Workbook 类提供的成员相同或相似。Excel 提供 Sheets 集合作为 Workbook 对象的属性,但 Excel 中没有 Sheet 类。实际上,Sheets 集合的每个成员不是 Worksheet 对象就是 Chart 对象。
    Range 对象。Range 对象是 Excel 应用程序中最常用的对象。在能够处理 Excel 内的任何范围之前,必须将它表示为 Range 对象,并处理该对象的方法和属性。Range 对象表示一个单元格、一行、一列、包含一个或多个单元格块(可以连续,也可以不连续)的单元格选定范围,甚至多个工作表中的一组单元格。


    另外,使用MS Graph对象的技术同样可以生成数据图表。但是,对象写入大数据量非常缓慢的。MS Graph工作原理是每写入一个数据就要对图表进行更新,因此,MS Graph对于小数据制作图表是合适的(实现代码比EXCEL要少),但对于大数据这种工作原理是难以忍受的。尽管如此,EXCEL与MS Graph的接口函数却是非常相似的。

    2 Excel启动与退出     
    使用Application 对象,关联接口、释放接口。具体代码如下:
    _Application theExcelApp;
    theExcelApp.CreateDispatch("Excel.Application", NULL); //关联接口
    退出
    theExcelApp.Quit();  退出
    theExcelApp.ReleaseDispatch();  //释放接口


    3 Excel打开记事本(*.txt)         
    通常,我们需要从文本(*.txt)文件中载入数据。Excel的Workbooks对象提供了打开文本的函数OpenText ()。OpenText()函数声明如下:
    OpenText(LPCTSTR Filename, const VARIANT& Origin, const VARIANT& StartRow, const VARIANT& DataType, long TextQualifier, const VARIANT& ConsecutiveDelimiter, const VARIANT& Tab, const VARIANT& Semicolon, const VARIANT& Comma, const VARIANT& Space, const VARIANT& Other, const VARIANT& OtherChar, const VARIANT& FieldInfo, const VARIANT& TextVisualLayout, const VARIANT& DecimalSeparator, const VARIANT& ThousandsSeparator, const VARIANT& TrailingMinusNumbers, const VARIANT& Local)
    参数说明如下:
    Filename 文本路径。
    Origin 文件原始格式。通常值为936,表示简体中文。
    StartRow 导入起始始行。在本报告中第一行为标题行,导入起始行为2。
    DataType 数据类型。值设为1。
    TextQualifier 文本格式。值为1。
    ConsecutiveDelimiter 连续分隔符。值为TRUE
    Tab Tab分隔符。值为FALSE。
    Semicolon 分号分隔符。值为FALSE。
    Comma 逗号分隔符。值为FALSE。
    Space 空格分隔符。本电子报告中通常以空格作为分隔符,因此值为TRUE。如若采用其他分隔符,请适当修改。
    Other 其它分隔符。值为FALSE。
    OtherChar 其他文本识别符号。值为NULL。
    FieldInfo 区域信息。同载入文本列数据格式相关。设为VarOpt。
    TextVisualLayout 文本可见版式。设为VarOpt。
    DecimalSeparator 小数分隔符。设为VarOpt。
    ThousandsSeparator 千位分隔符。设为VarOpt。
    TrailingMinusNumbers 按负号跟踪负数。设为TRUE。
    Local 本地数据。设为VarOpt。
    以上各参数请根据适当需要修改,并根据调试VBA宏代码获得参数值。
    要说明的是,这种方法载入数据将从B列往后分布。即,如果是TXT文本里有两列数据,那么载入EXCEL后,这两列数据将分布在B列与C列,而A列为空。这个原因我也一直不得其解(不知道是我们合作方提供的TXT文本本身设置问题还是别的问题)。这点请读者注意,也请高手指点。

    4 获取Excel行数目      
    载入记事本数据后,需要调用_Worksheet对象获得数据的行数目。具体代码如下:
    _Worksheet ::GetUsedRange();
    获得已用区域,返回Range对象。注意,这里不能调用_Worksheet ::GetRange();
    Range:: GetRows(); 
    获得行对象。返回Range对象。
    Range:: GetCount();
    获得行数目。
    获得行数目在进行生成图表是很重要的。在生成图表时,载入源数据的区域时需要获得行数目。

    5 生成Excel图表及格式          
    使用对象。以下要设置其格式。
    _Chart:: SetChartType 设置图表类型。如果使用无数据点平滑线散点图,值为73。其它图表类型请自己录制VBA宏然后调试获得参数值。
    _Chart:: SetSourceData生成图表的原数据。传递一个Range对象。
    _Chart:: SetHasLegend 标注。设为FALSE,不显示标注。
    _Chart:: SetHasTitle 标题。设为TRUE,显示标题。
    并假设获得行数目为432,则SetSourceData的参数值为Range(“B1”, “C432”)。

    如果需要对网格线进行格式控制,需要调用以下函数:
    _Char::Axes 返回Axis对象
    Axis::SetHasMajorGridlines 设置主格线,TRUE
    Axis::SetHasMinorGridlines 设置次格线,FALSE
    Axis::GetMajorGridlines 获得主格线对象(前提是设置主格线为TRUE),返回Gridlines对象
    Gridlines::GetBorder 获得边框对象,返回Borders对象
    Borders::SetColorIndex 设置颜色,57表示黑色
    Borders::SetLineStyle 设置线条格式,-4118表示虚线
    Borders::SetWeight 设置粗细
    以上Borders各参数值可根据需要适当修改。

    Axis::SetCrossesAt 可设置坐标轴相交位置。通常需要Axis::GetMinimumScale获得最小刻度值,然后相交于最小刻度值。


    6 设置标题文字及曲线格式    
    使用AxisTitle ,,Font对象设置文字,包括设置文字上标等。注意,Excel并不提供类似于Word的Selection对象,要进行文字格式控制,通常需要用到Characters对象,即对指定文字进行格式控制。
    使用Series,Borders对象可对曲线进行控制。可利用_Char:: SeriesCollection返回一个Series对象。

    7 保存     
    使用_Workbook:: SaveAs函数。具体参数值设置较为简单,参看VBA宏代码即可。此处略。

    8 命名空间namespace     
    由于许多Word的对象与Excel对象的名字是相同的,因此,必须使用名字空间将其区分。命名空间的使用方法很简单,在.h和.cpp文件分别添加
    namespace mynamespace
    {
       //Statement;
    }
    把名字有冲突的类的声明与实现放入namespace的作用域里。然后调用类是前面加命名空间作用符。
    举例如下:Word和Excel都有_Application对象,如果不使用命名空间则会发生编译错误。
    可在excel.h添加
    namespace myExcel
    {
         class _Application : public COleDispatchDriver
    {
       //Statement;
    }
    }
    在excel.cpp将所有_Application的方法放入到命名空间中。
    namespace myExcel
    {
    (_Application的方法实现代码)
    }
    调用Excel的_Application对象类时,使用方法为
    myExcel:: _Application _myExcelApp;
    即声明该_Application属于myExcel命名空间作用域。
    关于命名空间在C++教材的“高级主题部分”会有涉及。

    展开全文
  • 嵌入excel office自动化

    2009-02-19 20:26:20
    嵌入excel office自动化 将excel嵌入到自己的窗体中
  • Office自动化编程实例锦集,如何使用自动化导出Excel文件C++.net源代码编写,VisualStudio.net
  • 目前市面上已有的关于Office自动化的书籍,多是快餐式的,看过之后只能知道最基本的使用。要想更多的了解,非得MSDN不可。下面就是msdn上跟office开发相关的详细资料。总目录:...

    学习Office自动化之前先阅读一些COM书籍,对于理解Office自动化有很大帮助。以下示例代码使用VS2010进行编译。目前市面上已有的关于Office自动化的书籍,多是快餐式的,看过之后只能知道最基本的使用。要想更多的了解,非得MSDN不可。下面就是msdn上跟office开发相关的详细资料。

    总目录:http://msdn.microsoft.com/en-us/library/bb726434(v=office.12)

     

    针对Office2007:http://msdn.microsoft.com/en-us/library/bb726436(v=office.12)

     

    Word组件对象详细资料:http://msdn.microsoft.com/msword.tlhen-us/library/bb244515(v=office.12).aspx

    可以参看组件对象的详细信息,包括属性,方法等等介绍。

     

    使用VC进行自动化编程的基本步骤:

    1.初始化COM组件---应用程序调用com库中的函数(除CoGetMalloc和内存分配函数)之前必须初始化com库

    2.建立Application对象并使之运行---建立自动化对象以便使用其提供的功能

    3.使用Application对象提供的方法、事件实现自动化处理过程

    4.关闭自动化对象

     

    示例:从Word文档中获取文档属性(文档页数、文档作者等)

     

    1.新建基于对话框的项目GetWordPro,并添加一些用于打开,显示Word文档属性的简单控件。

     

    2.在项目中引入类型库

    Class Wizard->Add Class->MFC class From Type Lib(关于类型库,COM相关书籍有详细介绍)->在Available Tpe libraries中选择 Microsoft Word 12.0Object Library<8.4>

    我用的是Office 2007组件,版本不同名称会稍有不同。作为初学,对各个接口不是太了解的情况下,我们选择全部的接口到Generated Classes后finish。等熟悉之后就可以挑选自己需要的接口了。

     

    3.在对话框类中声明我们需要的对象

    //Represents the Microsoft Office Word application.   
        //For example, the ActiveDocument property returns a Document object.  
        CApplication    m_oApp;  
      
        //A collection of all the Document objects that are currently open in Word.  
        CDocuments      m_oDocs;   
      
        CDocument0      m_oDoc;

    4.OnInitDialog()中添加以下代码

    // TODO: Add extra initialization here  
        if (CoInitialize(NULL) != 0)  
        {  
            AfxMessageBox(_T("COM库初始化失败!"));  
            exit(1);  
        }  
      
        if (!m_oApp.CreateDispatch(_T("Word.Application"), NULL))  
        {  
            AfxMessageBox(_T("启动Word程序失败!"));  
            return FALSE;  
        }  
          
        //COM VARIANT类型的封装类  
        COleVariant vopt(DISP_E_PARAMNOTFOUND, VT_ERROR);  
        //This structure is used by IDispatch::Invoke to contain the arguments passed to a method or property.  
        DISPPARAMS dpNoArgs = {NULL, NULL, 0, 0};  
        HRESULT hr;  
        VARIANT vResult;  
        //添加一个新文档  
        m_oDocs = m_oApp.get_Documents();  
        m_oDoc = m_oDocs.Add(vopt, vopt, vopt, vopt);  
      
        //用于保存Word内置属性接口  
        //IDispatch is the COM interface for automation  
        LPDISPATCH lpdispProps;  
        lpdispProps = m_oDoc.get_BuiltInDocumentProperties();  
      
        hr = lpdispProps->Invoke(0x4, IID_NULL, LOCALE_NAME_USER_DEFAULT,  
            DISPATCH_PROPERTYGET, &dpNoArgs, &vResult, NULL, NULL);  
        long lPropCount = vResult.lVal;  
        CComboBox * pComboList = (CComboBox*)GetDlgItem(IDC_PROPERTY_COM);  
      
        char szPropName[255];  
        DISPPARAMS dpItem;  
        VARIANT vArgs[1];  
        vArgs[0].vt = VT_I4;  
        vArgs[0].lVal = 0;  
        dpItem.cArgs = 1;  
        dpItem.cNamedArgs = 0;  
        dpItem.rgvarg = vArgs;  
      
        //向列别添加可选项  
        for (long i = 1; i <= lPropCount; i++)  
        {  
            //获得一个文档属性  
            dpItem.rgvarg[0].lVal = i;  
            hr = lpdispProps->Invoke(0x0, IID_NULL, LOCALE_NAME_USER_DEFAULT,   
                DISPATCH_PROPERTYGET, &dpItem, &vResult, NULL, NULL);  
            LPDISPATCH lpdispProp = vResult.pdispVal;  
            hr = lpdispProp->Invoke(0x3, IID_NULL, LOCALE_NAME_USER_DEFAULT,  
                DISPATCH_PROPERTYGET, &dpNoArgs, &vResult, NULL, NULL);  
            pComboList->InsertString(-1, vResult.bstrVal);  
            lpdispProp->Release();  
        }  
      
        lpdispProps->Release();  
          
        //关闭文档  
        m_oDoc.Close(COleVariant((short)false), vopt, vopt);  
        m_oDoc.ReleaseDispatch();  
        m_oDoc.m_lpDispatch = NULL;  
      
        pComboList->EnableWindow(0); 

    这一段的注意点:get_BuiltInDocumentProperties();函数调用返回的是 DocumentProperties Collection 对象http://msdn.microsoft.com/en-us/library/aa190807(v=office.10).aspx  。属性值有多个,可以在 http://msdn.microsoft.com/en-us/library/microsoft.office.interop.word.wdbuiltinproperty(v=office.14).aspx或者msword.tlh(由导入类型库之后在Debug生成的头文件)中的enum WdBuiltInProperty查看。例子中直接使用了0x3这样的id值,如果只知道方法或者属性的名字的前提下,可以使用 http://support.microsoft.com/kb/179494中的方法。

     

    5.其他控件的响应函数

    void CGetWordPropDlg::OnBnClickedChooseword()  
    {  
        // TODO: Add your control notification handler code here  
        OPENFILENAME ofn;  
        TCHAR lpStrFileName[MAX_PATH] = _T("");  
        ZeroMemory(&ofn, sizeof(ofn));  
      
        ofn.lStructSize = sizeof(OPENFILENAME);  
        ofn.hwndOwner = this->m_hWnd;  
        ofn.lpstrFilter = _T("Word(.docx)\0*.docx\0");  
        ofn.nMaxFile = MAX_PATH;  
        ofn.lpstrFile = lpStrFileName;  
        ofn.hInstance = AfxGetInstanceHandle();  
        ofn.Flags = OPEN_EXISTING;  
      
        if (GetOpenFileName(&ofn) == IDOK)  
        {  
            CString strFile = ofn.lpstrFile;  
            SetDlgItemText(IDC_FILENAME, strFile);  
            CComboBox* pComboList = (CComboBox*)GetDlgItem(IDC_PROPERTY_COM);  
            pComboList->EnableWindow(TRUE);  
      
            COleVariant vopt(DISP_E_PARAMNOTFOUND, VT_ERROR);  
            if (m_oDoc.m_lpDispatch != NULL)  
            {  
                m_oDoc.Close(COleVariant((short)false), vopt, vopt);  
                m_oDoc.ReleaseDispatch();  
                m_oDoc.m_lpDispatch = NULL;  
            }  
            m_oDoc = m_oDocs.Open(COleVariant(strFile), vopt, COleVariant((short)true), vopt, vopt,  
                vopt,vopt,vopt,vopt, vopt, vopt, vopt, vopt, vopt, vopt,vopt);  
        }  
    }  
      
      
    void CGetWordPropDlg::OnSelchangePropertyCom()  
    {  
        // TODO: Add your control notification handler code here  
        CString sProperty;  
        CComboBox* pComboPropList = (CComboBox*)GetDlgItem(IDC_PROPERTY_COM);  
        pComboPropList->GetLBText(pComboPropList->GetCurSel(), sProperty);  
      
        LPDISPATCH lpdispProps;  
        lpdispProps = m_oDoc.get_BuiltInDocumentProperties();  
      
        VARIANT vResult;  
        DISPPARAMS dpItem;  
        VARIANT vArgs[1];  
        vArgs[0].vt = VT_BSTR;  
        vArgs[0].bstrVal = sProperty.AllocSysString();  
        dpItem.cArgs = 1;  
        dpItem.cNamedArgs = 0;  
        dpItem.rgvarg = vArgs;  
        HRESULT hr = lpdispProps->Invoke(0x0, IID_NULL, LOCALE_NAME_USER_DEFAULT,  
            DISPATCH_PROPERTYGET, &dpItem, &vResult, NULL, NULL);  
      
        SysFreeString(vArgs[0].bstrVal);  
      
        DISPPARAMS dpNoArgs = {NULL, NULL, 0, 0};  
        LPDISPATCH lpdispProp;  
        lpdispProp = vResult.pdispVal;  
      
        hr = lpdispProp->Invoke(0x0, IID_NULL, LOCALE_NAME_USER_DEFAULT,  
            DISPATCH_PROPERTYGET, &dpNoArgs, &vResult, NULL, NULL);  
      
        CString sPropValue = _T("");  
        switch (vResult.vt)  
        {  
        case VT_BSTR:  
            sPropValue = vResult.bstrVal;  
            break;  
        case VT_I4:  
            sPropValue.Format(_T("%d"), vResult.lVal);  
            break;  
        case VT_DATE:  
            {  
                COleDateTime dt(vResult);  
                sPropValue = dt.Format(0, LANG_USER_DEFAULT);  
                break;  
            }  
        default:  
            sPropValue = _T("该属性不可用");  
            break;  
        }  
        SetDlgItemText(IDC_PROPERTY_VALUE, sPropValue);  
        lpdispProp->Release();  
        lpdispProps->Release();  
    }  
      
      
    void CGetWordPropDlg::OnDestroy()  
    {  
        CDialogEx::OnDestroy();  
      
        // TODO: Add your message handler code here  
        COleVariant vopt(DISP_E_PARAMNOTFOUND, VT_ERROR);  
        m_oApp.Quit(COleVariant((short)false), vopt, vopt);  
        CDialogEx::OnCancel();  
    }
    在编译的过程中会出现编译的错误,全部指向msword.tlh文件,需要在CApplication.h、CDocuments.h等实用到的头文件中添加红色部分,是因为命名冲突导致的编译失败

    #import "C:\\Program Files\\Microsoft Office\\Office12\\MSWORD.OLB" no_namespace raw_interfaces_only rename("FindText","_FindText")rename("Rectangle","_Rectangle") rename("ExitWindows","_ExitWindows")


    6.运行结果

     

    示例一:保存至Word

    经过一些了解之后,就不需要每次都将所有的接口导入工程了。可以根据需要导入,此次导入的接口为:

    Application、_Document、Documents、Range。新建基于对话框的MFC工程,引入头文件,关键代码如下:

    void CWordOperationDlg::OnClickedButton1()
    {
    	// TODO: Add your control notification handler code here
    	CApplication oApp;
    	CDocuments	oDocs;
    	CDocument0	oDoc;
    
    	if (!oApp.CreateDispatch(_T("Word.Application"), NULL))
    	{
    		AfxMessageBox(_T("启动Word程序失败!"));
    		exit(1);
    	}
    
    	//查看自动化过程
    	oApp.put_Visible(true);
    	oDocs = oApp.get_Documents();
    	COleVariant varOPt(DISP_E_PARAMNOTFOUND, VT_ERROR);
    	COleVariant varStartLine, varEndLine;
    	varStartLine.intVal = 2;
    	varEndLine.intVal = 50;
    	//添加一个新文档
    	oDoc = oDocs.Add(varOPt, varOPt, varOPt, varOPt);
    
    	//获取文档区域
    	CRange range =  oDoc.Range(varStartLine, varEndLine);
    	UpdateData(TRUE);
    	range.put_Text(m_edit);
    	//保存docx文档
    	try
    	{
    		oDoc.SaveAs(COleVariant(_T("G:\\softwaredevelopment\\MFC_VC_Windows\\project\\TEMP.DOCX")),
    			varOPt, varOPt, varOPt,
    			varOPt, varOPt, varOPt,
    			varOPt, varOPt, varOPt,
    			varOPt, varOPt, varOPt,
    			varOPt, varOPt, varOPt);
    	}
    	catch (COleException* e)
    	{
    		LPVOID lpMsg;
    		::FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | 
    			FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, e->m_sc,
    			MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR)&lpMsg, 0, NULL);
    		::MessageBox(NULL, (LPCTSTR)lpMsg, _T("COM Error"), MB_OK|MB_SETFOREGROUND);
    		::LocalFree(lpMsg);
    	}
    	catch(COleDispatchException *e)
    	{
    		TCHAR msg[512];
    		wsprintf(msg, _T("程序运行出错'%d',系统提示信息为:\n\n%s"), e->m_scError & 0x0000FFFF,
    			e->m_strDescription);
    		::MessageBox(NULL, msg, _T("无法保存文件"), MB_OK|MB_SETFOREGROUND);
    	}
    
    	oDoc.Close(varOPt, varOPt, varOPt);
    	oApp.Quit(varOPt, varOPt, varOPt);
    }

    运行结果:


     

    示例二:Word表格操作

    Word表格由表和单元格组成,对应Table和Cell对象,在以上工程中引入相应接口Table,Tables,Cell,Paragraph,Paragraphs,对表格的添加过程是先建表,再设置单元格。

    在以上工程的基础上添加的关键代码:

    //得到段落
    	oParas = oDoc.get_Paragraphs();
    	oPara = oParas.get_First();
    	//得到段落区域
    	oRange = oPara.get_Range();
    	//设置第一段内容
    	oRange.put_Text(_T("标题"));
    	oPara.put_Alignment(1);
    
    	COleVariant table_start(short(2));
    	oRange = oDoc.Range(table_start, varOPt);
    	//添加表格
    	oTables = oDoc.get_Tables();
    	oTable = oTables.Add(oRange, 3, 3, varOPt, varOPt);
    	//设置表格内容
    	for (int i = 1; i <= 3; i++)
    	{
    		for (int j = 1; j <= 3; j++)
    		{
    			oCell = oTable.Cell(i, j);
    			oRange = oCell.get_Range();
    			CString txt;
    			txt.Format(_T("第%d行第%d列"),i,j);
    			oRange.put_Bold(1);
    			oRange.put_Text(txt);
    		}
    	}

    操作Word结果:

     

    示例二:Word报表解决方法

    由以上示例可以看出对Word的操作是相当繁琐的,针对于此,利用Word的模板,只需填入关键文字,就能得到一份精美的Word文档。

    同理,首先将报表的格式固定做成模板,程序向单元格填入数据。而利用“书签”就能快速定位正确的输出位置。在类型库中,对应的接口为Bookmarks、Bookmark。
    1、先准备好Wrod模板

    2、新建MFC基于对话框工程WordReport

    3、根据需要引入类型库中的接口

    关键部分代码:

    void CWordReportDlg::OnBnClickedButton1()
    {
    	// TODO: Add your control notification handler code here
    	CTable0		table;
    	CTables0	tables;
    	if (!m_oApp.CreateDispatch(_T("Word.Application"), NULL))
    	{
    		AfxMessageBox(_T("Create Word service failed!"));
    		exit(1);
    	}
    
    	m_oApp.put_Visible(true);
    	m_oDocs = m_oApp.get_Documents();
    	COleVariant vopt(DISP_E_PARAMNOTFOUND, VT_ERROR);
    	COleVariant start_line, end_line;
    	COleVariant dot(_T("G:\\softwaredevelopment\\MFC_VC_Windows\\project\\template.dot"));
    	//使用模板建立文档
    	m_oDoc = m_oDocs.Add(&dot, &vopt, &vopt, &vopt);
    	//获取文档书签
    	m_oBookmarks = m_oDoc.get_Bookmarks();
    	//依次设置标签
    	COleVariant tem1(_T("rol1"));
    	m_oBookmark = m_oBookmarks.Item(&tem1);
    	m_oRange = m_oBookmark.get_Range();
    	//设置标题
    	m_oRange.put_Text(_T("标题1"));
    	
    	COleVariant tem2(_T("rol2"));
    	m_oBookmark = m_oBookmarks.Item(&tem2);
    	m_oRange = m_oBookmark.get_Range();
    	//设置标题
    	m_oRange.put_Text(_T("标题2"));
    
    	COleVariant tem3(_T("rol3"));
    	m_oBookmark = m_oBookmarks.Item(&tem3);
    	m_oRange = m_oBookmark.get_Range();
    	//设置标题
    	m_oRange.put_Text(_T("标题3"));
    
    	//设置报表时间
    	COleVariant tem4(_T("time"));
    	m_oBookmark = m_oBookmarks.Item(&tem4);
    	m_oRange = m_oBookmark.get_Range();
    	//设置标题
    	m_oRange.put_Text(_T("2012年5月20日"));
    
    	//设置单元格内容
    	tables = m_oDoc.get_Tables();
    	table = tables.Item(1);
    	CCell cell;
    	for (int i = 2; i <= 9; i++)
    	{
    		for (int j = 1; j <= 3; j++)
    		{
    			cell = table.Cell(i,j);
    			m_oRange = cell.get_Range();
    			m_oRange.put_Text(_T("template"));
    		}
    	}
    }
    
    
    void CWordReportDlg::OnBnClickedButton2()
    {
    	// TODO: Add your control notification handler code here
    	if (m_oDocs.m_lpDispatch == NULL)
    	{
    		AfxMessageBox(_T("can't preview!"));
    		return;
    	}
    	else
    	{
    		if (!m_oApp.get_PrintPreview())
    		{
    			m_oApp.put_PrintPreview(TRUE);
    		}
    		else
    		{
    			m_oApp.put_PrintPreview(FALSE);
    		}
    	}
    }
    
    
    void CWordReportDlg::OnBnClickedButton3()
    {
    	// TODO: Add your control notification handler code here
    	if (m_oDocs.m_lpDispatch == NULL)
    	{
    		AfxMessageBox(_T("Nothing! can't save!"));
    		return;
    	}
    	else
    	{
    		OPENFILENAME ofn;
    		TCHAR lpStrFileName[MAX_PATH] = _T("");
    		ZeroMemory(&ofn, sizeof(ofn));
    
    		ofn.lStructSize = sizeof(OPENFILENAME);
    		ofn.hwndOwner = this->m_hWnd;
    		ofn.lpstrFilter = _T("Word(.docx)\0*.docx\0");
    		ofn.nMaxFile = MAX_PATH;
    		ofn.lpstrFile = lpStrFileName;
    		ofn.hInstance = AfxGetInstanceHandle();
    		ofn.Flags = OPEN_EXISTING;
    
    		COleVariant varOPt(DISP_E_PARAMNOTFOUND, VT_ERROR);
    		if (GetSaveFileName(&ofn) == IDOK)
    		{
    			CString sFile = ofn.lpstrFile;
    			try
    			{
    				m_oDoc.SaveAs(COleVariant(sFile),
    					varOPt, varOPt, varOPt,
    					varOPt, varOPt, varOPt,
    					varOPt, varOPt, varOPt,
    					varOPt, varOPt, varOPt,
    					varOPt, varOPt, varOPt);
    			}
    			catch (COleException* e)
    			{
    				LPVOID lpMsg;
    				::FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | 
    					FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, e->m_sc,
    					MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR)&lpMsg, 0, NULL);
    				::MessageBox(NULL, (LPCTSTR)lpMsg, _T("COM Error"), MB_OK|MB_SETFOREGROUND);
    				::LocalFree(lpMsg);
    			}
    			catch(COleDispatchException *e)
    			{
    				TCHAR msg[512];
    				wsprintf(msg, _T("程序运行出错'%d',系统提示信息为:\n\n%s"), e->m_scError & 0x0000FFFF,
    					e->m_strDescription);
    				::MessageBox(NULL, msg, _T("无法保存文件"), MB_OK|MB_SETFOREGROUND);
    			}
    
    			COleVariant vopt(DISP_E_PARAMNOTFOUND, VT_ERROR);
    			m_oApp.Quit(COleVariant((short)true), vopt, vopt);
    		}
    	}
    }

    程序运行结果:


    http://blog.csdn.net/leohels/article/details/7582881

    http://blog.csdn.net/leohels/article/details/7584571

    展开全文
  • Office自动化编程实例锦集,C++.net源代码编写
  • Office自动化编程实例锦集设置新建Word文档属性,C++.net源代码编写,VisualStudio.net
  • Python通过win32实现office自动化 - Word

    千次阅读 2018-05-24 13:12:49
    Python通过win32 com接口实现offic自动化小结最近几天通过Python做一些自动生成office报表的东东,比如解析.xml文件,导出.html/WORD/PPT等格式,html不足一提,只需要简单的html静态网页知识即可,这儿要说的是怎么...
  • Office自动化编程实例锦集使用自动化自制Excel工具栏,C++.net源代码编写,VisualStudio.net
  • //查看自动化过程 oApp.put_Visible(true); oDocs = oApp.get_Documents(); COleVariant varOPt(DISP_E_PARAMNOTFOUND, VT_ERROR); COleVariant varStartLine, varEndLine; varStartLine.intVal = 2; ...
  • Office 自动化---准备

    千次阅读 2013-05-02 22:56:10
    Office 自动化---准备 引言 笔者在使用C++编写Word和Excel导出报告的时候,由于网上相应的资料很少,所以走了许多弯路。在自己探索尝试了之后,积累一些开发的经验,写成这个系列的博文。 这里我们大部分都是Ole...
  • 基于VS 2005环境的MS office自动化开发之熟悉环境篇,逐步教你用vs2005读写Excel
  • Office自动化编程实例锦集动态创建播放幻灯片,C++.net源代码编写,VisualStudio.net
  • 由于文档获取人数太多,大家如有需求,请关注公众号:【数据分析与统计学之美】,回复关键词:【自动化文档】! 目录   章节一:python使用openpyxl操作excel     1、openpyxl库介绍     2、python怎么...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 55,617
精华内容 22,246
关键字:

office自动化