zoukankan      html  css  js  c++  java
  • Python通过win32 com接口实现offic自动化


    最近几天通过Python做一些自动生成office报表的东东,比如解析.xml文件,导出.html/WORD/PPT等格式,html不足一提,只需要简单的html静态网页知识即可,这儿要说的是怎么生成WORD/PPT格式。

    首先介绍下office win32 com接口,这个是MS为自动化提供的操作接口,比如我们打开一个WORD文档,就可以在里面编辑VB脚本,实现我们自己的效果。对于这种一本万利的买卖,Python怎么能放过,它内置了对于win32 com接口的支持,我们可以方便的控制。

    要想熟练使用office win32 com接口,没有什么比MS提供的API文档更加权威了,此处附上WORD和PPT的文档,
    想看EXCEL就去GOOGLE,相信对你不是什么难事:)

    WORD中最重要的概念有几个:
    Application - 这个毫无疑问是我们的WORD应用程序
    Document - 这个就是一个打开的文档对象
    Range - 这个东东必须要好好利用,基本上所有对象都是有Range属性的,而这也为我们排版提供了极大的便利。。。
    Paragraph - 顾名思义,这个是段落的意思,也就是我们文档中的一个段内容(可以是文本、图片等)。
    Section - 在我学习的时候,这个东东给我制造了最大的障碍,因为我当时苦苦琢磨,究竟怎么才能插入一个新的页,然后在新页上开始输出内容。。。
    ParagraphFormat - 这个是为了设置格式的,你不可能不使用它。。。
    有了以上几个最重要的概念铺垫,接下来的代码基本上可以平蹚了,来,看一段代码先,事先声明,这段代码摘自网上,不知道哪位兄台写的,只写了可写可不写的东西(这么说有点过分,不过确实没有实质性的内容),我添油加醋的处理了一下,确保营养比较丰富,大家看起来应该实用性更强一些。。。

    import win32com
    from win32com.client import Dispatch, constants

    w = win32com.client.Dispatch('Word.Application')
    # 或者使用下面的方法,使用启动独立的进程:
    # w = win32com.client.DispatchEx('Word.Application')

    # 后台运行,显示程序界面,不警告
    w.Visible = 1 #这个至少在调试阶段建议打开,否则如果等待时间长的话,它至少给你耐心。。。
    w.DisplayAlerts = 0

    # 打开新的文件
    #worddoc = w.Documents.Open(file_name) #这句话用来打开已有的文件,当然,在此之前你最好判断文件是否真的存在。。。
    doc = w.Documents.Add() # 创建新的文档,我用的更多的是这个,因为我要的是创建、然后保存为。。

    # 插入文字
    myRange = doc.Range(0,0) #这句话让你获取的是doc的最前面位置,如果想要获取到其他位置,就要改变Range中的参数,两个参数分别代表起始点,结束点。。。
    myRange.InsertBefore('Hello from Python!')

    '''
    以下一段是增加10个新页,然后跳转到新页中增加内容。。。。
    '''
    section_index = 0
    for i in range(0, 10):
     #由于增加页的使用如此频繁,我们最好将其提取为一个函数,类似def NewTable(self):
     pre_section = doc.Secitons(section_index)
     new_seciton = doc.Range(pre_section.Range.End, pre_section.Range.End).Sections.Add()
     new_range = new_seciton.Range
     
     content_pg = new_range.Paragraphs.Add()
     content_pg.Range.Font.Name,content_pg.Range.Font.Size = 'Times New Roman',24
     caption_pg.Range.ParagraphFormat.Alignment = 0 # 0,1,2 分别对应左对齐、居中、右对齐
     caption_pg.Range.InsertBefore('Hello,Page ' + str(i+1))
     
     section_index = section_index + 1 #记录这个的目的是为了方便的找到doc的尾端,不然的话,我还真没有想到怎么搞。。。

    # 正文文字替换
    w.Selection.Find.ClearFormatting()
    w.Selection.Find.Replacement.ClearFormatting()
    w.Selection.Find.Execute(OldStr, False, False, False, False, False, True, 1, True, NewStr, 2)

    #设置页眉文字,如果要设置页脚值需要把SeekView由9改为10就可以了。。。
    w.ActiveWindow.ActivePane.View.SeekView = 9 #9 - 页眉; 10 - 页脚
    w.Selection.ParagraphFormat.Alignment = 0
    w.Selection.Text = 'New Header'
    w.ActiveWindow.ActivePane.View.SeekView = 0 # 释放焦点,返回主文档

    # 页眉文字替换
    w.ActiveDocument.Sections[0].Headers[0].Range.Find.ClearFormatting()
    w.ActiveDocument.Sections[0].Headers[0].Range.Find.Replacement.ClearFormatting()
    w.ActiveDocument.Sections[0].Headers[0].Range.Find.Execute(OldStr, False, False, False, False, False, True, 1, False, NewStr, 2)

    # 在文档末尾新增一页,并添加一个表格。。。
    pre_section = doc.Secitons(section_index)
    new_seciton = doc.Range(pre_section.Range.End, pre_section.Range.End).Sections.Add()
    new_range = new_seciton.Range
    new_table = new_range.Tables.Add(doc.Range(new_range.End,new_range.End), 5, 5) #在文档末尾添加一个5*5的表格
    #接下来Table怎么操作,这里就不细说了,检索Table对象参照就OK了。。。

    # 表格操作
    doc.Tables[0].Rows[0].Cells[0].Range.Text ='123123'
    worddoc.Tables[0].Rows.Add() # 增加一行

    # 转换为html
    wc = win32com.client.constants
    w.ActiveDocument.WebOptions.RelyOnCSS = 1
    w.ActiveDocument.WebOptions.OptimizeForBrowser = 1
    w.ActiveDocument.WebOptions.BrowserLevel = 0 # constants.wdBrowserLevelV4
    w.ActiveDocument.WebOptions.OrganizeInFolder = 0
    w.ActiveDocument.WebOptions.UseLongFileNames = 1
    w.ActiveDocument.WebOptions.RelyOnVML = 0
    w.ActiveDocument.WebOptions.AllowPNG = 1
    w.ActiveDocument.SaveAs( FileName = filenameout, FileFormat = wc.wdFormatHTML )

    # 打印
    doc.PrintOut()

    # 关闭
    # doc.Close()
    w.Documents.Close(wc.wdDoNotSaveChanges)
    w.Quit()

  • 相关阅读:
    ubuntu 更新软件
    如何在linux(lubuntu)下搭建C/C++开发环境
    Linux下如何查看版本信息
    知识点笔记
    Require.js中使用jQuery 插件
    async中常用总结
    node.js在遇到“循环+异步”时的注意事项
    前端性能优化
    生产/消费者问题
    线程与内存
  • 原文地址:https://www.cnblogs.com/jaww/p/9534666.html
Copyright © 2011-2022 走看看