likes
comments
collection
share

Python 使用xlwings库操作excel的简明实践分享之学生信息登记表批量填写与存储

作者站长头像
站长
· 阅读数 2

上几篇都演示了表格的绘制,相信大家对里面的操作已经基本熟悉,这篇向大家介绍如何批量填充表格。

表格模板选取

将上一篇的表格稍加修改,改成一个小学生信息表作为批量填充数据的模板,这样以后有个小学老师来看这篇文章,可以对她有所帮助。

Python 使用xlwings库操作excel的简明实践分享之学生信息登记表批量填写与存储

数据表

数据表的字段就是上面的表格里的字段,内容根据需要自行模拟。

Python 使用xlwings库操作excel的简明实践分享之学生信息登记表批量填写与存储

 

加载两张表到系统中

 

import xlwings

app = xlwings.App(visible=True, add_book=False)

app.display_alerts = False
wb_template = app.books.open('小学生信息表.xlsx')
ws_template = wb_template.sheets.active
wb_data = app.books.open('data.xlsx')
ws_data = wb_data.sheets.active
table_data = ws_data.range((2, 1)).expand().value
wb_data.close()
print(table_data)

查看数据可知内容的格式

Python 使用xlwings库操作excel的简明实践分享之学生信息登记表批量填写与存储

 

写入表格

创建一个新的工作簿,循环读取前面取得的二维数组,将数据存入对应的单元格即可。

wb = app.books.add()
ws_active = wb.sheets.active
for item in table_data:
    table_name = f'{item[0]}_{item[1]}'
    ws = ws_template.copy(name=table_name, after=wb.sheets.active)

    ws.range((2, 2)).value = item[0]
    ws.range((2, 5)).value = item[1]
    ws.range((3, 2)).value = item[2]
    ws.range((3, 5)).value = item[3]
    ws.range((4, 2)).value = item[4]
    ws.range((4, 5)).value = item[5]
    ws.range((5, 2)).value = item[6]
    ws.range((5, 5)).value = item[7]
    ws.range((6, 2)).value = item[8]
    # 将成绩区域内的数字字符设为整数
    # ws.range((9,3),(11,6)).api.NumberFormat = '0'
    ws.range((9, 3)).value = item[9]
    ws.range((10, 3)).value = item[10]
    ws.range((11, 3)).value = item[11]
    ws.range((9, 6)).value = item[12]
    ws.range((10, 6)).value = item[13]

    ws.range((11, 6)).value = sum(item[9:14])

因成绩区域是数值,所以原先想要先设置一个格式,避免格式混乱,但源数据还算整齐,还没调整。这个也可以在模板中提前调好。对于总分成绩的计算原准备用formula的原始Excel公式求和,但发现出现的数据是0,可能和数据区域格式有关,反正自己手里已经有数据了,在代码这里计算还方便一些。  

评价区域自动生产

这里的评价根据成绩总分处理,比较简单,可以对上面的数据进行更详细的处理,进行多样化拼接。

比如像这样,如果分数还是良好以上,加上这种评价,该同学在保持{良好/优秀}成绩的同时,还在班级中担任{班长/中队长}职务,是同学的好榜样,老师的好帮手。

如果语数外成绩不好,但体育美术很好,就拼接,该同学有着良好的身体素质和丰富的才艺。

只要设置的条件足够多,就能产生不同的评语。

if ws.range((11, 6)).value < 300:
     mark = '不及格'
elif ws.range((11, 6)).value >450:
    mark = '优秀'
elif ws.range((11, 6)).value >400:
    mark = '良好'
else:
    mark = '合格'
ws.range((12, 1)).value = f'{ws.range((12, 1)).value}\n       {mark}'

完成效果

最后会生产一个大工作簿,将所有的表都放进去。 开头会有一个sheet,前面我们已经暂存了这个对象,最后将其清理掉

ws_active.delete()

完成的效果如下: Python 使用xlwings库操作excel的简明实践分享之学生信息登记表批量填写与存储

单独保存

如果要单独保存每个表格,而不是像上面一样将其放到一个大的工作簿里,需要将写入表格代码里前两行移入循环里,将最后一行删除默认表格移入循环末尾,在这行之上增加save语句。

ws_active.delete()
wb.save(f'tables/{table_name}.xlsx')

会生产一堆文件,后续可以按名称单独发给家长。

Python 使用xlwings库操作excel的简明实践分享之学生信息登记表批量填写与存储

规范提示

在使用了文件和创建了文件后,建议加上wb.close()来关闭文件,防止打开太多造成异常。 并在文件结尾加上app.quit()来关闭Excel软件