xlrd、xlwt、xlutils
xltw操作excel生成学生成绩报告单,使用样例
-
xlrd - 读取 Excel 文件
-
xlwt - 写入 Excel 文件
-
xlutils - 复制、分割、筛选等
以上三库pip安装即可
读取:
import xlrd
# 打开 xls 文件
book = xlrd.open_workbook("test.xls")
print "表单数量:", book.nsheets
print "表单名称:", book.sheet_names()
table1 = book.sheets()[0] # 通过索引顺序获取
table2 = book.sheet_by_index(0) # 通过索引顺序获取
table3 = book.sheet_by_name(u'Sheet1') # 通过名称获取
table1.row_values(1) #获取整行值(数组)
table1.col_values(1) #获取整列值(数组)
nrows = table1.nrows #获取行数
ncols = table1.ncols #获取列数
# 获取第1个表单
sh = book.sheet_by_index(0)
print u"表单 %s 共 %d 行 %d 列" % (sh.name, sh.nrows, sh.ncols)
print "第二行第三列:", sh.cell_value(1, 2)
# 遍历所有表单
for s in book.sheets():
for r in range(s.nrows):
# 输出指定行
print s.row(r)
写入:
import xlwt
# 创建 xls 文件对象
wb = xlwt.Workbook()
# 新增一个表单
sh = wb.add_sheet('A Test Sheet')
# 按位置添加数据
sh.write(0, 0, 1111)
sh.write(2, 0, 'test')
a = 'ttest'
sh.write(1, 1, a)
# 若write变量时报错,新增表单时添加参数,如:add_sheet('A Test Sheet', cell_overwrite_ok=True)
# 保存文件
wb.save('test.xls')
修改:
并没有直接修改 xls 文件的方法。通常的做法是,读取出文件,复制一份数据,对其进行修改,再保存。
from xlrd import open_workbook
from xlutils.copy import copy
# 打开文件
rb = open_workbook("test.xls")
# 复制
wb = copy(rb)
# 选取表单
s = wb.get_sheet(0)
# 写入数据
s.write(0, 1, 'test')
# 保存
wb.save('test.xls')
xltw操作excel生成学生成绩报告单,使用样例
#!/usr/bin/env python
# encoding: utf-8
import xlwt
book = xlwt.Workbook(encoding='utf-8')
sheet = book.add_sheet('sheet1')
# 第一列调整宽度为 60 磅
sheet.col(0).width = 128 * 20 # 128 = 3磅
# 创建一个字体类型,供标题使用
title_style = xlwt.XFStyle()
# 横向对齐方式为居中
title_style.alignment.horz = xlwt.Alignment.HORZ_CENTER
# 字体加粗
title_style.font.bold = True
# 字号大小设置为 18 磅
# 写入单元格的行高会根据字号自适应增大
title_style.font.height = 20 * 18 # 20 = 1磅
# 创建一个字体类型,供正文使用
center_style = xlwt.XFStyle()
center_style.alignment.horz = xlwt.Alignment.HORZ_CENTER
# 纵向对齐方式为居中
center_style.alignment.vert = xlwt.Alignment.VERT_CENTER
# 合并第0行第0列至第0行第10列,并且写入字符,字符样式使用之前设置的title_style
# write_merge 传入参数为 (r1, r2, c1, c2, label, style), 合并 (r1, c1) 至 (r2, c2) 的所有单元格
sheet.write_merge(0, 0, 0, 10, u'《不知道叫什么的中学》高一学生成绩报告单', title_style)
sheet.write_merge(1, 1, 0, 10, u'《不知道叫什么的中学》高一第一次月考', center_style)
sheet.write_merge(2, 2, 0, 10, u'(年级参加考试人数:1000人 班级参加考试人数:100人)', center_style)
sheet.write(3, 0, u'班级', center_style)
sheet.write_merge(3, 3, 1, 2, u'高一10班', center_style)
sheet.write(3, 3, u'学号', center_style)
sheet.write_merge(3, 3, 4, 5, u'20171024', center_style)
sheet.write(3, 6, u'姓名', center_style)
sheet.write_merge(3, 3, 7, 8, u'隔壁王二', center_style)
sheet.write(3, 9, u'考试日期', center_style)
sheet.write(3, 10, u'2017.10.25', center_style)
# 合并(4,0)至(4,10)单元格
sheet.merge(4, 4, 0, 10)
subjects = [u'总分', u'语文', u'数学', u'英语', u'物理', u'化学', u'生物', u'政治', u'历史', u'地理']
for i, subject in enumerate(subjects, 1):
sheet.write(5, i, subject, center_style)
score_analysis = [u'成绩', u'班级排名', u'年级排名', u'班级均分', u'年级均分', u'班级最高分', u'年级最高分', u'班级最低分', u'年纪最低分']
for i, analysis_type in enumerate(score_analysis, 6):
sheet.write(i, 0, analysis_type)
sheet.merge(15, 15, 0, 10)
sheet.write(16, 0, u'科目', center_style)
sheet.write(16, 1, u'错题数', center_style)
sheet.write_merge(16, 16, 2, 10, u'错题题号(括号内为选择题正确答案)', center_style)
for i, subject in enumerate(subjects[1:], 17):
sheet.write(i, 0, subject, center_style)
sheet.merge(i, i, 2, 10)
sheet.merge(26, 26, 0, 10)
col_center_style = xlwt.XFStyle()
sheet.write(27, 0, u'教师寄语', center_style)
sheet.write(28, 0, u'家长寄语', center_style)
sheet.write(29, 0, u'学生感受', center_style)
for i in range(27, 30):
# 向单元格内写入空行,可以利用列高的自适应功能改变行高
sheet.write_merge(i, i, 1, 10, u'\n\n\n\n')
book.save('test.xls')