登记成绩之小东助手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实例