Python + openpyxl + pandas 一步实现将Excel表中内容按指定条件筛选分成多个子表并保留指定表头内容

这篇博客介绍了如何使用Python的openpyxl和pandas库,将Excel表格按条件拆分成多个子表,并在每个子表中按条件创建子工作表,同时保留原格式,包括颜色、合并单元格和字体大小等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


前言

应用背景:
工作需要将表格按某些条件拆分成多个工作薄,且一个工作薄中再按某些条件存放多个工作表,且保留格式,例如颜色,合并单元格,字体大小等等,主要用于表头的复制时保留格式。
难点:
1.将数据保存到同一工作薄的不同工作表。
2.复制excel表中的某些内容并保留对应的格式。
实现目标:完美地模拟“将一个总表数据,筛选负责人拆分成对应的负责人表,且在每一个表内分成库存和备货两张子表,并对表头进行处理”


一、将多个dataframe写入同一个Excel的不同工作Sheet

多个dataframe需要写入同一个excel时,每次使用df.to_excel(文件名)的形式去写,系统都会重新创建一个新的文件。也就意味着前面的文件会被覆盖掉,你得到的只能是最后一个df写入的结果文件

通过创建一个ExcelWriter对象,可以解决上面的问题

import pandas as pd

writer = pd.ExcelWriter(os.path.join(os.getcwd(), '自定义.xlsx'))
df1.to_excel(writer, sheet_name='自定义sheet_name'#startcol=**, startrow=**)
df2.to_excel(writer, sheet_name='自定义sheet_name'#startcol=**, startrow=**)
df3.to_excel(writer, sheet_name='自定义sheet_name'#startcol=**, startrow=**)
...
 
 
writer.save()# 写入硬盘

#不传sheet_name参数时,默认多个dataframe会写入同一个xlsx文件的同一个sheet里

#startrow, startcol 不传时默认dataframe在excel里在sheet1里其实行列都是一

#需注意,python和excel的索引起始数字不同,如果startrow=2, startcol=4,不是从Excel第二行第四列开始写,而是从Excel第三行第五列开始写
#注意一定要用write.save(),不然生成的文件是没有对应的内容的

原文链接:

https://blog.csdn.net/weixin_42130167/article/details/89705581

二、完整地复制粘贴Excel中的某些内容

上文中使用pandas进行数据处理的时候,输出的表格都是不带格式的,甚至于在读取存在“合并单元格”的数据的时候,还会出现一些难以处理的空值(基于个人理解,excel表格中的合并单元格,显示的值是取第一项的值,其他都只是空值)。
而实际工作中,领导要求的表格都是要好看的格式以及一些表头,颜色等等,因此使用pandas来对特定的表头格式进行完整的复制粘贴。

1.导入模块

import easygui as eg
import os
import openpyxl
import copy
import pandas as pd

2.将列宽对应

代码如下:

def colwidth(s0, s1):
    for i, row in enumerate(s0.iter_cols()):
    	# i = chr(i+97).upper()
        i = convertToTitle(i+1)
        lk = s0.column_dimensions[i].width
        if lk == 0:
            lk = 8.38
        s1.column_dimensions[i].width = lk

其中s0是待复制excel表,s1是待粘贴excel表,都是openpyxl的Worksheet对象,即工作表对象。

enumerate() 函数用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,同时列出数据和数据下标,一般用在 for循环当中。

openpyxl读取一个sheet所有列数据除了用cols属性,也可以用iter_cols()方法,返回值是生成器,该方法也可以指定读取行和列,和iter_rows不同的是他按照列来输出数据。

综上所述,enumerate(s0.iter_cols())生成的是一个下标对应列的生成器,i默认初始等于0,对应的是’A列’,可通过chr()将数字对应转化为字母(用于下文中column_dimensions的引用)。
但是chr()对于生成”两位数的字母“即不能生成’AA’,而实际上的excel表可能会超过’AA’列,就会产生等同于’超出索引值’效果的报错,不符合实际需求。

>>>i = 0 #生成器生成的列中'A'对应的下标是0
>>>i = chr(i+97).upper()
>>>i
'A'
>>
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值