最近遇到一個情景,就是按期生成併發送服務器使用狀況報表,按照不一樣維度統計,涉及python對excel的操做,上網蒐羅了一番,大多大同小異,並且不太能知足需求,不過通過一番對源碼的"研究"(用此一詞讓我以爲很有成就感)以後,基本解決了平常所需。主要記錄使用過程的常見問題及解決。python
python操做excel主要用到xlrd和xlwt這兩個庫,即xlrd是讀excel,xlwt是寫excel的庫。可從這裏下載https://pypi.python.org/pypi。下面分別記錄python讀和寫excel.數組
python讀excel——xlrd服務器
這個過程有幾個比較麻煩的問題,好比讀取日期、讀合併單元格內容。下面先看看基本的操做:併發
首先讀一個excel文件,有兩個sheet,測試用第二個sheet,sheet2內容以下:app
python 對 excel基本的操做以下:函數
?測試
1字體 2spa 3.net 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
|
運行結果以下:
那麼問題來了,上面的運行結果中紅框框中的字段明明是出生日期,可顯示的確實浮點數。好的,來解決第一個問題:
一、python讀取excel中單元格內容爲日期的方式
python讀取excel中單元格的內容返回的有5種類型,即上面例子中的ctype:
1 |
|
即date的ctype=3,這時須要使用xlrd的xldate_as_tuple來處理爲date格式,先判斷表格的ctype=3時xldate才能開始操做。如今命令行看下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
|
便可以作下簡單處理,判斷ctype是否等於3,若是等於3,則用時間格式處理:
1 2 3 |
|
那麼問題又來了,上面 sheet2.cell(2,4).ctype 返回的值是0,說明這個單元格的值是空值,明明是合併的單元格內容"好朋友",這個是我以爲這個包功能不完善的地方,若是是合併的單元格那麼應該合併的單元格的內容同樣,可是它只是合併的第一個單元格的有值,其它的爲空。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
|
二、讀取合併單元格的內容
這個是真沒技巧,只能獲取合併單元格的第一個cell的行列索引,才能讀到值,讀錯了就是空值。
即合併行單元格讀取行的第一個索引,合併列單元格讀取列的第一個索引,如上述,讀取行合併單元格"好朋友"和讀取列合併單元格"暫無"只能以下方式:
1 2 3 4 5 6 7 |
|
疑問又來了,合併單元格可能出現空值,可是表格自己的普通單元格也多是空值,要怎麼獲取單元格所謂的"第一個行或列的索引"呢?
這就要先知道哪些是單元格是被合併的!
三、獲取合併的單元格
讀取文件的時候須要將formatting_info參數設置爲True,默認是False,因此上面獲取合併的單元格數組爲空,
1 2 3 4 |
|
merged_cells返回的這四個參數的含義是:(row,row_range,col,col_range),其中[row,row_range)包括row,不包括row_range,col也是同樣,即(1, 3, 4, 5)的含義是:第1到2行(不包括3)合併,(7, 8, 2, 5)的含義是:第2到4列合併。
利用這個,能夠分別獲取合併的三個單元格的內容:
1 2 3 4 5 6 |
|
發現規律了沒?是的,獲取merge_cells返回的row和col低位的索引便可! 因而能夠這樣一勞永逸:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
|
python寫excel——xlwt
寫excel的難點可能不在構造一個workbook的自己,而是填充的數據,不過這不在範圍內。在寫excel的操做中也有棘手的問題,好比寫入合併的單元格就是比較麻煩的,另外寫入還有不一樣的樣式。這些要看源碼才能研究的透。
我"構思"了以下面的sheet1,即要用xlwt實現的東西:
基本上看起來還算複雜,並且看起來"很正規",徹底是我的杜撰。
代碼以下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 |
|
須要稍做解釋的就是write_merge方法:
write_merge(x, x + m, y, w + n, string, sytle)
x表示行,y表示列,m表示跨行個數,n表示跨列個數,string表示要寫入的單元格內容,style表示單元格樣式。其中,x,y,w,h,都是以0開始計算的。
這個和xlrd中的讀合併單元格的不太同樣。
如上述:sheet1.write_merge(21,21,0,1,u'合計',set_style('Times New Roman',220,True))
即在22行合併第1,2列,合併後的單元格內容爲"合計",並設置了style。
若是須要建立多個sheet,則只要f.add_sheet便可。
如在上述write_excel函數裏f.save('demo1.xlsx') 這句以前再建立一個sheet2,效果以下:
代碼也是真真的easy的了:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
|