用Python自動生成 圖文並茂的資料分析 報告

語言: CN / TW / HK

大家好,這裡是程式設計師晚楓。

上週B站:程式設計師晚楓後臺的一位朋讀者私信我,想學習一下Python自動化生成資料分析報告。

作為有問必答的程式設計博主,今天我們來一起學習一下~

reportlab是Python的一個標準庫,可以畫圖、畫表格、編輯文字,最後可以輸出PDF格式。它的邏輯和編輯一個word文件或者PPT很像。有兩種方法:

  1. 建立一個空白文件,然後在上面寫文字、畫圖等;
  2. 建立一個空白list,以填充表格的形式插入各種文字框、圖片等,最後生成PDF文件。

因為需要產生一份給使用者看的報告,裡面需要插入圖片、表格等,所以採用的是第二種方法。

1、一行命令,安裝這個庫

reportlab輸入Python的第三方庫,使用前需要先安裝,

為了方便大家使用,我已經將這個庫整合到Python自動化辦公的專用庫:pip install python-office中了,

因此一行命令就可以完成的安裝命令如下👇

pip install -i http://pypi.tuna.tsinghua.edu.cn/simple python-office -U

2、核心程式碼模組匯入

①提前匯入相關內容,並且註冊字型。(註冊字型前需要先準備好字型檔案)

from reportlab.pdfbase import pdfmetrics   # 註冊字型
from reportlab.pdfbase.ttfonts import TTFont # 字型類
from reportlab.platypus import Table, SimpleDocTemplate, Paragraph, Image  # 報告內容相關類
from reportlab.lib.pagesizes import letter  # 頁面的標誌尺寸(8.5*inch, 11*inch)
from reportlab.lib.styles import getSampleStyleSheet  # 文字樣式
from reportlab.lib import colors  # 顏色模組
from reportlab.graphics.charts.barcharts import VerticalBarChart  # 圖表類
from reportlab.graphics.charts.legends import Legend  # 圖例類
from reportlab.graphics.shapes import Drawing  # 繪圖工具
from reportlab.lib.units import cm  # 單位:cm

②註冊字型

提前準備好字型檔案, 如果同一個檔案需要多種字型可以註冊多個

pdfmetrics.registerFont(TTFont('SimSun', 'SimSun.ttf'))
封裝不同內容對應的函式
建立一個Graphs類,通過不同的靜態方法提供不同的報告內容,包括:標題、普通段落、圖片、表格和圖表。函式中的相關資料目前絕大多數都是固定值,可以根據情況自行設定成相關引數。
# Graphs類的全部程式碼,請+v:CoderWanFeng

③生成報告

if __name__ == '__main__':  
    # 建立內容對應的空列表  
    content = list()  
    
    # 新增標題   
    content.append(Graphs.draw_title('資料分析就業薪資'))   
    
    # 新增圖片   
    content.append(Graphs.draw_img('資料全集.jpg'))  
    
    # 新增段落文字  
    content.append(Graphs.draw_text('眾所周知,大資料分析師崗位是香餑餑,近幾年資料分析熱席捲了整個網際網路行業,與資料分析的相關的崗位招聘、培訓數不勝數。很多人前赴後繼,想要參與到這波紅利當中。那麼資料分析師就業前景到底怎麼樣呢?需要學習Python + 大資料分析,可以新增我:CoderWanFeng'))   
    
    # 新增小標題  
    content.append(Graphs.draw_title(''))  
    content.append(Graphs.draw_little_title('全網同名:程式設計師晚楓'))   
    
    # 新增表格   
    data = [    
        ('平臺名稱', '關注人數', '較上年增長率'),    
        ('公眾號', '18.5K', '25%'),     
        ('B站', '25.5K', '14%'),    
        ('微博', '29.3K', '10%') 
    ]  
    content.append(Graphs.draw_table(*data)) 
    
    # 生成圖表  
    content.append(Graphs.draw_title(''))  
    content.append(Graphs.draw_little_title('熱門城市的就業情況'))  
    b_data = [(25400, 12900, 20100, 20300, 20300, 17400), (15800, 9700, 12982, 9283, 13900, 7623)]  
    ax_data = ['BeiJing', 'ChengDu', 'ShenZhen', 'ShangHai', 'HangZhou', 'NanJing'] 
    leg_items = [(colors.red, '平均薪資'), (colors.green, '招聘量')]   
    content.append(Graphs.draw_bar(b_data, ax_data, leg_items))  
    
    # 生成pdf檔案   
    doc = SimpleDocTemplate('report.pdf', pagesize=letter)  
    doc.build(content)

生成報告的結果如下