本节主要是讨论如何利用xlsxwriter第三方excel模块,对excel表格进行有条件的输出。
假设有如下产品,由产品ID与费用组成
希望在Cost列,将费用最高的3个价格标浅红色,并对ID/Cost 两列中的单元格修改格式。
该程序主要分三块内容:
一、创建DataFrame
二、确定前3个最高的费用
三、用xlsxwriter 参数定义单元格格式和条件格式
一、创建DataFrame
1、定义excel表格的输出路径;
2、创建DataFrame;
3、Pandas 调用xlsxwriter
import numpy as np
import pandas as pd
import xlsxwriter
from pandas import Series,DataFrame
path_out=r'D:\4_pandas_conditional_format.xlsx'
#对cost列随机生成数字,randint生成的是个array [[x1,x2,x3,...,x10]], 为了取其中的
#[x1,x2,x3,...,x10],用[0],然后再list为列表。
df=DataFrame({'ID':np.arange(1,11,1),'Cost':list(np.random.randint(20,100,size=(1,10))[0])})
#pandas 调用xlsxwriter
writer=pd.ExcelWriter(path_out,engine='xlsxwriter')
#index=False 不要将DataFrame中的index输入到excel表格中。
df.to_excel(writer,sheet_name='Item',index=False)
二、确定前3高的费用
后面会用xlsxwriter的conditional format,里面有选项,比如大于某个值用啥颜色。
因此,确定前3高费用可转换为查找第4个最大值。
def findKthLargestNumber(df,k):
list_num=df['Cost'].values.tolist() #将Cost列转为列表
list_num.sort(reverse=True) #value值从大到小排列
return list_num[k-1] #list列表中从0开始计数,减1.
kth_number=findKthLargestNumber(df,4)
三、用xlsxwriter 参数定义单元格格式和条件格式
1、定义单元格格式,cell format;
2、定义条件格式,conditional format
workbook=writer.book
worksheet=writer.sheets['Item']
#定义单元格样式:不是粗体,字体为微软雅黑,大小:9,横向、纵向都居中,不要单元格的周边框
#针对单元格,xlsxwriter官网中明确规定了注意事项:
#It isn’t possible to format any cells that already have a format
#such as the index or headers or any cells that contain dates or datetimes.
#Note: This feature requires Pandas >= 0.16
cell_fmt={'bold':False,'font_name':'微软雅黑','font_size':9,'align':'center','valign':'vcenter','border':0}
#定义颜色单元格颜色,FFC7CE means light red
color_fmt={'bg_color': '#FFC7CE'}
#定义列名的格式(ID,Cost)
header_fmt={'bold':True,'font_name':'微软雅黑','font_size':9,'align':'center','valign':'vcenter','border':0}
cell_format=workbook.add_format(cell_fmt)
color_format=workbook.add_format(color_fmt)
header_format=workbook.add_format(header_fmt)
#对A、B两列列宽调整为15,单元格样式采用cell_format
worksheet.set_column('A:B',15,cell_format)
#对B2~B11的单元格,凡是大于第4个最大数字(kth_number),将标记为浅红色(color_format)
worksheet.conditional_format('B2:B11',{'type':'cell','criteria':'>','value':kth_number,'format':color_format})
#对列名(ID,Cost)写入到excel表格中,并采用header_format格式。
for colx,value in enumerate(df.columns.values):
worksheet.write(0,colx,value,header_format)
writer.save()#保存
初学python有很多不足,望各位大佬不吝赐教,多谢了。
学习python目的:主要是实现办公自动化,对excle、word、PPT、邮件等自动化处理,对销售数据进行综合分析,便于规划及汇报。