xlsxwriter/ExcelWriter

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:創建一個雷達樣式的圖表
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章