python 数据分析之 xlsxwriter文件解析
一:xlsxwriter介绍
基本demo
import xlsxwriter
import time
time_name = time.strftime(“%Y-%m-%d-%H-%M-%S”,time.localtime())
print(time_name)
wb = xlsxwriter.Workbook(“%s_result.xlsx”%time_name) #指定sheet名,但中文名会报UnicodeDecodeErro的错误
sheet1 = wb.add_worksheet(‘result’)
sheet1.write(0,0,‘Result’)
sheet1.write(1,0,‘info’)
sheet1.write(2,0,‘info1’)
wb.close()
1> 与其他库区别
库 | 作用 |
---|---|
openpyxl | 只允许读取和写入.xlsx格式文件并进行增删改增查。 |
xlwings | 允许读取和写入.xlsx和.xls两种格式文件并进行增删改查。 |
xlsxwriter | 只允许写入.xlsx格式的文件 |
2> xlsxwriter 理解
新建 xlsx 文件,插入数据、插入图标等表格操作。只能新建xlsx后写入xlsx文件;它用于将文本、数字、公式和超链接写入Excel工作表中,不仅如此,它支持格式化功能。迄今为止,这个模块是除了Excel本身之外,支持处理Excel功能最全的Python第三方模块
3> xlsxwriter 使用
可以格式化的单元格的属性包括:字体、颜色、图案、边框、对齐方式和数字格式
1. 单元格写入
如果对单个单元格进行写入数据用如下语法:
worksheet.write(row, col, some_data)
===================
row行和col列的索引为零也即工作表的第一个单元格A1为(0,0),多组数据可以使用循环写入,
demo
orksheet.write(0, 0, '写点什么好') # 写入字符串
worksheet.write(2, 0, '=SUM(B3:B4)') # 写入excel公式
worksheet.write_formula(4, 0, '=SUM(B3:B4)') # 写入excel公式
date_format = workbook.add_format({'num_format': 'yyyy-mm-dd H:M:S'})
date_format1 = workbook.add_format({'num_format': 'yyyy/m/d;@'})
worksheet.write_datetime(6, 0, datetime.today(),date_format ) # 写入自定义时间
worksheet.write_datetime(6, 2, datetime.today(),date_format1 ) # 写入日期
num_format = workbook.add_format({'num_format': '0.00_);[Red](0.00)'})
worksheet.write_number(8, 0, 1001) # 写入数字(常规)
worksheet.write_number(8, 2, 1001,num_format) # 写入数字(数值)
worksheet.write_row(row = 1 ,col = 3, data = ['嘿嘿','哈哈','呵呵']) # 按行写入:从第几行开始,从第几列开始,写入的值
# # write_row 写入
lst=['12','34','56','78']
worksheet1.write_row(5, 0, lst) # 把数据写到第6行的,从第1列开始到第4列上
# # write_column 写入
worksheet1.write_column(6, 0,lst) # 把数据写到第1列,从第7行开始到第10行上
设置表格格式:可以通过打开excel 点击设置单元格格式-点击自定义-查看当时表格格式
num_format = workbook.add_format({'num_format': '¥#,##0.00;¥-#,##0.00'})
worksheet.write(8, 0, 120,num_format) # 写入数字(常规)
2. 整行列数据写入
worksheet.write_row(“A1”,data,bold)
worksheet.write_column(“A1”,data,bold)
========================
第一行代码为按行插入且从A1单元格开始,data为要写入的数据(格式为一个列表),bold为单元格样式。第二行代码与之不同的是按列插入。
3. 单元格样式
bold = f.add_format({
'bold': True, # 字体加粗
'border': 1, # 单元格边框宽度
'align': 'left', # 水平对齐方式
'valign': 'vcenter', # 垂直对齐方式
'fg_color': '#F4B084', # 单元格背景颜色
'text_wrap': True, # 是否自动换行
})
在上方的写入行列数据中我们用到的bold参数,这是一个调节单元格样式的参数,常用的格式如上代码
4. 插入图
worksheet.insert_image('A1','绝对路径')
第一个参数是你要指定哪个单元格插入图片,第二个参数是存放图片的绝对路径。
5. 插入超链接
worksheet.write_url(row, col, "internal:%s!A1" % ("链接对象"), string="链接显示名字")
row和col参数都是设置位置信息的。
6. 插入图表
chart = workbook.add_chart({'type': 'column','subtype': 'stacked'})
workbook.add_chartsheet()
=====================
函数是最经典的插入图表函数,字典里的第一个键type参数指的是放入的图表类型。而第二个键指的是某些图表类型中的图表子类型
支持的图表类型 | 含义 |
---|---|
area | 创建一个Area(实线)样式表 |
bar | 创建条形样式(转置直方图)图表 |
column | 创建列样式(直方图)图表 |
line | 创建线型图表 |
pie | 创建一个饼图样式图表 |
doughnut | 创建一个甜甜圈样式表 |
scatter | 创建散点图样式图 |
stock | 创建一个股票样式图 |
radar | 创建雷达样式表 |
7. 插入数据
A: 参数
chart.add_series(options)
worksheet.insert_chart('A7', chart)# 将创建好的 chart 对象放入到 Excel 表格中
==================
这里的options是以字典形式的图表数据,在Excel中图表系列是一组信息(值、轴标签、格式等);
insert_chart将图表插入到工作表指定的位置,第一个参数为单元格位置信息,第二个参数为选定的图表
B: 插入数据 demo
demo
import xlsxwriter
workbook = xlsxwriter.Workbook('条形图demo.xlsx')
worksheet = workbook.add_worksheet('test') # 如果出现没图像显示就删除里面的参数
chart = workbook.add_chart({'type': 'column'})
data = [
[3, 6, 9, 12, 15],
[2, 4, 6, 8, 10],
[1, 2, 3, 4, 5],
]
worksheet.write_column('A1', data[0])
worksheet.write_column('B1', data[1])
worksheet.write_column('C1', data[2])
chart.add_series({'values': '=test!$A$1:$A$5'})
chart.add_series({'values': '=test!$B$1:$B$5'})
chart.add_series({'values': '=test!$C$1:$C$5'})
worksheet.insert_chart('A7', chart)
workbook.close()
workbook :创建对象
worksheet: 添加sheeet页
worksheet.write_column():对整行整列进行数据添加
chart:创建chart 对象
data : 数据
worksheet.write_column: 对数据先进性写入,list格式
chart.add_series:options是以字典形式的图表数据,{‘values’: ‘=工作表名!
列对应字母
列对应字母
列对应字母
行对应数字:
列对应字母
列对应字母
列对应字母
行对应数字’}
worksheet.insert_chart:把chart 表插入左上角在A7位置
demo 结果数据图表:
修改添加第一行数据
data = [
[3, 6, 9, 12, 15],
[2, 4, 6, 8, 10],
[1, 2, 3, 4, 5],
[2, 4, 6, 8, 10],
[1, 2, 3, 4, 5],
]
worksheet.write_column('A1', data[0])
worksheet.write_column('B1', data[1])
worksheet.write_column('C1', data[2])
worksheet.write_column('D1', data[3])
worksheet.write_column('E1', data[4])
chart.add_series({'values': '=test!$A$1:$F$1'})
chart.add_series({'values': '=test!$B$1:$B$5'})
chart.add_series({'values': '=test!$C$1:$C$5'})
修改添加第一行数据 图标:
8. 设置x轴与y轴属性
hart.set_x_axis({
'name': 'Zaoqi Python',
'name_font': {'size': 12, 'bold': True},
'num_font': {'italic': True },
})
===========================
第一个参数name是指轴的名称,name_font设置x轴的字体属性,这里设置了粗体和大小。num_font指轴编号(也即如图中x轴下方的1234)的字体属性这里设置了斜体
同理,y轴、子图xy轴的设置也是一样的,区别在于将代码中的x换成对应的y和x
9. 设置图表尺寸
用set_size()函数来设置图表尺寸
chart.set_size({'width': 720, 'height': 576})
chart.set_size({'x_scale': 1.5, 'y_scale': 2})
worksheet.insert_chart('E2', chart, {'x_offset': -10, 'y_offset': 5})
====================================
函数里面有六个参数:width、height,x_offset,y_offset
前两个代表宽度与高度是以像素为单位,默认的图表的宽度*高度为480 x 288像素
10. 设置图表标题
用set_title()函数
chart.set_title({'name': 'Zaoqi Python title'})
chart.set_title({
'name': 'Zaoqi Python Title',
'overlay': True,
'layout': {
'x': 0.62,
'y': 0.24,
}
})
chart.set_title({‘none’: True}) :关闭此默认标题同时关闭所有其他set_title()选项
name指标题;overlay代表允许标题覆盖到图表上通常与layout一起使用。layout以图表相对单位设置标题的位置(x, y)
11. 设置图例
set_legend()函数设置图例属性
chart.set_legend({'none': True})
chart.set_legend({'position': 'none'})
chart.set_legend({'position': 'bottom'})
chart.set_legend({'font': {'size': 4, 'bold': True}})
chart.set_legend({'delete_series': [0, 3]})
none:关闭图例;默认是开启的。position:图例的位置。font:图例的字体属性。delete_series:删除指定图例,以列表呈现
12. 设置图表样式
set_style(num)函数,用于将图表的样式设置为Excel中“设计”选项卡上可用的48种内置样式之一。参数num就是48种内置样式之一
13. 设置图表区域
用set_chartarea()函数来设置图表区域的属性图表区域,也就是图表背后的区域
chart.set_chartarea({
'fill': {'color': 'black'}
})
fill:设置图表区域的实心填充属性,例如颜色
14. 在图表下方添加数据表
set_table()函数在水平轴下方添加一个数据表
15. 合并两个不同类型的图表
合并图表用combine()函数
import xlsxwriter
workbook = xlsxwriter.Workbook('条形图合并demo.xlsx')
worksheet = workbook.add_worksheet()
chart = workbook.add_chart({'type': 'column'})
line_chart = workbook.add_chart({'type': 'line'})
data = [
[3, 6, 9, 12, 15],
[2, 4, 6, 8, 10],
[1, 2, 3, 4, 5],
]
worksheet.write_column('A1', data[0])
worksheet.write_column('B1', data[1])
worksheet.write_column('C1', data[2])
chart.add_series({'values': '=Sheet1!$A$1:$A$5'})
chart.add_series({'values': '=Sheet1!$B$1:$B$5'})
chart.add_series({'values': '=Sheet1!$C$1:$C$5'})
line_chart.add_series({'values': '=Sheet1!$A$1:$A$5'})
line_chart.add_series({'values': '=Sheet1!$B$1:$B$5'})
line_chart.add_series({'values': '=Sheet1!$C$1:$C$5'})
chart.set_x_axis({
'name': 'CH TEST',
'name_font': {'size': 12, 'bold': True},
'num_font': {'italic': True },
})
chart.combine(line_chart)
chart.set_chartarea({
'fill': {'color': 'red'}
})
worksheet.insert_chart('A7', chart)
workbook.close()
demo 效果截图:
16. 关闭Excel文件
在上面例子中都可以看到最后都调用了这句代码
workbook.close()
二:其他用法
1> 设置工作表标签颜色
import xlsxwriter
workbook = xlsxwriter.Workbook('测试文件.xlsx')
worksheet1 = workbook.add_worksheet('这是sheet1')
worksheet1.set_tab_color('#0000FF')
worksheet2 = workbook.add_worksheet('这是sheet2')
workbook.close()
2> 设置行高、宽
# 设置行宽
worksheet.set_row(0, 60)# 第一行行宽
# 设置列宽
worksheet.set_column(1, 2, 30) # 第二、三列列宽
3> 合并单元格
merge_range(first_row, first_col, last_row, last_col, data[, cell_format])
=================================================
def merge_range(self, first_row, first_col, last_row, last_col,
data, cell_format=None):
demo
import xlsxwriter
from datetime import datetime
# 创建工作簿
workbook = xlsxwriter.Workbook('测试文件.xlsx')
# 创建工作表
worksheet = workbook.add_worksheet('这是sheet1')
# 写入数据
worksheet.write(0, 0, '未合并') # 第一行第一列,A1写入'未合并'
worksheet.write(2, 0, '会被覆盖') # 第三行第一列,A3写入'会被覆盖'
worksheet.write(4, 0, '待合并') # 第五行第一列,A5写入'待合并'
worksheet.merge_range(1,2,3,4,'合并01') # 合并第二行-四行,第三列-五列,即:C2:E4
worksheet.merge_range('A3:B3','覆盖它') # 合并A3:B3,并写入'覆盖它'
worksheet.merge_range('A5:B5','') # 合并A5:B5,'待合并'并不被覆盖
workbook.close()