1.xlsxwriter 优点
1.1、功能比较强
相对而言,这是除Excel自身之外功能最强的工具了。比如我就用到了它提供的:字体设置、前景色背景色、
border设置、视图缩放(zoom)、单元格合并、autofilter、freeze panes、公式、data validation、
单元格注释、行高和列宽设置等等。
1.2、支持大文件写入
如果数据量非常大,可以启用constant memory模式,这是一种顺序写入模式,得到一行数据就立刻写入一行,
而不会把所有的数据都保持在内存中。
2.xlsxwriter 缺点
2.1、不支持读取和修改
作者并没有打算做一个XlsxReader来提供读取操作。不能读取,也就无从修改了。它只能用来创建新的文件。
我是利用xlrd把需要的信息读入后,用XlsxWriter创建全新的文件。
另外,即使是创建到一半Excel文件,也是无法读取已经创建出来的内容的(信息应该在,但是并没有相应的接口)。
因为它的主要方法是write而不是set。当你在某个单元格写入数据后,除非你自己保存了相关的内容,
否则还是没有办法读出已经写入的信息。从这个角度看,你无法做到读出->修改->写回,
只能是写入->写入->写入。
2.2、不支持XLS文件
XLS是Office 2013或更早版本所使用的格式,是一种二进制格式的文件。
XLSX则是用一系列XML文件组成的(最后的X代表了XML)一个压缩包。如果非要创建低版本的XLS文件,
就请移步xlwt吧。
2.3、暂时不支持透视表(Pivot Table)
1、xlsxwriter模块的简单使用:
xlsxwriter模块主要用来生成excel表格,插入数据、插入图标等表格操作。
1.1 基本功能
import xlsxwriter #导入模块
workbook = xlsxwriter.Workbook('new_excel.xlsx') #新建excel表
worksheet = workbook.add_worksheet('sheet1') #新建sheet(sheet的名称为"sheet1")
headings = ['Number','testA','testB'] #设置表头
data = [
['2017-9-1','2017-9-2','2017-9-3','2017-9-4','2017-9-5','2017-9-6'],
[10,40,50,20,10,50],
[30,60,70,50,40,30],
] #自己造的数据
worksheet.write_row('A1',headings)
worksheet.write_column('A2',data[0])
worksheet.write_column('B2',data[1])
worksheet.write_column('C2',data[2]) #将数据插入到表格中
workbook.close() #将excel文件保存关闭,如果没有这一行运行代码会报错
查看生成excel的结果:
1.2 将excel中插入折线图
import xlsxwriter #导入模块
workbook = xlsxwriter.Workbook('new_excel.xlsx') #创建新的excel
worksheet = workbook.add_worksheet('sheet1') #创建新的sheet
headings = ['Number','testA','testB'] #创建表头
data = [
['2017-9-1','2017-9-2','2017-9-3','2017-9-4','2017-9-5','2017-9-6'],
[10,40,50,20,10,50],
[30,60,70,50,40,30],
] #自己造的数据
worksheet.write_row('A1',headings)
worksheet.write_column('A2',data[0])
worksheet.write_column('B2',data[1])
worksheet.write_column('C2',data[2]) #将数据插入到表格中
chart_col = workbook.add_chart({'type':'line'}) #新建图表格式 line为折线图
chart_col.add_series( #给图表设置格式,填充内容
{
'name':'=sheet1!$B$1',
'categories':'=sheet1!$A$2:$A$7',
'values': '=sheet1!$B$2:$B$7',
'line': {'color': 'red'},
'data_labels': {'value': True} #显示数字,就是直方图上面的数字,默认不显示
}
)
chart_col.set_title({'name':'测试'})
chart_col.set_x_axis({'name':"x轴"})
chart_col.set_y_axis({'name':'y轴'}) #设置图表表头及坐标轴
chart_col.set_style(1)
worksheet.insert_chart('A10',chart_col,{'x_offset':25,'y_offset':10}) #放置图表位置
workbook.close()
生成图表如下图:
2、xlsxwriter模块常用功能介绍:
2.1、设置单元格的格式:
2.1.1、通过字典的方式直接设置格式:
workfomat = workbook.add_format({
'bold': True, #字体加粗
'border':1, #单元格边框宽度
'align': 'center', #对齐方式
'valign': 'vcenter', #字体对齐方式
'fg_color': '#F4B084', #单元格背景颜色
'text_wrap': True, # 是否自动换行
})
2.1.2、通过format对象的方式设置单元格格式。
workfomat = workbook.add_format()
workfomat.set_bold(1) #设置边框宽度
workfomat.set_num_format('0.00') #格式化数据格式为小数点后两位
workfomat.set_align('center') #设置对齐方式
workfomat.set_fg_color('blue') #设置单元格背景颜色
workfomat.set_bg_color('red') #设置单元格背景颜色 (经测试和上边的功能一样)
2.1.3、一些单元表的操作,像这样的操作还有好多,可以根据自己的需要去进行研究。
worksheet.merge_range('D1:D7','合并单元格') #合并单元格
worksheet.set_tab_color('red') #设置sheet标签颜色
worksheet.set_column('A:D',25) #设置A到D列的列宽为25
worksheet.write_formula('E2','=B2/C2') #设置表格中的计算,‘E2’是计算结果,'=B2/C2'是计算公式
# 写入单个单元格数据
# row:行, col:列, data:要写入的数据, bold:单元格的样式
worksheet1.write(row, col, data, bold)
# 写入一整行, A1:从A1单元格开始插入数据,按行插入, data:要写入的数据(格式为一个列表), bold:单元格的样式
worksheet1.write_row(“A1”,data,bold)
# 写入一整列 , A1:从A1单元格开始插入数据,按列插入, data:要写入的数据(格式为一个列表), bold:单元格的样式
worksheet1.write_column(“A1”,data,bold)
#插入图片, 第一个参数是插入的起始单元格,第二个参数是图片你文件的绝对路径
worksheet1.insert_image('A1','f:\\1.jpg')
#写入超链接
worksheet1.write_url(row, col, "internal:%s!A1" % ("要关联的工作表表名"), string="超链接显示的名字")
#插入图表
""" 参数中的type指的是图表类型,图表类型示例如下:[area:面积图,bar:条形图,column:直方图,
doughnut:环状图,line:折线图,pie:饼状图,scatter:散点图,radar:雷达图,stock:箱线图] """
workbook.add_chartsheet(type="")
# 获得当前excel文件的所有工作表
"""
workbook.worksheets() 用于获得当前工作簿中的所有工作表,
这个函数的存在便利了对于工作表的循环操作,
如果你想在当前工作簿的所有工作表的A1单元格中输入一个字符创‘Hello xlsxwriter’,
那么这个命令就派上用场了。
"""
workbook.worksheets()
# 关闭excel文件
"""
这个命令是使用xlsxwriter操作Excel的最后一条命令,一定要记得关闭文件。
"""
workbook.close()
2.2、常用图表类型:
#area:面积图
#bar:直方图
#colume:柱状图
#line:折线图
#pie:饼图
#doughnut:环形图
#sactter:散点图
#stock:股票趋势图
#radar:雷达图
3、示例代码解析
import xlsxwriter
workbook = xlsxwriter.Workbook('chart_data_table.xlsx') #可以生成.xls文件但是会报错
worksheet = workbook.add_worksheet('Sheet1') #工作页
#准备测试数据
bold = workbook.add_format({'bold': 1})
headings = ['Number', 'Batch 1', 'Batch 2']
data = [
[2, 3, 4, 5, 6, 7],
[10, 40, 50, 20, 10, 50],
[30, 60, 70, 50, 40, 30],
]
#插入数据
worksheet.write_row('A1', headings, bold)#行插入操作 注意这里的'A1'
worksheet.write_column('A2', data[0])#列插入操作 注意这里的'A2'
worksheet.write_column('B2', data[1])
worksheet.write_column('C2', data[2])
#插入直方图1
chart1 = workbook.add_chart({'type': 'column'})#选择 直方图 'column'
chart1.add_series({
'name': '=Sheet1!$B$1',
'categories': '=Sheet1!$A$2:$A$7',#X轴值(实在不知道怎么叫,就用XY轴表示)
'values': '=Sheet1!$B$2:$B$7',#Y轴值
'data_labels': {'value': True}#显示数字,就是直方图上面的数字,默认不显示
})
#注意上面写法 '=Sheet1!$B$2:$B$7' Sheet1是指定工作页, $A$2:$A$7是从A2到A7数据,熟悉excel朋友应该一眼就能认得出来
#插入直方图2
chart1.add_series({
'name': ['Sheet1', 0, 2],
'categories': ['Sheet1', 1, 0, 6, 0],
'values': ['Sheet1', 1, 2, 6, 2],
'data_labels': {'value': True}
})
chart1.set_title({'name': 'Chart with Data Table'}) # 直方图标题
chart1.set_x_axis({'name': 'Test number'}) # X轴描述
chart1.set_y_axis({'name': 'Sample length (mm)'})# Y轴描述
chart1.set_table()
chart1.set_style(3)#直方图类型
worksheet.insert_chart('D2', chart1, {'x_offset': 25, 'y_offset': 10}) #直方图插入到 D2位置
workbook.close()
4、添加数据到图表
chart.add_series() 可以帮助我们添加数据到图表,并且设置图表格式。
chart.add_series({
'categories': '=Sheet1!$A$1:$A$5',
'values': '=Sheet1!$B$1:$B$5',
'line': {'color': 'red'},
})
# 数字定位,第一行数字位置,第一列数字位置,最后一行数字位置,最后一列数字位置。
chart.add_series({
'categories': ['Sheet1', 0, 0, 4, 0],
'values': ['Sheet1', 0, 1, 4, 1],
'line': {'color': 'red'},
})
可以设置的系列选项是:
values
:这是系列中最重要的属性,是每个图表对象的唯一必需选项。此选项将图表与其显示的工作表数据相链接。可以使用上面第一个示例中所示的公式或使用第二个示例中所示的值列表来设置数据范围。
categories
:这将设置图表类别标签。该类别与X轴大致相同。在大多数图表类型中,该categories
属性是可选的,图表将仅假设一个顺序系列 1..n
。
name
:设置系列的名称。名称显示在公式栏中。对于非饼图/圆环图,它也会显示在图例中。name属性是可选的。
line
:设置系列线型的属性,如颜色和宽度。
border
:设置系列的边框属性,如颜色和样式。
fill
:设置系列的实心填充属性,例如颜色。
pattern
:设置系列的图案填充属性。
gradient
:设置系列的渐变填充属性。
marker
:设置系列标记的属性,如样式和颜色。
trendline
:设置系列趋势线的属性,如线性,多项式和移动平均类型。
smooth
:设置线系列的平滑属性。
y_error_bars
:设置图表系列的垂直误差范围。
x_error_bars
:设置图表系列的水平误差范围。
data_labels
:设置系列的数据标签。
points
:设置系列中各个点的属性。
invert_if_negative
:反转负值的填充颜色。通常仅适用于柱形图和条形图。
overlap
:在条形图/柱形图中设置系列之间的重叠。范围是+/- 100.默认值为0。
gap
:在条形图/柱形图中设置系列之间的间隙。范围是0到500.默认值是150。
可以在图表中添加多个系列。
chart.add_series({
'categories': '=Sheet1!$A$1:$A$5',
'values': '=Sheet1!$B$1:$B$5',
'gap': 200,
})
4.1 设置X轴Y轴(行列)属性
#设置Y轴属性同X轴
chart.set_x_axis({
'name': 'Earnings per Quarter',
'name_font': {'size': 14, 'bold': True},
'num_font': {'italic': True },
})
name
:设置轴的名称(也称为标题或标题)。名称显示在X轴下方。
name_font
:设置轴名称的字体属性。
name_layout
:以图表相对单位设置轴标题的位置。
name_font
:设置轴编号的字体属性。
line
:设置轴线类型的属性,例如颜色和宽度。
fill
:设置轴的实心填充属性,例如颜色。
pattern
:设置轴的图案填充属性。
gradient
:设置轴的渐变填充属性。
min
:设置轴范围的最小值。(仅适用于数值和日期轴)
max
:设置轴范围的最大值。(仅适用于数值和日期轴)
minor_unit
:设置轴单位范围内次要单位的增量。(仅适用于数值和日期轴)
major_unit
:设置轴范围内主要单位的增量。(仅适用于数值和日期轴)
interval_unit
:设置类别轴的间隔单位。应该是一个整数值。(仅适用于类别轴)
interval_tick
:设置类别轴的滴答间隔。应该是一个整数值。(仅适用于类别轴)
crossing
:设置y轴穿过x轴的位置。(适用于所有轴)
position_axis
:将轴定位在轴刻度标记上或之间。(仅适用于类别轴)
reverse
:反转轴类别或值的顺序。(适用于类别,日期和数值轴)
label_position
:设置轴的“轴标签”位置。可以使用以下位置:next_to (the default) ,high, low, none
label_align
:将“轴标签”与轴对齐。(仅适用于类别轴)center (the default), right, left
major_gridlines
:配置轴的主要网格线。可用的属性是:visible, line
visible
:配置轴的可见性
date_axis
:此选项用于将具有日期或时间数据的类别轴视为日期轴。
text_axis
:此选项用于将类别轴明确视为文本轴。
minor_tick_mark
:将轴次要刻度标记类型/位置设置为以下值之一,none, inside, outside, cross (inside and outside)
display_units
:设置轴的显示单位。hundreds、 thousands、 ten_thousands、 hundred_thousands、 millions、 ten_millions、 hundred_millions、 billions、 trillions。
chart.set_x_axis({'name': 'Earnings per Quarter'})
chart.set_x_axis({'name_font': {'bold': True, 'italic': True}})
chart.set_x_axis({
'name': 'X axis',
'name_layout': {
'x': 0.34,
'y': 0.85,
}
})
chart.set_x_axis({'name_font': {'bold': True, 'italic': True}})
chart.set_x_axis({'num_format': '#,##0.00'})
chart.set_y_axis({'num_format': '0.00%'})
chart.set_x_axis({'line': {'none': True}})
chart.set_x_axis({'min': 3, 'max': 6})
chart.set_x_axis({'minor_unit': 0.4, 'major_unit': 2})
chart.set_x_axis({'interval_unit': 5})
chart.set_x_axis({'interval_tick': 2})
chart.set_x_axis({'crossing': 3})
chart.set_y_axis({'crossing': 'max'})
chart.set_x_axis({'position_axis': 'on_tick'})
chart.set_x_axis({'position_axis': 'between'})
chart.set_x_axis({'reverse': True})
chart.set_x_axis({'label_position': 'high'})
chart.set_y_axis({'label_position': 'low'})
chart.set_x_axis({'label_align': 'left'})
chart.set_x_axis({
'major_gridlines': {
'visible': True,
'line': {'width': 1.25, 'dash_type': 'dash'}
},
})
chart.set_y_axis({'visible': False})
chart.set_x_axis({'text_axis': True})
chart.set_x_axis({'major_tick_mark': 'none',
'minor_tick_mark': 'inside'})
chart.set_x_axis({'display_units': 'thousands'})
chart.set_y_axis({'display_units': 'millions'})
4.2 设置图表辅助X轴(或Y轴):
chart.set_x2_axis() #和x轴的属性设置相同。
4.3 合并两个不同类型的图表
图表 combine()
方法用于组合两个不同类型的图表,例如 柱状图 和 折线图 :
# 第一种图表类型
column_chart = workbook.add_chart({'type': 'column'})
column_chart.add_series({...})
# 第二种图表类型
line_chart = workbook.add_chart({'type': 'line'})
line_chart.add_series({...})
# 合并图表
column_chart.combine(line_chart)
4.4 设置图标尺寸
set_size()
方法用于设置图表的尺寸。width, height, x_scale, y_scale, x_offset, y_offset。
在 width
和 height
以像素为单位。默认图表宽度x高度为480 x 288像素。可以通过设置width
和height
或通过设置x_scale
和来修改图表的大小 y_scale
:
chart.set_size({'width': 720, 'height': 576})
# 两者一样
chart.set_size({'x_scale': 1.5, 'y_scale': 2})
worksheet.insert_chart('E2', chart, {'x_offset': 25, 'y_offset': 10})
4.5 设置图表标题
该 set_title()
方法用于设置图表标题的属性。
name
:设置图表的名称(标题)。名称显示在图表上方。名称也可以是公式,例如,=Sheet1!$A$1
包含工作表名称,行和列的列表。name属性是可选的。
name_font
:设置图表标题的字体属性。
overlay
:允许标题覆盖在图表上。通常与下面的布局属性一起使用。
layout
:以图表相对单位设置标题的位置:(x, y)
none
:默认情况下,Excel会为具有单个系列和用户定义的系列名称的图表添加自动图表标题。该none
选项会关闭此默认标题。它还会关闭所有其他set_title()
选项。
chart.set_title({'name': 'Year End Results'})
chart.set_title({
'name': 'Title',
'overlay': True,
'layout': {
'x': 0.42,
'y': 0.14,
}
})
chart.set_title({'none': True})
4.6 设置图表图例选项
该set_legend()
方法用于设置图表图例的属性。
none
:在Excel图表中,默认情况下图例处于启用状态。该none
选项会关闭图表图例
position
:设置图表图例的位置:
font
:设置图表图例的字体属性。
border
:设置图例的边框属性,例如颜色和样式。
fill
:设置图例的实心填充属性,例如颜色。
pattern
:设置图例的图案填充属性。
gradient
:设置图例的渐变填充属性。
delete_series
:这允许您从图例中删除一个或多个系列(系列仍将显示在图表上)。
chart.set_legend({'none': True})
chart.set_legend({'position': 'none'})
chart.set_legend({'position': 'bottom'})
chart.set_legend({'font': {'size': 9, 'bold': True}})
chart.set_legend({'delete_series': [0, 2]})
layout
:以图表相对单位设置图例的位置:(x, y)
chart.set_legend({
'layout': {
'x': 0.80,
'y': 0.37,
'width': 0.12,
'height': 0.25,
}
})
4.7 设置图表区域
该set_chartarea()
方法用于设置图表区域的属性。在Excel中,图表区域是图表背后的背景区域。
border
:设置图表区域的边框属性,例如颜色和样式。
fill
:设置图表区域的实心填充属性,例如颜色。
pattern
:设置图表区域的图案填充属性。
gradient
:设置图表区域的渐变填充属性。
chart.set_chartarea({
'border': {'none': True},
'fill': {'color': 'red'}
})
4.8设置绘图区域
该set_plotarea()
方法用于设置图表的绘图区域的属性。
border
:设置plotarea的边框属性,如颜色和样式。
fill
:设置plotarea的实心填充属性,例如颜色。
pattern
:设置plotarea的图案填充属性。
gradient
:设置plotarea的渐变填充属性。
layout
:以图表相对单位设置plotarea 的位置:(x, y)
chart.set_plotarea({
'border': {'color': 'red', 'width': 2, 'dash_type': 'dash'},
'fill': {'color': '#FFFFC2'}
})
4.9 设置图表样式类型
set_style()
方法用于将图表的样式设置为Excel中“设计”选项卡上可用的48种内置样式之一:
chart.set_style(37)
4.10 设置轴数据表的属性
set_table()
方法在水平轴下方添加一个数据表,数据表只能显示条形图,柱形图,折线图,面积图和股票图。
chart.set_table()
4.11 其他图表设置
设置图表上下栏的属性,set_up_down_bars(),上下栏只能应用于折线图和股票图表。添加fill
,pattern
或 gradient
和border。
chart.set_up_down_bars({
'up': {
'fill': {'color': '#00B050'},
'border': {'color': 'black'}
},
'down': {
'fill': {'color': 'red'},
'border': {'color': 'black'},
},
})
正在上传…重新上传取消
设置图表下拉线的属性,set_drop_lines()
chart.set_drop_lines({'line': {'color': 'red',
'dash_type': 'square_dot'}})
设置图表高低线的属性,set_high_low_lines()
chart.set_high_low_lines({
'line': {
'color': 'red',
'dash_type': 'square_dot'
}
})
设置在图表中显示空白数据,show_blanks_as()
chart.show_blanks_as('span')