文章目录
前言
应用背景:
工作需要将表格按某些条件拆分成多个工作薄,且一个工作薄中再按某些条件存放多个工作表,且保留格式,例如颜色,合并单元格,字体大小等等,主要用于表头的复制时保留格式。
难点:
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'
>>