使用Pandas模块生成的数据,在导出保存为Excel 时,是一种默认的格式,常常遇到列宽无法完整显示单元格中的文本、文字大小、行距不是预期的,无边框、无行背景色等问题,必须手动重设格式。
而且,现在不仅需要美化表格,还要实现自动截图,将数据表保存为一张图片。这一张新生成的图片拟自动插入到 Word 文档中。全过程都由Python自动化完成,我太懒了。
处理前的Excel 表格如下:
最终,程序运行后生成了下面的图片,本人不是专业人士,过程有点曲折,请别见怪。实现了第一行即表头高亮显示浅红色;第一列列宽为20,其他数据行的列宽为10,所有列文字居中对齐;奇数行高亮显示背景色为天蓝色;表头文字调为红色;第二列到最后一列的数据,每一列的最大值标为红色。自动保存为一张png图片,先看看效果怎样:
代码如下:
from openpyxl import Workbook,load_workbook #导入所需的库
from openpyxl.styles import *
from openpyxl.utils import get_column_letter,
import pandas as pd
from PIL import ImageGrab, Image
import xlwings as xw
df= pd.read_excel('D:\测试数据\本月数据表.xlsx',sheet_name=0,header=0,dtype=object,na_rep="")
rows = df.shape[0]#不计表头的行数
cols = df.shape[1]
print('行数 :%s,列数:%s'% (rows,cols))
def highlight_max(s): #Styler.applymap: 作用于元素;Styler.apply:作用于行、列或整个表
is_max = s == s.max() #取列最大值#is_max = s > 200 #取列大于200的值
return ['color : red' if v else '' for v in is_max] #对列最大值(红色)处理
df_styled =df.style.applymap(lambda x: 'color:black',subset=["地区"]).apply(highlight_max,subset=['销售量', '未整改', '已超时', '未更正'])
writer = pd.ExcelWriter('D:\测试数据\本期统计表.xlsx', engine='xlsxwriter')
df_styled.to_excel(writer, sheet_name='Sheet1',index=None)
workbook = writer.book
worksheet = writer.sheets['Sheet1']
# 期望的设定格式
format0 = workbook.add_format({'bg_color': '#F5DEB3','bold': True, 'font_color': 'red'})#表头颜色,'align': 'center'水平居中。'valign': 'vcenter'垂直居中
format1 = workbook.add_format({'bg_color': '#B0E0E6','border':1,'border_color': '#000000'})#背景色'font_color': '#9C0006',天蓝色#87CEEB,'#ADD8E6',border=1是加边框
format2 = workbook.add_format({'border':1,'border_color': '#000000'})#加边框,#FF0000是红色,#000000是黑色
# 对奇数行设置颜色
worksheet.conditional_format(0,0,0,cols-1, {'type': 'formula','criteria': '=mod(row(),2)=1','format': format0})#表头格式
worksheet.conditional_format(1,0,rows,cols-1, {'type': 'formula','criteria': '=mod(row(),2)=1','format': format1})#对奇数行设置颜色格式,#'A2:E13'
worksheet.conditional_format(1,0,rows,cols-1, {'type': 'formula','criteria': '=mod(row(),2)=0','format': format2})#对偶数行的格式
worksheet.set_column("A:A" , 20)#第1列列宽度20#worksheet.set_column(0,0,8)
worksheet.set_column(1,cols-1,10)#第2列至y-1列的宽度为10
writer.save()
writer.close()
wb=load_workbook(r'D:\测试数据\本期统计表.xlsx') #载入excel文件,仅支持.xlsx
sheetname=wb.sheetnames #获取所有的sheet名称
sheet1=wb[sheetname[0]] #获取其中第一个sheet
for row in sheet1.rows: #循环每一行
for i in range(0,sheet1.max_column):
row[i].alignment = Alignment(horizontal='center', vertical='center') #对齐方式(centor、left、right)
wb.save(r'D:\测试数据\本期统计表.xlsx')
print('表格已美化并保存为excel,OK')
def excel_catch_screen(shot_excel,shot_sheetname,img_name):
app = xw.App(visible=True, add_book=False) # 使用xlwings的app启动
wb = app.books.open(shot_excel) # 打开文件
sheet = wb.sheets(shot_sheetname) # 选定sheet
all = sheet.used_range # 获取有内容的range
all.api.CopyPicture() # 复制图片区域
sheet.api.Paste() # 粘贴
pic = sheet.pictures[0] # 当前图片
pic.api.Copy() # 复制图片
img = ImageGrab.grabclipboard() # 获取剪贴板的图片数据
if img.mode == "P":
img = img.convert('RGBA')
else:
pass
img.save("D:\测试数据\\"+img_name + ".png") # 保存图片
im = Image.open("D:\测试数据\\"+img_name + ".png")
p = Image.new('RGB', im.size, (255,255,255))
x, y = im.size
p.paste(im, (0, 0, x, y), im)
p.save("D:\测试数据\\"+img_name + ".png") # 保存图片
pic.delete() # 删除sheet上的图片
wb.close() # 不保存,直接关闭
app.quit()
shot_excel='D:\测试数据\本期统计表.xlsx'
shot_sheetname=1
img_name = '表格截图1'
excel_catch_screen(shot_excel,shot_sheetname,img_name)
print('美化的excel已截图并保存为图片,OK')
现在,只要数据处理完毕,就完美输出了一张统计图表,无论这个统计表是多少行、多少列,都一个模样的效果截图出来。这张图怎样播入到Word 文档中,就不在这里描述了。