python杀死了excel_Python杀死了Excel|自动更新表格,告别繁琐

大家好,又到了Python办公自动化专题。

今天我们讲解的案例是如何使用Python自动更新Excel表格,简单来说就是每天都会对Excel中多个sheet进行更新,需要操作完后可以用程序完成第一张sheet 汇总表的更新,大概就是这样👇

format,png

format,png

当然实现这一功能可以使用VBA或者Excel中的其他操作,但是查了相关操作略显复杂,现在我们使用Python来完成,主要涉及以下操作:

os、glob模块处理文件

Pandas处理多个表格

openpyxl调整Excel样式

创建多个随机数据

为了尽可能模拟读者的生产环境多了这一步。首先我们先用Python来创建一些随机数据,数据已经充分则可以跳到下一步骤。

format,png

我们需要把这个excel文件命名好放在桌面的data文件夹中

from openpyxl import load_workbook

import os

import glob

import random

def GetDesktopPath():

return os.path.join(os.path.expanduser("~"), 'Desktop')

# 调用glob可以利用通配符获取指定命名格式的文件

path = glob.glob(f'{GetDesktopPath()}/data/*.xls*')[0]

workbook = load_workbook(filename=path)

sheet_init = workbook.active

接着是创建一些供随机的内容,可以随意写,我们还是皮卡丘化

name_lst = ['皮卡丘', '小火龙', '杰尼龟', '妙蛙种子', '风速狗', '小拳石', '飞天螳螂']

place_lst = [chr(i).upper() for i in range(97, 123)]

# 我忘记大写字母的码了哈哈哈 这样变着法换大写字母

activity_lst = ['椭圆机', '篮球', '足球', '羽毛球', '跳绳']

source_lst = ['朋友介绍', '微信聊天', '网页弹窗', '其他']

for i in range(30):

# 不断去拷贝第一页并重命名

sheet = workbook.copy_worksheet(sheet_init)

sheet.title = f'{i+1}日'

for j in range(random.randint(10, 30)):

# 从第三行开始行遍历

for row in sheet.iter_rows(min_row=3+j, max_row=3+j):

info = [f'{j+1}', f'{i+1}日', f'{random.choice(name_lst)}', f'{random.choice(place_lst)}馆',

f'{random.choice(activity_lst)}', f'{random.choice(source_lst)}', f'{random.randint(1, 10)}',

'无', f'{random.choice(["Y", "N"])}', f'{random.choice(["Y", "N"])}', f'{random.choice(["Y", "N"])}']

# 嵌套循环,对当前行的格子进行遍历把内容写入

for index, k in enumerate(info):

row[index].value = k

print(f'第{i+1}日已完成')

workbook.save(filename=f'{GetDesktopPath()}/data/results.xlsx')

format,png

注意以上代码要单独运行先生成数据,再运行后续代码,OK现在数据就创建好了,然后正式进入我们的问题

合并多个sheet并写入汇总sheet

由于后面多个表的更新后需要按日期顺序在汇总表里呈现,因此有一个策略是利用openpyxl按顺序遍历各表然后写回汇总表。但注意,表格中存在边框、居中等样式修改

format,png

这种情况下,openpyxl会识别样式,认为这些行是已经有数据的,故纯粹的sheet.append()方法是无法将数据写入这些所谓的空行,而会从没有样式的行开始写入

format,png

所以需要在各表写入的时候不断计算所在行,并利用sheet.iter_rows()定位。是不是有点麻烦?因此我们换个思路:利用pandas,其方便的地方在于无视表格样式

path_new = glob.glob(f'{GetDesktopPath()}/data/results.xls*')[0]

workbook_new = load_workbook(filename=path_new)

# 方便获取总表数便于遍历

sheetnames = workbook.sheetnames

df_lst = []

for i in range(1, len(sheetnames)):

df = pd.read_excel(path_new , encoding='utf-8', sheet_name=i, skiprows=1)

df_lst.append(df)

# 把获取的各表纵向合并,注意纵向合并常常需要重置索引

df_total = pd.concat(df_lst,axis=0,ignore_index=True)

# 索引是从0开始,利用索引+1重置各记录的编号

df_total['编号'] = df_total.index + 1

format,png

将生成的表写回汇总表即可,涉及的内容稍微比较复杂。由于直接使用dataframe.to_excel会覆盖原excel导致只有一张sheet,其他全部丢失,需要利用pd.ExcelWriter,具体见代码。删除原来的汇总表并写入新的汇总表。因为新写入的sheet会置于末尾,可以用list.insert(0, list.pop())将最后一个元素置于开头

writer = pd.ExcelWriter(path_new, engine='openpyxl')

writer.book = workbook

workbook.remove(workbook['汇总表'])

df_total.to_excel(excel_writer=writer, sheet_name=u'汇总表', index=None)

writer.close()

workbook._sheets.insert(0, workbook._sheets.pop())

workbook.save(filename=f'{GetDesktopPath()}/data/results.xlsx')

format,png

这就完成了吗?没有。

pandas的优势“无视样式”也成为了它的缺陷:写入文件时没有样式信息,因此最后再用openpyxl对第一页的样式调整。

openpyxl调整样式

调整样式部分我们直接看代码,关键部分都给了详细注释

# 设置对齐、线性、边框、字体

from openpyxl.styles import Alignment

from openpyxl.styles import Side, Border

from openpyxl.styles import Font

sheet = workbook[sheetnames[0]]

sheet.insert_rows(idx=0) # 插入第一行

font = Font(name='宋体', size=18, bold=True)

sheet['A1'] = '皮卡丘体育2020年06月新学员信息登记表'

sheet['A1'].font = font # 设置字体大小和加粗

req = ':(\w)'

weight = re.findall(req, sheet.dimensions)[0]

sheet.merge_cells(f'A1:{weight}1')

# 样式先准备好

alignment = Alignment(horizontal='center', vertical='center')

side = Side(style='thin', color='000000')

border = Border(left=side, right=side, top=side, bottom=side)

# 遍历cell设置样式

rows = sheet[f'{sheet.dimensions}']

for row in rows:

for cell in row:

cell.alignment = alignment

cell.border = border

# 设置前两行的行高

sheet.row_dimensions[1].height = 38

sheet.row_dimensions[2].height = 38

# 设置列宽

letter_lst = [chr(i+64).upper() for i in range(2, ord(weight)-ord('A')+1+1)]

sheet.column_dimensions['A'].width = 8

for i in letter_lst:

sheet.column_dimensions[f'{i}'].width = 14

workbook.save(filename=f'{GetDesktopPath()}/data/results.xlsx')

format,png

到这里,我们就成功使用Python实现自动更新Excel表格,并且调整样式,可能看上去有点复杂,但核心就是使用Pandas处理并使用openpyxl调整样式,并且相比于在Excel中实现,一个更大的优势就是一旦代码写完以后可以在有相关需求的Excel中直接使用,从而解放了双手。拜拜,我们下个案例见~

注:本文使用的数据与源码下载

链接:https://pan.baidu.com/s/139Nh59T7nPfJAW205QmDBw 密码:863v

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/430201.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

TP-LINK路由器连接网线上网教程(租房必备)

租的房子,房子里只有一根普通网线,连着房东家的路由器,这时可以使用TP-LINK路由器使用LAN-WAN级联的方式,在室内搭建一个局域网。 设置教程 准备材料:1根网线 重置路由器:启动路由器,使用牙签…

推荐一款非常强大的扒站工具

在平时的开发或者学习的过程中,我们难免会看到一些让人心动的网站,于是自己想把它弄下来,自己手工一个文件一个文件把它保存下来不太可能,那得累死你,下面我推荐一款扒站的神器,可以把你所喜欢的目标网站整…

无刷新分页 jquery.pagination.js

序言 这一款js分页使用起来很爽,自己经常用,做项目时总是要翻以前的项目看,不方便,这里就把他写出来方便自己以后粘帖,也希望能分享给大家。友情提示下:我有一片博客是用着个js实现的无刷新分页也很好用&am…

windows 10打开或禁用管理员账户

windows 10下默认关闭了管理员账户,因为权限太高,而且win 10推荐通过网络账户登录。如果要使用,可以通过下面的方式打开。 1、登录一个普通账户。 如果你是刚升级上来,普通账户都没有。那么,用别人的电脑下载安装老毛…

hbase filter原理_HBase应用|HBase在移动广告监测产品中的应用

1HBase在Ad Tracking的应用1.1Ad Tracking的业务场景Ad Tracking是TalkingData的移动广告监测产品,其核心业务模型是归因。App用户点击广告之后,及随后安装广告跳转到的应用或者游戏,Ad Tracking会对这些点击事件(用户点击广告的行为)和激活事…

eclipse 快捷键及插件

webstorm设置keymap为eclipse也可使用。 快捷键 快捷键用途使用方法编辑器事件ctrlt打开继承树将鼠标移到某个类上,按ctrltctrl/注释本行altshiefj生成属性注释,这杨的/**/ctrlalt 下箭头复制本行到下一行alt 下箭头移动本行到下一行ctrld删除整行alt/…

drools动态配置规则_关于规则引擎

很早之前就知道Drools,这几天正好有个项目,里面用了大量的规则定义,就想是否能采用Drools来解决。在github上分析了规则引擎项目,包括:Easy-ruleshttps://github.com/j-easy/easy-rules通过程序代码来完成规则引擎&…

linux安装mysql5.6

目录 准备工作 运行环境 确认你的安装版本 下载MySQL 安装MySQL 准备安装环境 编译和安装 配置MySQL 单实例配置 单实例配置方法 添加防火墙 启动MySQL 重启MySQL 多实例配置 什么是多实例 多实例配置方法 创建启动文件 初始化数据库 配置防火墙 启动MySQL 登陆MySQL 重启MySQL…

Spring 4 MVC入门实例

Spring 4发布很长一段时间了,从 Spring 3 到 Spring 4 有巨大的改变。网上还有很多教程是基于 Spring 3.0 的,甚至 Spring 2.5,要想按照网上的教程“按图索骥”还是挺困难的。纵有一些 Spring 4.0 MVC 的教程例子,也往往是 “Spri…

python写入二进制文件的库_python之写入二进制文件

概述 计算机都是以二进制存储文件的,如mp3、图片等,文本文件也是如此,在本节中以二进制模式写入文件 写文件的很多操作,与读文件的操作是相同的,建议先看 读取二进制文件 打开文件 读写文件,要先通过内置op…

gulp插件gulp-ruby-sass和livereload插件

gulp-ruby-sass是gulp的一个插件,主要是用来实现sass编译,livereload插件主要是实现文件保存时浏览器自动刷新,避免了手动f5的频繁的操作 准备工作:chrome浏览器安装livereload插件,没有安装的可以百度搜索或者FQ下载&…

eclipse 创建 maven web 项目教程

(1)新建一个Maven 项目 file –> new –> maven project 直接点 next 直接点 next 填写groupid和artifactid,这两个可以随便填,名称而已。填完 finish (2)将项目转成 Dynamic Web项目 选中项目&#…

sql backup database备份d盘_ClickHouse 备份与恢复

本文转载自 万能修实验室 作者:公先生 ID: dropudatabase我们评估一款数据库产品,除了稳定性和易用性外,数据安全也十分重要,备份与恢复往往是最后一道安全门。但如果备份策略不完善、恢复手段无效,一旦发生数据误删除…

线程启动语句的顺序是否决定线程的执行次序。_详细分析 Java 中启动线程的正确和错误方式

start 方法和 run 方法的比较代码演示:/** * * start() 和 run() 的比较 * * * author 踏雪彡寻梅 * version 1.0 * date 2020/9/20 - 16:15 * since JDK1.8 */public class StartAndRunMethod { public static void main(String[] args) { // run 方法演示 // 输出: name: mai…

webgl 游戏_如何选择 WebGL 框架和引擎?

数据可视化Sugar-百度智能云​cloud.baidu.comSugar 是我们从零开始开发的 BI 产品,可以不用写 SQL 制作报表及大屏页面,上半年我们发布了三维场景功能,可以放到大屏中展现:为了实现这个功能,我们调研了大量 WebGL 相关…

java 正则表达式 替换字符串img标签的路径_正则表达式和有限自动机的应用

1. 为什么谈有限自动机时要谈正则表达式?原因是:正则表达式所匹配的所有字符串所构成的语言可以用有限自动机识别。根本原因是:正则集(正则表达式所匹配的所有字符串集合)是由右线性文法(3型文法&#xff0…

14.6 Spring MVC 测试框架(翻译)

14.6 Spring MVC 测试框架(每天翻译一点点) Spring MVC测试框架对 Spring MVC 代码提供一流的测试支持 ,它拥有一个 fluent API ,可以和JUnit, TestNG 或其它任何测试框架协同使用。 此测试框架基于 spring-test 模块的Servlet API mock obje…

html读取本地txt_手机本地电子书籍阅读器 — 静读天下

在早期山寨按键手机流行的年代手机中必装两款软件莫过于Anyview和Opera浏览器了,一个是本地最佳阅读工具另一个是压缩流量访问网页的利器,时过境迁好多人都早以忘记了这些昔日的王者。曾经那帮挑灯夜读看小说的熊孩子都已经长大了,在难得的休…

华为手机丢失定位网站_手机端网站优化要从网站的设计和定位开始入手

移动端网站优化要从网站的设计和定位开始入手,重要的是简洁易用,切忌复杂,令用户搞不明白找不到想用的。对于搜索引擎而言,好的用户访问体验也是排名的最佳标准。下面小编就来分析一下设计对手机端网站优化排名的影响。1、使用规范…

安卓接受后台数据转换解析出错_安卓手机内存越大,速度就会越快?

与非网 2 月 18 日讯,现在安卓手机的内存在产品规划上越来越大,2020 年发布的旗舰手机运行内存已经拓展到惊人的 10GB 以上,而这个运存大小已经超过笔记本主流的 8GB 内存,手机到底需要这么大的内存吗?安卓手机的内存为…