使用Pandas模块生成的数据,在导出保存为Excel 时,是一种默认的格式,常常遇到列宽无法完整显示单元格中的文本、文字大小、行距不是预期的,无边框、无行背景色等问题,必须手动重设格式。

而且,现在不仅需要美化表格,还要实现自动截图,将数据表保存为一张图片。这一张新生成的图片拟自动插入到 Word 文档中。全过程都由Python自动化完成,我太懒了。

处理前的Excel 表格如下:

python保存截图到文件夹 python excel截图保存_pandas


最终,程序运行后生成了下面的图片,本人不是专业人士,过程有点曲折,请别见怪。实现了第一行即表头高亮显示浅红色;第一列列宽为20,其他数据行的列宽为10,所有列文字居中对齐;奇数行高亮显示背景色为天蓝色;表头文字调为红色;第二列到最后一列的数据,每一列的最大值标为红色。自动保存为一张png图片,先看看效果怎样:

python保存截图到文件夹 python excel截图保存_python_02


代码如下:

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 文档中,就不在这里描述了。