1. 將數據保存到excel
result如下圖所示:
from openpyxl.utils import get_column_letter
result_copy = result.copy() # result是一個DataFrame
len_columns = len(result_copy.columns)
last_column_letter = get_column_letter(len_columns) # get_column_letter獲取數字對應excel列中的字母,如第1列叫做A
merge_right_column = last_column_letter + '1'
writer = pd.ExcelWriter('a.xlsx') # 打開或新建一個a.xlsx的工作簿句柄
workbook = writer.book # workbook爲該工作簿
# 爲工作簿定義一些格式
merge_format = workbook.add_format({
'bold': True, # 是否加粗
'font_size':14, # 字體
'align':'center', # 水平居中
'valign':'vcenter', # 垂直居中
'font':'宋體' # 字體
})
first_last_row_fmt = workbook.add_format({
'bold':True,
'align':'center',
'text_wrap':True, # 自動換行
'font_size':11,
'valign':'vcenter',
'font':'宋體',
'fg_color': '#DCE6F1', # 填充色
'border': 1 # 線條粗細
})
text_fmt = workbook.add_format({
'bold':False,
'align':'center',
'text_wrap':True,
'font_size':11,
'valign':'vcenter',
'font':'宋體',
'border': 1
})
# 如果需要設置字體顏色,則可以再加上 'font_color':'#DCE6F1'
# 將result放到一張sheet_name的表中,index是否保留result的index,header是否保留result的columns。
# startrow=1, startcol=0將result放到excel的第1行第0列(excel的行列都是從0開始)
result_copy.to_excel(writer, sheet_name=u'12321被舉報移動號碼', encoding='utf_8_sig', index=False, header=True, startrow=1, startcol=0)
# ws表示‘12321被舉報移動號碼’這個工作表
ws = writer.sheets['12321被舉報移動號碼']
# 假如merge_right_column爲R1,則將A1到R1單元格合併,並寫入data,格式爲上述定義的merge_format
ws.merge_range('A1:%s'%merge_right_column, data='12321被舉報移動號碼情況', cell_format=merge_format) # merge cell
ws.set_column('B:%s'%last_column_letter,7) # 設置列寬
ws.set_column('A:A', 10)
ws.set_row(row=0, height=50) # 設置行高
ws.set_row(row=1, height=40)
# 由於表中已經存在result的數據,所以不再做其他操作,表格中就有數據了。但是有時需要對單元格設置格式,所以用ws.write的方法
# 重新寫入值並設置格式
for col_num, value in enumerate(result_copy.columns.values):
ws.write(1, col_num, value, first_last_row_fmt)
for row in range(2, result_copy.shape[0]+1):
for col in range(len_columns):
ws.write(row, col, result_copy.iloc[row-2,col], text_fmt)
for col in range(len_columns):
ws.write(result_copy.shape[0]+1, col, result_copy.iloc[result_copy.shape[0]-1, col], first_last_row_fmt)
# 剛纔將result寫入到了12321被舉報移動號碼這個工作表,現在將data_original寫入原始數據這個工作表
data_original.to_excel(writer, sheet_name=u'原始數據', encoding='utf_8_sig', index=True, header=True, startrow=0, startcol=0)
'''以下爲在excel作圖'''
# 爲工作簿再添加一個工作表,名爲圖片
ws2 = workbook.add_worksheet('圖片')
# 添加一個chart,type表示圖標的類型。如line爲折線圖,還有柱狀圖等等
chart = workbook.add_chart({'type':'line'})
# 折線圖所用的各種數據
chart.add_series({
'name':'=偵辦平臺周分析!$A$3', # legend的名稱
'categories':'=偵辦平臺周分析!$B$2:$U$2', # Series,最終就是x軸對應的刻度名
'values':'=偵辦平臺周分析!$B$3:$U$3', # 折線所用的數據
'line':{'color':'#ED7D31', 'boder':1}, # 折線圖的各種格式,如顏色,線條粗細
'data_labels': {'value': True}, # 是否顯示數值
'rotation':45 # 座標軸旋轉45度
})
# 再在同一張圖片中添加另一條折線
chart.add_series({
'name':'=偵辦平臺周分析!$A$4',
'categories':'=偵辦平臺周分析!$B$2:$U$2',
'values':'=偵辦平臺周分析!$B$4:$U$4',
'line':{'color':'#A5A5A5'},
'data_labels': {'value': True},
'rotation':45
})
# 再在同一張圖片中添加第三條折線
chart.add_series({
'name':'=偵辦平臺周分析!$A$5',
'categories':'=偵辦平臺周分析!$B$2:$U$2',
'values':'=偵辦平臺周分析!$B$5:$U$5',
'line':{'color':'#5B9BD5'},
'data_labels': {'value': True},
'rotation':45
})
chart.set_title({'name':'偵辦平臺雲南地區號碼趨勢'}) # 設置圖片title
chart.set_size({'width':1000, 'height':500}) # 設置圖片的大小
chart.set_style(2) # 設置風格
# chart.set_x_axis({
# 'name': 'Earnings per Quarter', #設置X軸標題名稱
# 'name_font': {'size': 14, 'bold': True}, #設置X軸標題字體屬性
# 'num_font': {'italic': True }, #設置X軸數字字體屬性
# })
# chart.set_table() # 設置X軸爲數據表格形式
ws2.insert_chart('A10', chart, {'x_offset':25,'y_offset':10}) # 在哪裏插入這張圖標
writer.save() # 保存
writer.close() # 關閉
最終生成的excel如下所示:
圖片工作表如下:
將柱狀圖和折線圖放到一起
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則爲空)
2. 圖標類型
- area:創建一個面積樣式的圖表;
- bar:創建一個條形樣式的圖表;
- column:創建一個柱形樣式的圖表;
- line:創建一個線條樣式的圖表;
- pie:創建一個餅圖樣式的圖表;
- scatter:創建一個散點樣式的圖表;
- stock:創建一個股票樣式的圖表;
- radar:創建一個雷達樣式的圖表