1.excel介紹
Excel是當今最流行的電子表格處理軟件,支持豐富的計算函數及 圖表,在系統運營方面廣泛用于運營數據報表,比如業務質量、資源利 用、安全掃描等報表,同時也是應用系統常見的文件導出格式,以便數 據使用人員做進一步加工處理。本節主要講述利用Python操作Excel的模 塊XlsxWriter(https://xlsxwriter.readthedocs.org),可以操作多個工作表 的文字、數字、公式、圖表等。XlsxWriter模塊具有以下功能: ·100%兼容的Excel XLSX文件,支持Excel 2003、Excel 2007等版 本; ·支持所有Excel單元格數據格式; ·單元格合并、批注、自動篩選、豐富多格式字符串等; ·支持工作表PNG、JPEG圖像,自定義圖表; ·內存優化模式支持寫入大文件。
2.XlsxWriter模塊的安裝方法
3.一個簡單示例
下面通過一個簡單的功能演示示例,實現插入文字(中英字 符)、數字(求和計算)、圖片、單元格格式等,代碼如下:?
【/home/test/XlsxWriter/simple1.py】
?
#
_*_coding:utf-8_*_
#
****************************************************************#
#
ScriptName: simple01.py
#
Author: BenjaminYang
#
Create Date: 2019-06-02 02:37
#
Modify Author: BenjaminYang
#
Modify Date: 2019-06-02 02:37
#
Function:
#
***************************************************************#
#
!/usr/bin/python
import
xlsxwriter
workbook
=xlsxwriter.Workbook(
'
demo1.xlsx
'
)
#
創建一個Excel文件
worksheet=workbook.add_worksheet()
#
創建一個工作表對象
worksheet.set_column(
'
A:A
'
,20)
#
設定第一列(A)寬度為20像素
bold=workbook.add_format({
'
bold
'
:True})
#
定義一個加粗的格式對象
worksheet.write(
'
A1
'
,
'
Hello
'
)
#
A1單元格寫入'Hello'
worksheet.write(
'
A2
'
,
'
World
'
,bold)
#
A2單元格寫入‘World’并引用加粗格式對象bold
worksheet.write(
'
B2
'
,U
'
中文測試
'
,bold)
#
A2單元格寫入中文并引用加粗格式對象bold
worksheet.write(2,0,32)
#
用行列表示法寫入數字32
worksheet.write(3,0,35.5)
#
行列表示法的單元格下標以0作為起始值,'3,0'等價于'A3'
worksheet.write(4,0,
'
=SUM(A3:A4)
'
)
#
求A3:A4的和,并將結果寫入'4,0',即'A5'
worksheet.insert_image(
'
B5
'
,
'
img/python.jpg
'
)
#
在B5單元格插入圖片
workbook.close()
#
關閉Excel文件
?
4.模塊常用方法說明
1.Workbook類
Workbook類定義:Workbook(filename[,options]),該類實現創 建一個XlsxWriter的Workbook對象。Workbook類代表整個電子表格文 件,并且存儲在磁盤上。參數filename(String類型)為創建的Excel文件 存儲路徑;參數options(Dict類型)為可選的Workbook參數,一般作為 初始化工作表內容格式,例如值為{'strings_to_numbers':True}表示使用 worksheet.write()方法時激活字符串轉換數字。 ·add_worksheet([sheetname])方法,作用是添加一個新的工作 表,參數sheetname(String類型)為可選的工作表名稱,默認為
Sheet1。例如,下面的代碼對應的效果圖如圖3-2所示。
?
#
_*_coding:utf-8_*_
#
****************************************************************#
#
ScriptName: simple02.py
#
Author: BenjaminYang
#
Create Date: 2019-06-02 02:58
#
Modify Author: BenjaminYang
#
Modify Date: 2019-06-02 02:58
#
Function:
#
***************************************************************#
#
!/usr/bin/python
import
xlsxwriter
workbook
=xlsxwriter.Workbook(
'
demo2.xlsx
'
)
worksheet1
=workbook.add_worksheet()
#
sheet1
worksheet2=workbook.add_worksheet(
'
Foglio2
'
)
#
Foglio2
worksheet3=workbook.add_worksheet(
'
Data
'
)
#
Data
worksheet4=workbook.add_worksheet()
#
sheet4
workbook.close()
?
·add_format([properties])方法,作用是在工作表中創建一個新的 格式對象來格式化單元格。參數properties(dict類型)為指定一個格式 屬性的字典,例如設置一個加粗的格式對象, workbook.add_format({'bold':True})。通過Format methods(格式化 方法)也可以實現格式的設置,等價的設置加粗格式代碼如下:
bold =
workbook.add_format()
bold.set_bold()
·add_chart(options)方法,作用是在工作表中創建一個圖表對 象,內部是通過insert_chart()方法來實現,參數options(dict類型)為 圖表指定一個字典屬性,例如設置一個線條類型的圖表對象,代碼為 chart=workbook.add_chart({'type':'line'})。
·close()方法,作用是關閉工作表文件,如workbook.close()。?
?
2.Worksheet類
Worksheet類代表了一個Excel工作表,是XlsxWriter模塊操作Excel
內容最核心的一個類,例如將數據寫入單元格或工作表格式布局等。
Worksheet對象不能直接實例化,取而代之的是通過Workbook對象調用 add_worksheet()方法來創建。Worksheet類提供了非常豐富的操作 Excel內容的方法,其中幾個常用的方法如下:
·write(row,col,*args)方法,作用是寫普通數據到工作表的單 元格,參數row為行坐標,col為列坐標,坐標索引起始值為0;*args無 名字參數為數據內容,可以為數字、公式、字符串或格式對象。為了簡 化不同數據類型的寫入過程,write方法已經作為其他更加具體數據類型 方法的別名,包括:
·write_string()寫入字符串類型數據,如:
worksheet.write_string(0, 0,
'
Your text here
'
);
·write_number()寫入數字類型數據,如:
worksheet.write_number(
'
A2
'
, 2.3451);
·write_blank()寫入空類型數據,如:
worksheet.write(
'
A2
'
, None);
·write_formula()寫入公式類型數據,如:
worksheet.write_formula(2, 0,
'
=SUM(B1:B5)
'
);
·write_datetime()寫入日期類型數據,如:
worksheet.write_datetime(7, 0,datetime.datetime.strptime(
'
2013-01-23
'
,
'
%Y-%m-%d
'
),workbook.add_format({
'
num_format
'
:
'
yyyy-mm-dd
'
}));
·write_boolean()寫入邏輯類型數據,如:
worksheet.write_boolean(0, 0, True);
·write_url()寫入超鏈接類型數據,如:
worksheet.write_url(
'
A1
'
,
'
ftp://www.python.org/
'
)
下列通過具體的示例來觀察別名write方法與數據類型方法的對應 關系,代碼如下:
worksheet.write(0, 0,
'
Hello
'
)
#
write_string()
worksheet.write(1, 0,
'
World
'
)
#
write_string()
worksheet.write(2, 0, 2)
#
write_number()
worksheet.write(3, 0, 3.00001)
#
write_number()
worksheet.write(4, 0,
'
=SIN(PI()/4)
'
)
#
write_formula()
worksheet.write(5, 0,
''
)
#
write_blank()
worksheet.write(6, 0, None)
#
write_blank()
?
·set_row(row,height,cell_format,options)方法,作用是設置 行單元格的屬性。參數row(int類型)指定行位置,起始下標為0;參數 height(float類型)設置行高,單位像素;參數cell_format(format類 型)指定格式對象;參數options(dict類型)設置行hidden(隱藏)、 level(組合分級)、collapsed(折疊)。操作示例如下:
worksheet.write(
'
A1
'
,
'
Hello
'
)
#
在A1單元格寫入'Hello'字符串
cell_format = workbook.add_format({
'
bold
'
: True})
#
定義一個加粗的格式對象
worksheet.set_row(0, 40, cell_format)
#
設置第1行單元格高度為40像素,且引用 加粗格式對象
worksheet.set_row(1, None, None, {
'
hidden
'
: True})
#
隱藏第2行單元格
·set_column(first_col,last_col,width,cell_format,options)方 法,作用為設置一列或多列單元格屬性。參數first_col(int類型)指定 開始列位置,起始下標為0;參數last_col(int類型)指定結束列位置, 起始下標為0,可以設置成與first_col一樣;參數width(float類型)設置 列寬;參數cell_format(Format類型)指定格式對象;參數options(dict 類型)設置行hidden(隱藏)、level(組合分級)、collapsed(折 疊)。操作示例如下:
worksheet.write(
'
A1
'
,
'
Hello
'
)
#
在A1單元格寫入'Hello'字符串
worksheet.write(
'
B1
'
,
'
World
'
)
#
在B1單元格寫入'World'字符串
cell_format = workbook.add_format({
'
bold
'
: True})
#
定義一個加粗的格式對象
worksheet.set_column(0,1, 10,cell_format)
#
設置0到1即(A到B) 列單元格寬度為10像素,且引用加粗格式對象
worksheet.set_column(
'
C:D
'
, 20)
#
設置C到D列單元格寬度為20像素
worksheet.set_column(
'
E:G
'
, None, None, {
'
hidden
'
: 1})
#
隱藏E到G列單 元格
·insert_image(row,col,image[,options])方法,作用是插入圖 片到指定單元格,支持PNG、JPEG、BMP等圖片格式。參數row為行坐 標,col為列坐標,坐標索引起始值為0;參數image(string類型)為圖 片路徑;參數options(dict類型)為可選參數,作用是指定圖片的位 置、比例、鏈接URL等信息。操作示例如下:
#
在B5單元格插入python-logo.png圖片,圖片超級鏈接為http://python.org
worksheet.insert_image(
'
B5
'
,
'
img/python-logo.png
'
, {
'
url
'
:
'
http://python.org
'
})
5.Chart類
Chart類實現在XlsxWriter模塊中圖表組件的基類,支持的圖表類型 包括面積、條形圖、柱形圖、折線圖、餅圖、散點圖、股票和雷達等,
一個圖表對象是通過Workbook(工作簿)的add_chart方法創建,通過 {type,'圖表類型'}字典參數指定圖表的類型,語句如下:
chart = workbook.add_chart({type,
'
column
'
})
#
創建一個column(柱形)圖表
·area:創建一個面積樣式的圖表;
·bar:創建一個條形樣式的圖表;
·column:創建一個柱形樣式的圖表;
·line:創建一個線條樣式的圖表;
·pie:創建一個餅圖樣式的圖表;
·scatter:創建一個散點樣式的圖表;
·stock:創建一個股票樣式的圖表;
·radar:創建一個雷達樣式的圖表。
然后再通過Worksheet(工作表)的insert_chart()方法插入到指 定位置,語句如下:
worksheet.insert_chart(
'
A7
'
, chart)
#
在A7單元格插入圖表
下面介紹chart類的幾個常用方法。
·chart.add_series(options)方法,作用為添加一個數據系列到圖 表,參數options(dict類型)設置圖表系列選項的字典,操作示例如 下:
chart.add_series({
'
categories
'
:
'
=Sheet1!$A$1:$A$5
'
,
'
values
'
:
'
=Sheet1!$B$1:$B$5
'
,
'
line
'
:{
'
color
'
:
'
red
'
}
})
add_series方法最常用的三個選項為categories、values、line,其中 categories作為是設置圖表類別標簽范圍;values為設置圖表數據范圍;
line為設
·其他常用方法及示例。
·set_x_axis(options)方法,設置圖表X軸選項,示例代碼如 下,效果圖如圖3-7所示。
置圖表線條屬性,包括顏色、寬度等。
chart.set_x_axis({
'
name
'
:
'
Earnings per Quarter
'
,
#
設置X軸標題名稱
'
name_font
'
:{
'
size
'
:14,
'
bold
'
:True},
#
設置X軸標題字體屬性
'
num_font
'
:{
'
italic
'
:True }
#
設置X軸數字字體屬性
})
·set_size(options)方法,設置圖表大小,如 chart.set_size({'width':720,'height':576}),其中width為寬度, height為高度。?
·set_title(options)方法,設置圖表標題,如 chart.set_title({'name':'Year End Results'})
·set_style(style_id)方法,設置圖表樣式,style_id為不同數字 則代表不同樣式,如chart.set_style(37)
·set_table(options)方法,設置X軸為數據表格形式,如 chart.set_table()
整合
#
!/usr/bin/python
import
xlsxwriter
workbook
=xlsxwriter.Workbook(
'
demo3.xlsx
'
)
worksheet
=
workbook.add_worksheet()
chart
= workbook.add_chart({
'
type
'
:
'
column
'
})
#
創建一個column(柱形圖表)
worksheet.insert_chart(
'
A7
'
,chart)
#
在A7單元格插入圖表
chart.add_series({
'
categories
'
:
'
=Sheet1!$A$1:$A$5
'
,
'
values
'
:
'
=Sheet1!$B$1:$B$5
'
,
'
line
'
:{
'
color
'
:
'
red
'
}
})
chart.set_x_axis({
'
name
'
:
'
Earnings per Quarter
'
,
#
設置X軸標題名稱
'
name_font
'
:{
'
size
'
:14,
'
bold
'
:True},
#
設置X軸標題字體屬性
'
num_font
'
:{
'
italic
'
:True }
#
設置X軸數字字體屬性
})
chart.set_size({
'
width
'
:720,
'
height
'
:576
})
chart.set_title({
'
name
'
:
'
Year End Results
'
})
chart.set_style(
37
)
workbook.close()
?
報錯:可能是版本原因需要做如下的操作
?#vi /usr/lib/python2.7/site-packages/xlsxwriter/vi __init__.py
import
sys
reload(sys)
sys.setdefaultencoding(
"
utf-8
"
)
執行效果
?
6.定制自動化業務流量報表周報
本次實踐通過定制網站5個頻道的流量報表周報,通過XlsxWriter 模塊將流量數據寫入Excel文檔,同時自動計算各頻道周平均流量,再 生成數據圖表。具體是通過workbook.add_chart({'type':'column'})方 法指定圖表類型為柱形,使用write_row、write_column方法分別以行、 列方式寫入數據,使用add_format()方法定制表頭、表體的顯示風 格,使用add_series()方法將數據添加到圖表,同時使用 chart.set_size、set_title、set_y_axis設置圖表的大小及標題屬性,最后通 過insert_chart方法將圖表插入工作表中。
【/home/test/XlsxWriter/simple4.py】
?
#
_*_coding:utf-8_*_
#
****************************************************************#
#
ScriptName: simple04.py
#
Author: BenjaminYang
#
Create Date: 2019-06-02 05:17
#
Modify Author: BenjaminYang
#
Modify Date: 2019-06-02 05:17
#
Function:
#
***************************************************************#
#
!/usr/bin/python
import
xlsxwriter
workbook
=xlsxwriter.Workbook(
'
chart.xlsx
'
)
#
創建一個Excel文件
worksheet=workbook.add_worksheet()
#
創建一個工作表對象
chart=workbook.add_chart({
'
type
'
:
'
column
'
})
#
創建一個圖表對象
#
定義數據表頭列表
title=[u
'
業務名稱
'
,u
'
星期一
'
,u
'
星期二
'
,u
'
星期三
'
,u
'
星期四
'
,u
'
星期五
'
,u
'
星期 六
'
,u
'
星期日
'
,u
'
平均流量
'
]
buname
=[u
'
業務官網
'
,u
'
新聞中心
'
,u
'
購物頻道
'
,u
'
體育頻道
'
,u
'
親子頻道
'
]
#
定義頻 道名稱
#
定義5頻道一周7天流量數據列表
data=
[
[
150,152,158,149,155,145,148
],
[
89,88,95,93,98,100,99
],
[
201,200,198,175,170,198,195
],
[
75,77,78,78,74,70,79
],
[
88,85,87,90,93,88,84
],
]
format
=workbook.add_format()
#
定義format格式對象
format.set_border(1)
#
定義format對象單元格邊框加粗(1像素)的格式
format_title=workbook.add_format()
#
定義format_title格式對象
format_title.set_border(1)
#
定義format_title對象單元格邊框加粗(1像素)的格式
format_title.set_bg_color(
'
#cccccc
'
)
#
定義format_title對象單元格背景顏色為 #cccccc
format_title.set_align(
'
center
'
)
#
定義format_title對象單元格居中對齊的格式
format_title.set_bold()
#
定義format_title對象單元格內容加粗的格式
format_ave=workbook.add_format()
#
定義format_ave格式對象
format_ave.set_border(1)
#
定義format_ave對象單元格邊框加粗(1像素)的格式
format_ave.set_num_format(
'
0.00
'
)
#
定義format_ave對象單元格數字類別顯示格式
#
下面分別以行或列寫入方式將標題、業務名稱、流量數據寫入起初單元格,同時引用不同格式對象
worksheet.write_row(
'
A1
'
,title,format_title) #第一行標題
worksheet.write_column(
'
A2
'
,buname,format) #第一列從A2單元格開始對應頻道
worksheet.write_row(
'
B2
'
,data[0],format) #第二行從B2開始對應data[0]
worksheet.write_row(
'
B3
'
,data[1
],format) #第三行從B3開始對應data[1]
worksheet.write_row(
'
B4
'
,data[2
],format) #第四行從B4開始對應data[2]
worksheet.write_row(
'
B5
'
,data[3
],format) #第五行從B5開始對應data[3]
worksheet.write_row(
'
B6
'
,data[4
],format) #第六行從B6開始對應data[4]
#
定義圖表數據系列函數
def
chart_series(cur_row):
worksheet.write_formula(
'
I
'
+
cur_row,\
'
=AVERAGE(B
'
+cur_row+
'
:H
'
+cur_row+
'
)
'
,format_ave)
#
計算(AVERAGE 函數)頻道周平均流量
chart.add_series({
'
categories
'
:
'
=Sheet1!$B$1:$H$1
'
,
#
將“星期一至星期日”作為圖表數據 標簽(X軸)
'
values
'
:
'
=Sheet1!$B$
'
+cur_row+
'
:$H$
'
+cur_row,
#
頻道一周 所有數據作為數據區域
'
line
'
:{
'
color
'
:
'
black
'
},
#
線條顏色定義為black(黑色)
'
name
'
:
'
Sheet1!$A$
'
+cur_row,
#
引用業務名稱為圖例項
})
for
row
in
range(2,7):
#
數據域以第2~6行進行圖表數據系列函數調用
chart_series(str(row))
#
chart.set_table() #設置X軸表格格式,本示例不啟用
#
chart.set_style(30) #設置圖表樣式,本示例不啟用
chart.set_size({
'
width
'
:577,
'
height
'
:287})
#
設置圖表大小
chart.set_title({
'
name
'
:u
'
業務流量周報圖表
'
})
#
設置圖表(上方)大標題
chart.set_y_axis({
'
name
'
:
'
Mb/s
'
})
#
設置y軸(左側)小標題
worksheet.insert_chart(
'
A8
'
,chart)
#
在A8單元格插入圖表
workbook.close()
#
關閉Excel文檔
?
?
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061
微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元

