python帶表格圖片生成封裝


一、環境
     語言:python3
二、作用

      直接轉化數據,生成帶表格的圖片

三、代碼

#!/usr/bin/python3
# -*- coding: utf-8 -*-
## author:qianqiu
from prettytable import PrettyTable
from PIL import Image, ImageDraw, ImageFont

def create_table_img(data,img_name, **kwargs):
    '''
        img_name 圖片名稱 'D:/project/pythonwork/12306/t.png' 或 t.png
        data 表格內容,首行為表頭部
        table_title 表格標題
        line_height 底部描述行高
        font 默認字體路徑
        default_font_size 默認字體大小
        default_background_color 圖片背景底色
        table_top_heght 設置表格頂部留白高度
        table_botton_heght 設置表格頂部留白高度
        describe 底部描述文字
    '''
    space = 20 ## 表格邊距
    # 生成圖片-------------------------------
    ### 底部描述行高
    if 'line_height' not in kwargs:  
         line_height = 4
    else:
        line_height = kwargs['line_height']

    ### 默認字體
    if 'font' not in kwargs:  
         kwargs['font'] = None

    ### 默認字體大小
    if 'default_font_size' not in kwargs:
         kwargs['default_font_size'] = 15

    ### 默認表標題字體大小
    if 'table_title_font_size' not in kwargs:
         kwargs['table_title_font_size'] = 22
    

    ### 圖片背景底色
    if 'default_background_color' not in kwargs:
         kwargs['default_background_color'] = (255,255,255,255)

    ### 設置表格頂部留白高度
    if 'table_top_heght' not in kwargs:
         kwargs['table_top_heght'] = kwargs['table_title_font_size'] + space + int(kwargs['table_title_font_size']/2)

    ## 底部描述文字
    if 'describe' in kwargs:
        describe_len = len(kwargs['describe'])
    else:
        describe_len = 0

    ### 設置表格底部留白高度
    if 'table_botton_heght' not in kwargs:
         kwargs['table_botton_heght'] = describe_len * kwargs['default_font_size'] + space
    
    ### 圖片后綴
    if 'img_type' not in kwargs:
         kwargs['img_type'] = 'PNG'

    ### 默認字體及字體大小
    font = ImageFont.truetype(kwargs['font'], kwargs['default_font_size'], encoding='utf-8')
    font2 = ImageFont.truetype(kwargs['font'], kwargs['table_title_font_size'], encoding='utf-8')
    ## Image模塊創建一個圖片對象
    im = Image.new('RGB',(10, 10),kwargs['default_background_color'])
    ## ImageDraw向圖片中進行操作,寫入文字或者插入線條都可以
    draw = ImageDraw.Draw(im)
       
    # 創建表格---------------------------------
    tab = PrettyTable(border=True, header=True, header_style = 'title')
    ## 第一行設置為表頭
    tab.field_names = data.pop(0)
    for row in data:
        tab.add_row(row)
    tab_info = str(tab)
    ## 根據插入圖片中的文字內容和字體信息,來確定圖片的最終大小
    img_size = draw.multiline_textsize(tab_info, font=font)
    img_width = img_size[0]+space*2
    table_height = img_size[1]+space*2
    img_height = table_height + kwargs['table_botton_heght'] + kwargs['table_top_heght']
    im_new = im.resize((img_width, img_height))
    del draw
    del im
    draw = ImageDraw.Draw(im_new, 'RGB')
    draw.multiline_text((space,kwargs['table_top_heght']), tab_info + '\n\n', fill=(0,0,0), font=font)

    ### 表標題--------------------------
    if 'table_title' in kwargs:
      title_left_padding = (img_width - len(table_title) * kwargs['table_title_font_size']) / 2
      draw.multiline_text((title_left_padding, space), table_title, fill=(17,0,0), font=font2, align = 'center')


    y = table_height + space/2

    ### 描述內容-----------------------------------
    if 'describe' in kwargs:
        y = y + kwargs['default_font_size']
        frist_row = kwargs['describe'].pop(0)
        draw.text((space,y), frist_row, fill=(255,0,0), font=font)
        for describe_row in kwargs['describe']:
            y = y + kwargs['default_font_size'] + line_height
            draw.text((space,y), describe_row, fill=(0,0,0), font=font)
    del draw
    ### 保存為圖片
    im_new.save(img_name, kwargs['img_type'])
    return True



if __name__ == "__main__":
    data = [
         ["項目", "周同比","20190118","20190111","日同比"," 20190118 "],
         ['日注冊人數',' ',' ',' ',' ',' '],
         ['日注冊人數',' ',' ',' ',' ',' '],
         ['日活躍人數',' ',' ',' ',' ',' '],
         ['日充值人數',' ',' ',' ',' ',' '],
         ['日掛號人數',' ',' ',' ',' ',' '],
         ['日充值金額',' ',' ',' ',' ',' ']
    ]
    describe = ['報警說明:','日成交筆數H5與ODPS誤差為:-3.4600%,高於2%','日成交筆數H5與ODPS誤差為:-3.4600%,高於2%','日成交筆數H5與ODPS誤差為:-3.4600%,高於2%']
    table_title = '日成交筆數'
    result = create_table_img(data,'t1.png', font = 'C:\Windows\Fonts\simkai.ttf',describe = describe, table_title = table_title)
    if result:
        print('圖表生成成功')

四、最終效果


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM