python生成Excel圖表(經過xlsxwriter)

前面介紹了pandas的簡單用法,pandas的數據能夠經過matlab第三方包將數據生成報表,可是我想將報表生成在Excel中,這時候就能夠藉助xlsxwriter第三方包來生成圖標
 
缺點:xlsxwriter不能對已存在的Excel進行編輯插入圖標
 
這裏的生成excel主要分爲準備多維數組類型的數據->數據插入到Excel中->對數據按系列劃分生成報表 

第一步:處理數據

從pandas中獲得的數據是DataFrame格式的,相似下面的字典結構,咱們須要將他轉換成多維數組格式,多維數組的第一個數組爲全部標題,第二個數組爲標題下第一行數據...
bugnum_terminal = { "Android的BUG數": [bugnum_android], "iOS的BUG數": [bugnum_ios], "server的BUG數": [bugnum_server], "FE的BUG數": [bugnum_fe] }
 
處理方法:
# 將字典型的數據轉換成數組,可以使用columns指定key的排序,例如{"A":[1,2,3,4],"B":[5,6,7,8]}會轉換成[["A","B"],[1,5],[2,6],[3,7],[4,8]]
def parsedata(self, dictdata, columns=[]): result = [] if columns == []: keys = dictdata.keys() else: keys = columns result.append([key for key in keys]) values = [] for key in keys: values.append(dictdata[key]) values = zip(*values) for value in values: result.append(list(value)) return result
 
這樣返回的數據就是一個可直接插入Excel中的多維數組

第二步:將數據插入Excel中

首先要建立一個Excel文件,而後在Excel中建立一個sheet表單頁,最後將數據插入到sheet表單頁中
一、建立一個Excel對象
workbook = xlsxwriter.Workbook(「Excel名字.xlsx」)
 
二、基於Excel對象建立一個sheet表單對象
worksheet = workbook.add_worksheet(name=「sheet表單的名字,不填寫就默認爲sheet1")
 
三、將數據寫入sheet表單頁worksheet
worksheet.write_row( row, col, data, cell_format=None) worksheet.write_column(row, col, data, cell_format=None)
 
能夠用A1表示第一行第一列的那個單元格,這個時候後面的data能夠是個數組,直接插入一行數據
worksheet.write_row("A1", 一行數據, 樣式(非必填項))
 
cell_format爲表單樣式:例如加粗
bold = workbook.add_format({'bold': 1})
 
將數據插入表單的例子:
for row in range(len(data)):  # 將數據插入excel中
    if row == 0: print(data[row]) worksheet.write_row("A" + str(row+1), data[row], bold) worksheet.write_column() else: worksheet.write_row("A" + str(row+1), data[row])
 
說明:data爲第一步生成的多維數組數據,write_row這裏是經過Excel的A一、A2....等方式標識單元格的

第三步:生成圖表 

一、經過add_chart({’type’:’表格類型’})添加一個chart對象
經過type定義圖標的類型,好比是柱形圖仍是餅圖
The supported chart types are:
  • area: Creates an Area (filled line) style chart.
  • bar: Creates a Bar style (transposed histogram) chart.
  • column: Creates a column style (histogram) chart.
  • line: Creates a Line style chart.
  • pie: Creates a Pie style chart.
  • doughnut: Creates a Doughnut style chart.
  • scatter: Creates a Scatter style chart.
  • stock: Creates a Stock style chart.
  • radar: Creates a Radar style chart.
 
二、添加圖標要統計的數據,同一個報表能夠添加多個系列
# 第一種添加方式:[sheetname, A1(起始單元格標識), F1(結束單元格標識), last_col]
chart.add_series({ 'categories': '=Sheet1!$A$1:$A$5', 'values':     '=Sheet1!$B$1:$B$5', 'line':       {'color': 'red’},
    'name':'=各端BUG數彙總_圖表!$A$3' })
 
# 第二種添加方式:[sheetname, first_row, first_col, last_row, last_col]
chart.add_series({ 'categories': ['Sheet1', 0, 0, 4, 0], 'values':     ['Sheet1', 0, 1, 4, 1], 'line':       {'color': 'red'}, 'name':['Sheet1', 0, 0], 'data_labels': {'value': True} })
 
categories爲圖表下面的分組名稱
values:必填項,要統計的圖標數據
name:系列的名字
data_labels:顯示在圖表上的數據標籤
 
一個圖表能夠添加多個系列,能夠經過兩種方式添加多個系列
a、調用屢次add_series()方法
b、add_series()中categories和values多個值用元組記錄
chart.add_series({ 'categories': '=(Sheet1!$A$1:$A$9,Sheet1!$A$14:$A$25)', 'values':     '=(Sheet1!$B$1:$B$9,Sheet1!$B$14:$B$25)', })
 
三、給圖表定義名字和樣式
chart.set_title({'name': ‘圖標名字'})
chart.set_style(10) chart.height=600 chart.width=960
height和width爲生成的圖標的寬高,默認寬高爲480和288
 
四、將圖表插入到Excel中
a:方法1
worksheet.insert_chart('A7', chart)方法插入數據
 
b:方法2
chartsheet = workbook.add_chartsheet() chartsheet.set_chart(chart)
 
例子:
chart = workbook.add_chart({'type': 'column'}) chart.add_series({ 'categories': '=各端BUG數彙總_圖表!$A$1:$' + dataarray.getrowname_end() + '$1', 'values': '=各端BUG數彙總_圖表!$A$2:$' + dataarray.getrowname_end() + '$2', 'name':'=各端BUG數彙總_圖表!$A$3' }) chart.set_title({'name': '各端BUG數彙總'}) chart.set_style(10) worksheet.insert_chart('B10', chart)
 
最終生成的1個柱形圖以下:
A:chart.set_title({'name': ‘圖標名字’})
B:chart.add_series()中的name
C:chart.add_series()中的categories
D:chart.add_series()中的values
 
(其餘)圖表操做1:合併多個series系列到一塊兒
多個系列正常是緊挨着在一塊兒的,可是有時候咱們想合併到一塊兒,例如柱形圖或折線圖放到一塊兒,這時候就能夠用chart的combine方法合併
column_chart = workbook.add_chart({'type': 'column'}) column_chart.add_series({ 'name':       '=Sheet1!B1', 'categories': '=Sheet1!A2:A7', 'values':     '=Sheet1!B2:B7', }) line_chart = workbook.add_chart({'type': 'line'}) line_chart.add_series({ 'name':       '=Sheet1!C1', 'categories': '=Sheet1!A2:A7', 'values':     '=Sheet1!C2:C7', }) column_chart.combine(line_chart)
 
注意:合併以前chart必定要添加了series才行,能夠經過len(chart.series)判斷是否爲空(長度爲0則爲空)
在這過程當中遇到一個問題,合併多個column的chart時,只保留了第一個和最後一個chart的值,這個若是還沒找到好辦法
 
(其餘)圖表操做2:添加table
column_chart.set_table({'show_keys': True})
 
此時會在圖下面列出沒系列的值,顯示成table的樣式
 
圖表操做1和操做2的結合樣式以下:
 
 
 
相關文章
相關標籤/搜索