专栏首页老Z的博客用Python操控Word

用Python操控Word

4月底,我带着自己水的一篇文章,从深圳奔赴美帝西雅图参加了一个制药行业软件用户组2018年年会(PharmaSUG 2018)。听了一些报告,收获不少。在众多报告中,有一篇题目为Why SAS Programmers Should Learn Python Too的报告有点意思。不过在我看来,文章中的例子并没有很好地体现出Python的强大,因为那几个例子用Linux Shell脚本实现也很简单。不可否认,如果你想选择一种语言来入门编程,那么Python绝对是首选!但是对于SAS程序猿/媛来说,我觉得现阶段没有太多必要去学Python,因为行业的原因,Python对SAS程序猿/媛日常的编程工作几乎没有什么用。除非你和我一样,喜欢折腾代码,或者你想转行业做深度码农,那Python是必须掌握的语言,因为Python有各种强大的库。下面就让我们来感受下python-docx库的强大之处吧!

我们知道,带项目的SAS程序猿/媛在交项目时候需要准备一个时间戳的文件(假定这个文件是行业都要用到的),用来证明各项工作是有序进行的,如下图(注:因为是公司内部文件,所以单元格内容有做删减):

在没有程序实现的情况下,我们每次交项目更新这个文件只能是一个一个地复制和粘贴。虽然要更新的单元格不多,但是手动更新还是有点费时。我能想象到用SAS实现(我不会,囧)肯定要比Python麻烦,所以我就用Python来实现。简单介绍一下用Python实现的思路:首先我们要找出需要更新单元格左边一列的位置。代码如下:

# coding=utf-8

from docx import Document

chklst = Document('C:\\Users\\Xianhua\\Documents\\Python\\Checklist.docx')

table = chklst.tables[2] # 第三个表格

for i in range(1,len(table.rows)): # 限定从表格第二行开始循环读取数据
    for j in range(1,2): # 限定只读取表格第二列数据
        # 输出单元格的位置
        print(i, j)
        # 输出单元格的内容
        print(table.rows[i].cells[j].text)

当然你也可以通过直接打开文档查看来获取位置,比如上图中的第一行第二列的单元格的坐标就是(1,1)。代码执行结果如下图:

然后赋值给所获取位置的右边一列。以下代码有一个前提:即各个时间戳已经被获取并保存在一个TXT文件中(可以通过FILENAME PIPE获取最新时间戳,例子在这里),如下图:

更新时间戳的代码如下:

# coding=utf-8

from docx import Document
import re
from datetime import datetime
from docx.shared import Pt
from docx.enum.text import WD_PARAGRAPH_ALIGNMENT

timestamp = open('C:\\Users\\Xianhua\\Documents\\Python\\Checklist.txt', 'r')

# 将TXT转化为字典
mydic = dict() 

for line in timestamp:
    matchObj = re.match( r'(\w+?)\s+(.+)', line)
    if matchObj:
        mydic[matchObj.group(1).rstrip()] = matchObj.group(2)
    
timestamp.close()

chklist = Document('C:\\Users\\Xianhua\\Documents\\Python\\Checklist.docx')

table = chklist.tables[0] # 第一个表格

for i in range(1, len(table.rows)): # 限定从表格第二行开始循环读取数据
    # Transfer date
    if i == 3:
        table.rows[i].cells[2].text = datetime.now().date().strftime('%d %b %Y')

table = chklist.tables[2] # 第三个表格

for i in range(1, 6):
    # Raw data
    if i == 1:
        table.rows[i].cells[2].text = mydic['raw']
        
    # Vendor data
    if i == 2:
        table.rows[i].cells[2].text = mydic['edat']
        
    # Transfer datasets
    if i == 3:
        table.rows[i].cells[2].text = mydic['transfer']
        
    # Logcheck
    if i == 4:
        table.rows[i].cells[2].text = mydic['logcheck']
        
    # Spec and Define
    if i == 5:
        table.rows[i].cells[2].text = mydic['spec'] + '\n' + mydic['define']
        
    # 更改字体 
    run = table.rows[i].cells[2].paragraphs[0].runs
    font = run[0].font
    font.name = 'Courier New'

    # 居中单元格
    table.rows[i].cells[2].paragraphs[0].alignment = WD_PARAGRAPH_ALIGNMENT.CENTER

chklist.save('C:\\Users\\Xianhua\\Documents\\Python\\Checklist '+ datetime.now().date().strftime('%Y%m%d')+'.docx')

更新后的文件截图如下:

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Python脚本转exe文件

    上一篇博文介绍了一个自动更新.docx文件的Python脚本。当时通宵(通宵看葡萄牙VS西班牙顺带码的)码好的时候想着怎么分享给整个部门使用,考虑到公司电脑并没...

    专业余码农
  • 一个关于Define.xml的奇怪问题

    今天一个同事和我说,她在做Define.xml时碰到一个奇怪的问题:最后要生成Define.xml的数据集中已经去除了各种特殊字符,但是生成的Define.xm...

    专业余码农
  • SAS中哈希表的连接问题

    哈希表即散列表(Hash table),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以...

    专业余码农
  • 资源 | Python 入门必备:一本开源的 python 书籍资源,配有详细的代码

    AI 科技评论按:目前人工智能和数据科学等领域的技术的火热,让作为这些领域研究的首选语言 python 成为了非常受欢迎的编程语言。作为当前最热门的编程语言之一...

    AI科技评论
  • 盘点2018年的韭菜地,差点一无所有?

    2018年,有人升职加薪,有人终于脱单,还有人已经买房生娃,但是对于韭菜们来说,今年频频爆仓的现象,也是不多见。

    养码场
  • 【智驾周刊】Tony Han加盟百度无人车 | 初创公司 Zoox 估值超10亿美元

    2016.6.4 | Vol. 2 AutoDriving Weekly 智能驾驶周刊,旨在汇聚智能驾驶领域一周要闻以及点评,供读者参考。内容包括喜闻乐见的...

    新智元
  • 通过for循环嵌套语法绘制一个漂亮的蜂形图案

    利用for循环嵌套画出一个蜂形图案。 代码如下: import turtle #导入小海龟 turtle.bgcolor('blue') #设置背景颜色 ...

    企鹅号小编
  • 国家认证的Python工程师有什么能力要求?

    Python这门语言近来是越来越火,在国家层面越来越被重视。除了之前热议的加入高考和中小学教育之外,现在连普通大学生也无法逃脱Python的毒手了。

    小小科
  • 超实用Python开发工程师面试题分享

    Python诞生很早,但真正火爆时间并不长。目前Python语言的应用领域非常广泛,主要有系统编程、图形处理、数学处理、文本处理、数据库编程、网络编程、Web编...

    一墨编程学习
  • 笔记 | 笨方法学Python

    用户1737318

扫码关注云+社区

领取腾讯云代金券