Excel是當今最流行的電子表格處理軟件,支持豐富的計算函數及 圖表,在系統運營方面普遍用於運營數據報表,好比業務質量、資源利 用、安全掃描等報表,同時也是應用系統常見的文件導出格式,以便數 據使用人員作進一步加工處理。本節主要講述利用Python操做Excel的模 塊XlsxWriter(https://xlsxwriter.readthedocs.org),能夠操做多個工做表 的文字、數字、公式、圖表等。XlsxWriter模塊具備如下功能: ·100%兼容的Excel XLSX文件,支持Excel 200三、Excel 2007等版 本; ·支持全部Excel單元格數據格式; ·單元格合併、批註、自動篩選、豐富多格式字符串等; ·支持工做表PNG、JPEG圖像,自定義圖表; ·內存優化模式支持寫入大文件。 python
下面經過一個簡單的功能演示示例,實現插入文字(中英字 符)、數字(求和計算)、圖片、單元格格式等,代碼以下: 安全
【/home/test/XlsxWriter/simple1.py】python2.7
#_*_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文件
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()。 字體
Worksheet類表明了一個Excel工做表,是XlsxWriter模塊操做Excel
內容最核心的一個類,例如將數據寫入單元格或工做表格式佈局等。 優化
Worksheet對象不能直接實例化,取而代之的是經過Workbook對象調用 add_worksheet()方法來建立。Worksheet類提供了很是豐富的操做 Excel內容的方法,其中幾個經常使用的方法以下: 網站
·write(row,col,*args)方法,做用是寫普通數據到工做表的單 元格,參數row爲行座標,col爲列座標,座標索引發始值爲0;*args無 名字參數爲數據內容,能夠爲數字、公式、字符串或格式對象。爲了簡 化不一樣數據類型的寫入過程,write方法已經做爲其餘更加具體數據類型 方法的別名,包括: url
·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'})
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")
執行效果
本次實踐經過定製網站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文檔