有趣的代码程序员码农的世界

登记成绩之小东助手v1

2018-01-16  本文已影响21人  高正杰

问题描述

现有一份关于学生每次实验报告的汇总Excel表格,要求小东同志把成绩登记到对应的Word实验报告中去,一个班级95份,一共6次试验报告,总计480份报告。完全依靠手工,这是何等的毅力。。。鉴于此,特地写了一个简单的demo以备不时之需。

样例

图1 成绩表样例 图2 实验报告样例

需求:将图1中的成绩登记在图2的成绩记录框中,要求字体样式除颜色为红色为红色外均保持一致。

实验环境

本文的实验环境是 Python 3.6.1 |Anaconda 4.4.0 (64-bit),Win10

实验准备

安装 python-docx

pip install python-docx

注意

安装的是 python-docx,而引入的是 docx

代码

# -*- coding: utf-8 -*-
# Author:gaozhengjie
# Blog:https://www.jianshu.com/u/02877dbc2662
# E-mail:3170601003@cuit.edu.cn
# Python Version:3.6.1
# Time:2018/1/16
# Description:登记成绩,从Excel中读取数据存储到Word的指定位置

import openpyxl
from docx import Document
from docx.shared import RGBColor
from docx.enum.text import WD_ALIGN_PARAGRAPH
from docx.shared import Pt
import re
import os

wb = openpyxl.load_workbook("成绩表.xlsx")  # 打开成绩文件
sheet = wb.get_sheet_by_name("Sheet1")  # 读取到指定的Sheet页
file_list = os.listdir()
file_list2str = "/".join(file_list)  # 将list转换为string

for i in range(2, sheet.max_row + 1):
    # 遍历学号,实验报告命名方式 "学号_姓名_实验报告.docx" 或 "学号_姓名_实验报告"
    # python-docx 库兼容处理 .docx 和 .doc

    info = str(sheet['A'+str(i)].value) + '_' + sheet['B'+str(i)].value + '_实验报告'
    filename_regex = re.compile(info + r'.doc(x)?')  # x可选
    mo = filename_regex.search(file_list2str)
    if mo == None:
        # 没有匹配到,则将该学生的信息单独打印或保存在一个文本中,便于后续人工登记
        print('*' * 50)
        print("出错信息:未找到该文件 " + info)
        print('*' * 50)
    else:
        filename = mo.group()
        document = Document(filename)
        table = document.tables[0]  # 取Word中的第一个表格
        if table.cell(4,0).text == "成绩":
            table.cell(4,1).text = ''  # 清空表格中的内容
            score = str(sheet['C'+str(i)].value)
            run = table.cell(4,1).paragraphs[0].add_run(score)  # 添加段落内容
            table.cell(4,1).paragraphs[0].paragraph_format.alignment = WD_ALIGN_PARAGRAPH.CENTER  # 居中
            run.font.color.rgb = RGBColor(0xff, 0x00, 0x00)  # 红色字体
            run.font.size = Pt(14)  # 字体大小 四号,14磅
            run.font.bold = True  # 加粗
            document.save(filename)  # 保存
        else:
            print('*' * 50)
            print("出错信息:未找到成绩栏 " + info)
            print('*' * 50)

参考文献

[1] 字体大小与磅数的对应关系
[2] Python自动化修改word实例

上一篇下一篇

猜你喜欢

热点阅读