Pandas实现自定义Excel格式并导出多个sheet表

作者:黄昏中起飞的猫头鹰 时间:2022-10-04 18:46:34 

前言

pandas 默认整合XlsxWriter驱动,自动化处理excel操作,提供公式、设置单元格格式、可视化分析图片等操作

XlsxWriter官方使用说明:

XlsxWriter Documentation

1.导入pandas及数据

import pandas as pd
df =  pd.read_excel(r"C:\Users\xxx\xxx\XLSX 工作表.xlsx")

2.修改pd.to_excle方法

定义类writer:

class writer():
   def __init__(self,df,sheet_name,key,path):  #设置对象参数
       self.df = df                 #dataframe数据(列表)
       self.sheet_name = sheet_name #sheet名称(列表)
       self.key = key               #需要上色字段(列表)
       self.path = path             #excel保存地址

3.构建保存方法save

def save(self):
       #设置保存地址,默认桌面
       path = "C:/Users/xxx/Desktop/{}{}(导出时间{}).xlsx".format(pd.datetime.now().strftime("%y%m%d"),self.path,pd.datetime.now().strftime("%H时%M分%S秒"))

4.创建pd.ExcelWriter实例

writer = pd.ExcelWriter(path,engine='xlsxwriter') #创建pandas.ExcelWriter实例,赋值给writer

5.创建多个sheet表

for j in range(len(self.sheet_name)):  #遍历sheet名称列表
           #创建sheet表并写入dataframe数据
           self.df[j].to_excel(writer, sheet_name=self.sheet_name[j], index=False #不写入索引index=False
                               ,freeze_panes=(1,2)) #设置固定1、2列(固定列无法左右移动)
           workbook = writer.book        #工作蒲方法
           worksheet = writer.sheets[self.sheet_name[j]] #读取sheet表

6.设置自定义列宽

#  计算每列的合适字符宽度,放到元组中(可以设置最大值)
           widths = (self.df[j].astype(str).applymap(lambda x: 40 if len(x)>61 else len(x)+6 if len(x)<8 else len(x)).agg(max).values)
           #设置每列宽度大小
           [worksheet.set_column(i, i, width) for i, width in enumerate(widths)] #计算的宽度,设置列宽

7.设置列不同颜色

设置颜色列表,给不同列设计喜欢的颜色

          color = ['#03A89E','#00C78C','#FFFFCD','#FFC0CB','#808A87','#FFE384','#ED9121','#40E0D0','#FFFFCD']*5 #颜色列表
            [worksheet.set_column(i,i,widths[i],workbook.add_format({'fg_color': color[i-11],
                                                        'valign': 'vcenter',# 垂直对齐方式
                                                        'font_size': 10, #字体大小
                                                        'border': 4, #单元格边框宽度
                                                        'align': 'left' # 水平对齐方式
                                                                    })) for 
            i,x in enumerate(self.df[j].columns) if self.df[j].columns[i] in self.key[0]]

8.设置首行格式

#设置首行宽度
           worksheet.set_row(0,20,workbook.add_format({'fg_color':'#40E0D0'#背景颜色
                                                       ,'bold': True,#字体加粗
                                                       'valign': 'vcenter',# 垂直对齐方式
                                                       'font_size': 16, #字体大小
                                                       'border': 10, #单元格边框宽度
                                                       'align': 'left' # 水平对齐方式
                                                      }))
       writer.save()
       writer.close()

9.可以设置隐藏不显示列 

worksheet.set_column("A:B",None,None,{'hidden':1})  #A至B列,隐藏

调用方法:

writer1 = writer(df=[数据列表],path='文件名称(保存到桌面)',key=[上色字段列表],sheet_name=['sheet表名列表'])
writer1.save()

10.完整代码

class writer():
   def __init__(self,df,sheet_name,key,path):
       self.df = df                 #dataframe数据(列表)
       self.sheet_name = sheet_name #sheet名称(列表)
       self.key = key               #需要上色字段(列表)
       self.path = path             #excel保存地址
   def save(self):
       #设置保存地址,默认桌面
       path = "C:/Users/xxx/Desktop/{}{}(导出时间{}).xlsx".format(pd.datetime.now().strftime("%y%m%d"),self.path,pd.datetime.now().strftime("%H时%M分%S秒"))
       #创建pandas.ExcelWriter实例
       writer = pd.ExcelWriter(path,engine='xlsxwriter') #创建pandas.ExcelWriter实例,赋值给writer
       for j in range(len(self.sheet_name)):  #遍历sheet名称列表
           #创建sheet表并写入dataframe数据
           self.df[j].to_excel(writer, sheet_name=self.sheet_name[j], index=False #不写入索引index=False
                               ,freeze_panes=(1,2)) #设置固定1、2列(固定列无法左右移动)
           workbook = writer.book        #工作蒲格式方法
           worksheet = writer.sheets[self.sheet_name[j]] #读取sheet表
           #  计算每列的合适字符宽度,放到元组中
           widths = (self.df[j].astype(str).applymap(lambda x: 40 if len(x)>61 else len(x)+6 if len(x)<8 else len(x)).agg(max).values)
           #设置每列宽度大小
           [worksheet.set_column(i, i, width) for i, width in enumerate(widths)] #计算的宽度,设置列宽
           color = ['#03A89E','#00C78C','#FFFFCD','#FFC0CB','#808A87','#FFE384','#ED9121','#40E0D0','#FFFFCD']*5 #颜色列表
           [worksheet.set_column(i,i,widths[i],workbook.add_format({'fg_color': color[i-11],
                                                       'valign': 'vcenter',# 垂直对齐方式
                                                       'font_size': 10, #字体大小
                                                       'border': 4, #单元格边框宽度
                                                       'align': 'left' # 水平对齐方式
                                                                   })) for
           i,x in enumerate(self.df[j].columns) if self.df[j].columns[i] in self.key[0]]
           #设置首行宽度
           worksheet.set_row(0,20,workbook.add_format({'fg_color':'#40E0D0'#背景颜色
                                                       ,'bold': True,#字体加粗
                                                       'valign': 'vcenter',# 垂直对齐方式
                                                       'font_size': 16, #字体大小
                                                       'border': 10, #单元格边框宽度
                                                       'align': 'left' # 水平对齐方式
                                                      }))
#         worksheet.set_column("A:B",None,None,{'hidden':1})  #A至B列,隐藏
       writer.save()
       writer.close()
writer1 = writer(df=[df],path='フィロソフィー',key=[df],sheet_name=['sheet表名'])
writer1.save()

 输出格式(如图):

文件名:230121フィロソフィー(导出时间21时53分49秒).xlsx

Pandas实现自定义Excel格式并导出多个sheet表

输出多个sheet表时,改为:

writer1 = writer(df=[df1,df2],path='文件名称(路径修改path)',
key=[df.columns,df2.columns],
sheet_name=['sheet表名1','sheet表名2'])
writer1.save()

来源:https://philosophy.blog.csdn.net/article/details/128747437

标签:Pandas,Excel
0
投稿

猜你喜欢

  • Go流程控制代码详解

    2023-09-01 10:21:12
  • SQL Server上进行表设计时表的主键设计问题

    2010-06-24 16:10:00
  • python如何在终端里面显示一张图片

    2023-08-23 01:34:00
  • asp下过滤非法的SQL字符的函数代码

    2011-03-03 11:23:00
  • ASP小偷(远程数据获取)程序的入门教程

    2007-09-21 12:48:00
  • Python使用functools模块中的partial函数生成偏函数

    2024-01-01 21:26:47
  • 考虑SQL Server安全时所应注意的几个方面

    2009-01-04 13:57:00
  • php控制文件下载速度的方法

    2023-07-19 00:21:30
  • 方便和实用

    2009-02-02 10:16:00
  • python 利用turtle模块画出没有角的方格

    2022-03-09 04:25:04
  • Python使用Beautiful Soup爬取豆瓣音乐排行榜过程解析

    2023-10-13 08:08:24
  • Mootools 1.2教程(13)——正则表达式

    2008-12-07 20:25:00
  • :hover在IE6下的问题

    2009-06-18 21:09:00
  • Python实现APP自动化发微信群消息的示例代码

    2023-07-27 05:24:26
  • python 定时任务去检测服务器端口是否通的实例

    2021-05-18 15:09:13
  • ASP在线生成电话图片程序

    2007-10-06 23:06:00
  • Python的函数嵌套的使用方法

    2022-03-23 10:28:54
  • Python实现账号密码输错三次即锁定功能简单示例

    2023-07-22 07:40:21
  • asp中判断服务器是否安装了某种组件的函数

    2011-02-16 10:53:00
  • asp如何取回已忘记的密码?

    2010-05-13 16:33:00
  • asp之家 网络编程 m.aspxhome.com