09 用Python生成word文档(二)
一、背景
已有学生成绩表xscj.xls(同上一篇08),通过python生成学生成绩通知书(将所生学生通知书存于一个word文档中)
xscj.xls如下:

二、已安装doc文件操作第三方库python-docx
三、代码如下:
import xlrd
from docx import Document # 安装时安装的是python-docx,导入时导入Document。
from docx.enum.text import WD_ALIGN_PARAGRAPH
from docx.oxml.ns import qn # 中文格式
from docx.enum.style import WD_STYLE_TYPE
from docx.shared import Cm, Pt, RGBColor
from docx.enum.table import WD_TABLE_ALIGNMENT
from docx.enum.table import WD_ALIGN_VERTICAL
import time
# 获取学生成表格
cj_b = xlrd.open_workbook("d:/python/xscj.xls")
cj_s = cj_b.sheet_by_index(0)
nrows = cj_s.nrows
# today=time.strftime("%Y-%m-%d",time.localtime()) #获取当前日期,不支持中文
# today=time.strftime("%Y/%m/%d",time.localtime()) #获取当前日期,不支持中文
# today=time.strftime("year-%Y month-%m day-%d",time.localtime()) #获取当前日期,不支持中文
# 以中文格式获取当前日期
today = time.strftime("%Y{y}%m{m}%d{d}", time.localtime()).format(y='年', m='月', d='日')
# 将学生成绩存入列表中
xscj_all = []
for i in range(1, nrows):
xscj_one = []
xm = str(cj_s.cell(i, 1).value)
yw = cj_s.cell(i, 3).value
sx = cj_s.cell(i, 4).value
yy = cj_s.cell(i, 5).value
ll = cj_s.cell(i, 6).value
jn = cj_s.cell(i, 7).value
zf = cj_s.cell(i, 8).value
xscj_one = [xm, yw, sx, yy, ll, jn, zf]
xscj_all.append(xscj_one)
# 创建学生成绩通知书文档
document = Document()
document.styles['Normal'].font.name = u'宋体' # 设置文档的基础字体
document.styles['Normal']._element.rPr.rFonts.set(qn('w:eastAsia'), u'宋体') # 设置中文字体
# 利用循环生成多位学生成绩通知书(每位学生一页)
for i in xscj_all:
p1 = document.add_paragraph() # 初始化建立第一个自然段
p1.alignment = WD_ALIGN_PARAGRAPH.CENTER # 设置对齐方式为居中,默认左对齐
run1 = p1.add_run('学生成绩报告') # 设置第一段的文字内容
run1.font.name = "华文行楷"
run1._element.rPr.rFonts.set(qn('w:eastAsia'), u'华文行楷') # 设置中文字体
run1.font.size = Pt(35) # 设置字体大小为35磅
run1.font.bold = True # 设置加粗
p1.space_after = Pt(10) # 设置段后10磅
p1.space_before = Pt(10) # 设置段前10磅
p2 = document.add_paragraph() # 初始化建立第一个自然段
run2 = p2.add_run('%s 同学你的成绩如下:' % i[0]) # 设置第一段的文字内容
run2.font.name = '华文仿宋'
run2._element.rPr.rFonts.set(qn('w:eastAsia'), u'华文行楷') # 设置中文字体
run2.font.size = Pt(20) # 设置字体大小为20磅
# 设置表格,将成绩显示在表格中
table = document.add_table(rows=2, cols=7, style="Medium List 1 Accent 2")
table.style.font.size = Pt(16)
table.style.font.color.rgb = RGBColor(255, 0, 0)
table.rows[0].height = Cm(1)
hdr_cells = table.rows[0].cells
width1 = 4
hdr_cells[0].text = '姓名'.center(width1) # center调整文字位置
hdr_cells[1].text = '语文'.center(width1)
hdr_cells[2].text = '数学'.center(width1)
hdr_cells[3].text = '英语'.center(width1)
hdr_cells[4].text = '理论'.center(width1)
hdr_cells[5].text = '技能'.center(width1)
hdr_cells[6].text = '总分'.center(width1)
table.rows[1].height = Cm(1)
hdr_cells = table.rows[1].cells
hdr_cells[0].text = i[0].center(len(str(i[1])))
hdr_cells[1].text = str(i[1]).center(len(str(i[1]))+2)
hdr_cells[2].text = str(i[2]).center(len(str(i[2]))+2)
hdr_cells[3].text = str(i[3]).center(len(str(i[3]))+2)
hdr_cells[4].text = str(i[4]).center(len(str(i[4]))+2)
hdr_cells[5].text = str(i[5]).center(len(str(i[5]))+2)
hdr_cells[6].text = str(i[6]).center(len(str(i[6]))+2)
p4 = document.add_paragraph() # 初始化建立第一个自然段
p4.alignment = WD_ALIGN_PARAGRAPH.RIGHT # 设置对齐方式为右对齐
run4 = p4.add_run('\n郓城县高级技工学校') # 设置第一段的文字内容
run4.font.name = '华文仿宋'
run4._element.rPr.rFonts.set(qn('w:eastAsia'), u'华文行楷') # 设置中文字体
run4.font.size = Pt(20) # 设置字体大小为20磅
run4 = p4.add_run('\n') # 加入换行不分段符
run4 = p4.add_run('%s' % (today)) # 设置第一段的文字内容
run4.font.name = '华文仿宋'
run4._element.rPr.rFonts.set(qn('w:eastAsia'), u'华文行楷') # 设置中文字体
run4.font.size = Pt(20) # 设置字体大小为20磅
document.add_page_break() # 设置分页
document.save('d:/python/通知书.docx')
附:Python中word的表格样式(style)
| 0 | Normal Table | |
| 1 | Table Grid | |
| 2 | Light Shading | |
| 3 | Light Shading Accent 1 | |
| 4 | Light Shading Accent 2 | |
| 5 | Light Shading Accent 3 | |
| 6 | Light Shading Accent 4 | |
| 7 | Light Shading Accent 5 | |
| 8 | Light Shading Accent 6 | |
| 9 | Light List | |
| 10 | Light List Accent 1 | |
| 11 | Light List Accent 2 | |
| 12 | Light List Accent 3 | |
| 13 | Light List Accent 4 | |
| 14 | Light List Accent 5 | |
| 15 | Light List Accent 6 | |
| 16 | Light Grid | |
| 17 | Light Grid Accent 1 | |
| 18 | Light Grid Accent 2 | |
| 19 | Light Grid Accent 3 | |
| 20 | Light Grid Accent 4 | |
| 21 | Light Grid Accent 5 | |
| 22 | Light Grid Accent 6 | |
| 23 | Medium Shading 1 | |
| 24 | Medium Shading 1 Accent 1 | |
| 25 | Medium Shading 1 Accent 2 | |
| 26 | Medium Shading 1 Accent 3 | |
| 27 | Medium Shading 1 Accent 4 | |
| 28 | Medium Shading 1 Accent 5 | |
| 29 | Medium Shading 1 Accent 6 | |
| 30 | Medium Shading 2 | |
| 31 | Medium Shading 2 Accent 1 | |
| 32 | Medium Shading 2 Accent 2 | |
| 33 | Medium Shading 2 Accent 3 | |
| 34 | Medium Shading 2 Accent 4 | |
| 35 | Medium Shading 2 Accent 5 | |
| 36 | Medium Shading 2 Accent 6 | |
| 37 | Medium List 1 | |
| 38 | Medium List 1 Accent 1 | |
| 39 | Medium List 1 Accent 2 | |
| 40 | Medium List 1 Accent 3 | |
| 41 | Medium List 1 Accent 4 | |
| 42 | Medium List 1 Accent 5 | |
| 43 | Medium List 1 Accent 6 | |
| 44 | Medium List 2 | |
| 45 | Medium List 2 Accent 1 | |
| 46 | Medium List 2 Accent 2 | |
| 47 | Medium List 2 Accent 3 | |
| 48 | Medium List 2 Accent 4 | |
| 49 | Medium List 2 Accent 5 | |
| 50 | Medium List 2 Accent 6 | |
| 51 | Medium Grid 1 | |
| 52 | Medium Grid 1 Accent 1 | |
| 53 | Medium Grid 1 Accent 2 | |
| 54 | Medium Grid 1 Accent 3 | |
| 55 | Medium Grid 1 Accent 4 | |
| 56 | Medium Grid 1 Accent 5 | |
| 57 | Medium Grid 1 Accent 6 | |
| 58 | Medium Grid 2 | |
| 59 | Medium Grid 2 Accent 1 | |
| 60 | Medium Grid 2 Accent 2 | |
| 61 | Medium Grid 2 Accent 3 | |
| 62 | Medium Grid 2 Accent 4 | |
| 63 | Medium Grid 2 Accent 5 | |
| 64 | Medium Grid 2 Accent 6 | |
| 65 | Medium Grid 3 | |
| 66 | Medium Grid 3 Accent 1 | |
| 67 | Medium Grid 3 Accent 2 | |
| 68 | Medium Grid 3 Accent 3 | |
| 69 | Medium Grid 3 Accent 4 | |
| 70 | Medium Grid 3 Accent 5 | |
| 71 | Medium Grid 3 Accent 6 | |
| 72 | Dark List | |
| 73 | Dark List Accent 1 | |
| 74 | Dark List Accent 2 | |
| 75 | Dark List Accent 3 | |
| 76 | Dark List Accent 4 | |
| 77 | Dark List Accent 5 | |
| 78 | Dark List Accent 6 | |
| 79 | Colorful Shading | |
| 80 | Colorful Shading Accent 1 | |
| 81 | Colorful Shading Accent 2 | |
| 82 | Colorful Shading Accent 3 | |
| 83 | Colorful Shading Accent 4 | |
| 84 | Colorful Shading Accent 5 | |
| 85 | Colorful Shading Accent 6 | |
| 86 | Colorful List | |
| 87 | Colorful List Accent 1 | |
| 88 | Colorful List Accent 2 | |
| 89 | Colorful List Accent 3 | |
| 90 | Colorful List Accent 4 | |
| 91 | Colorful List Accent 5 | |
| 92 | Colorful List Accent 6 | |
| 93 | Colorful Grid | |
| 94 | Colorful Grid Accent 1 | |
| 95 | Colorful Grid Accent 2 | |
| 96 | Colorful Grid Accent 3 | |
| 97 | Colorful Grid Accent 4 | |
| 98 | Colorful Grid Accent 5 | |
| 99 | Colorful Grid Accent 6 |
浙公网安备 33010602011771号