练习操作docx文件:
要求使用代码创建docx文件,并读入学生信息,对学生成绩进行分析,并生成合适的报告书。
import openpyxl
from docx import Document
from docx.shared import Pt
from docx.enum.text import WD_PARAGRAPH_ALIGNMENT
stu_doc = Document()
stu_doc.add_paragraph('\n\n\n\n')
pic_par = stu_doc.add_paragraph()
pic_par.alignment = WD_PARAGRAPH_ALIGNMENT.CENTER
run_pic = pic_par.add_run("")
run_pic.add_picture('files/beida.png', width=Pt(200))
doc_book = stu_doc.add_heading(level=1)
doc_book.alignment = WD_PARAGRAPH_ALIGNMENT.CENTER
doc_book_run = doc_book.add_run('北京大学2022年下学期一年级2班数学期末考试成绩报告书\n')
doc_book_run.font.size = Pt(15)
fir_par1 = stu_doc.add_paragraph('\t\t\t学 院:')
fir_par1.add_run('\t 北 京 大 学\t\t\n').underline = True
fir_par2 = stu_doc.add_paragraph('\t\t\t班 级:')
fir_par2.add_run(' \t马 克 思 主 义 哲 学 学 院\t\n').underline = True
fir_par3 = stu_doc.add_paragraph('\t\t\t科 目:')
fir_par3.add_run('\t\t数学\t\t\t\n').underline = True
fir_par4 = stu_doc.add_paragraph('\t\t\t报 告 人:')
fir_par4.add_run('\t\t张三\t\t\t\n').underline = True
stu_doc.add_page_break()
par1_run = stu_doc.add_paragraph().add_run(' 我校期末考试在全体老师的共同努力下,已经圆满地结束。各位教师也已经按照学'
'校的要求对学科教学进行了分析和总结,找差距,找不足,以便在今后的教学中进行修正和改进。教师、学生'
'和家长对期末考试也很看重。教师要了解自己的教学情况;学生想知道自己学得怎样,家长渴望了解孩子的在校'
'学习状况。同时从教学管理角度看,通过考试可以了解半学期的教与学情况,对后半学期'
'的教学有借鉴、参考、指导作用,所以学校对期末考试每个环节均作了认真组织和精心安排。现就期末考试的数学成绩进行总结与反思:')
par1_run.line_spacing = 1.5
par1_run.font.name = '宋体'
par1_run.font.size = Pt(14)
wb = openpyxl.load_workbook('files/stu.xlsx')
stu_sheet = wb['students']
# 获取最大行号和列号
stu_sheet_row = stu_sheet.max_row
stu_sheet_col = stu_sheet.max_column
print(stu_sheet_row, stu_sheet_col)
# 建表
stu_table = stu_doc.add_table(stu_sheet_row, stu_sheet_col, style='Light Grid Accent 6')
up_six = 0 # 及格人数
max_core = 0 # 最高分
max_core_num = 0 # 同最高分人数
sun_core = 0 # 总分
# for循环给stu_table赋值,并一边保存需要计算的数据
for x in range(1, stu_sheet_col + 1):
for y in range(1, stu_sheet_row + 1):
stu_value = stu_sheet.cell(y, x).value
if x == stu_sheet_col and y != 1:
sun_core += int(stu_value)
if stu_value > 59:
up_six += 1
if stu_value > max_core:
max_core_num = 1
max_core = stu_value
elif stu_value == max_core:
max_core_num += 1
stu_table.cell(y - 1, x - 1).text = str(stu_value)
stu_doc.add_paragraph('统计如下:')
stu_doc.add_paragraph('\t总人数:' + str(stu_sheet_row - 1))
stu_doc.add_paragraph('\t最高分:' + str(max_core) + ' 共有' + str(max_core_num) + '人')
stu_doc.add_paragraph('\t平均分:' + str(int(sun_core / (stu_sheet_row - 1))))
stu_doc.add_paragraph('\t及格率:' + str(up_six / (stu_sheet_row - 1) * 100) + '%')
stu_doc.save('files/demo1.docx')
结果如下: