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