Python讀寫Excel表格,簡單粗暴又好用

image.png

最近在做一些數(shù)據(jù)處理和計算的工作,因為數(shù)據(jù)是以.CSV格式保存的,因此剛開始直接用Excel來處理。

但是做著做著發(fā)現(xiàn)重復的勞動,其實并沒有多大的意義,于是就想著寫個小工具幫著處理。

以前正好在一本書上看到過,使用Python來處理Excel表格,可惜沒有仔細看。

于是我到處查找資料,基本解決了日常所需,終于算是完成了任務,因此撰寫此文就算是總結吧,主要記錄使用過程的常見問題及解決。

Python操作Excel,主要用到xlrd和xlwt這兩個庫,即xlrd是讀Excel,xlwt是寫Excel的庫。

可從這里下載https://pypi.python.org/pypi。下面分別記錄Python讀和寫Excel。

  • Python寫Excel——xlwt

Python寫Excel的難點,不在構造一個Workbook的本身,而是填充的數(shù)據(jù),不過這不在范圍內(nèi)。

在寫Excel的操作中,也有棘手的問題,比如寫入合并的單元格,就是比較麻煩的,另外寫入還有不同的樣式。

詳細代碼如下:

import xlwt

#設置表格樣式
def set_style(name,height,bold=False):
    style = xlwt.XFStyle()
    font = xlwt.Font()
    font.name = name
    font.bold = bold
    font.color_index = 4
    font.height = height
    style.font = font
    return style

#寫Excel
def write_excel():
    f = xlwt.Workbook()
    sheet1 = f.add_sheet('學生',cell_overwrite_ok=True)
    row0 = ["姓名","年齡","出生日期","愛好"]
    colum0 = ["張三","李四","戀習Python","小明","小紅","無名"]
    #寫第一行
    for i in range(0,len(row0)):
        sheet1.write(0,i,row0[i],set_style('Times New Roman',220,True))
    #寫第一列
    for i in range(0,len(colum0)):
        sheet1.write(i+1,0,colum0[i],set_style('Times New Roman',220,True))

    sheet1.write(1,3,'2006/12/12')
    sheet1.write_merge(6,6,1,3,'未知')#合并行單元格
    sheet1.write_merge(1,2,3,3,'打游戲')#合并列單元格
    sheet1.write_merge(4,5,3,3,'打籃球')

    f.save('test.xls')

if __name__ == '__main__':
    write_excel()

結果圖:

image.png

在此,對write_merge()的用法稍作解釋,如上述:sheet1.write_merge(1,2,3,3,'打游戲'),即在四列合并第2,3列,合并后的單元格內(nèi)容為"合計",并設置了style。其中,里面所有的參數(shù)都是以0開始計算的。

  • Python讀Excel——xlrd
    Python讀取Excel表格,相比xlwt來說,xlrd提供的接口比較多,但過程也有幾個比較麻煩的問題,比如讀取日期、讀合并單元格內(nèi)容。
image.png

下面先看看基本的操作:


image.png

整體思路為,打開文件,選定表格,讀取行列內(nèi)容,讀取表格內(nèi)數(shù)據(jù)

詳細代碼如下:
import xlrd
from datetime import date,datetime

file = 'test3.xlsx'

def read_excel():

    wb = xlrd.open_workbook(filename=file)#打開文件
    print(wb.sheet_names())#獲取所有表格名字

    sheet1 = wb.sheet_by_index(0)#通過索引獲取表格
    sheet2 = wb.sheet_by_name('年級')#通過名字獲取表格
    print(sheet1,sheet2)
    print(sheet1.name,sheet1.nrows,sheet1.ncols)

    rows = sheet1.row_values(2)#獲取行內(nèi)容
    cols = sheet1.col_values(3)#獲取列內(nèi)容
    print(rows)
    print(cols)

    print(sheet1.cell(1,0).value)#獲取表格里的內(nèi)容,三種方式
    print(sheet1.cell_value(1,0))
    print(sheet1.row(1)[0].value)
運行結果如下:
image.png

那么問題來了,上面的運行結果中紅框框中的字段明明是出生日期,可顯示的確實浮點數(shù);同時合并單元格里面應該是有內(nèi)容的,結果不能為空。

別急,我們來一一解決這兩個問題:

1.Python讀取Excel中單元格內(nèi)容為日期的方式

Python讀取Excel中單元格的內(nèi)容返回的有5種類型,即上面例子中的ctype:

ctype : 0 empty,1 string,2 number, 3 date,4 boolean,5 error

即date的ctype=3,這時需要使用xlrd的xldate_as_tuple來處理為date格式,先判斷表格的ctype=3時xldate才能開始操作。

詳細代碼如下:
import xlrd
from datetime import date,datetime

print(sheet1.cell(1,2).ctype)
date_value = xlrd.xldate_as_tuple(sheet1.cell_value(1,2),wb.datemode)
print(date_value)
print(date(*date_value[:3]))
print(date(*date_value[:3]).strftime('%Y/%m/%d'))
運行結果如下:
image.png
2.獲取合并單元格的內(nèi)容

在操作之前,先介紹一下merged_cells()用法,merged_cells返回的這四個參數(shù)的含義是:(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列合并。

詳細代碼如下:
print(sheet1.merged_cells)
print(sheet1.cell_value(1,3))
print(sheet1.cell_value(4,3))
print(sheet1.cell_value(6,1))
運行結果如下:
image.png
發(fā)現(xiàn)規(guī)律了沒?是的,獲取merge_cells返回的row和col低位的索引即可!
  • 于是可以這樣批量獲?。?/li>
詳細代碼如下:
merge = []
print(sheet1.merged_cells)
for (rlow,rhigh,clow,chigh) in sheet1.merged_cells:
    merge.append([rlow,clow])
for index in merge:
    print(sheet1.cell_value(index[0],index[1]))
運行結果跟上圖一樣,如下:
image.png

Python讀寫Excel表格,簡單粗暴又好用,如果覺得不錯,對你工作中有幫助,動動手指分享給更多人哦。

?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

  • >最近遇到一個情景,就是定期生成并發(fā)送服務器使用情況報表,按照不同維度統(tǒng)計,涉及python對excel的操作,上...
    有料美拓閱讀 7,134評論 0 0
  • 最近遇到一個情景,就是定期生成并發(fā)送服務器使用情況報表,按照不同維度統(tǒng)計,涉及python對excel的操作,上網(wǎng)...
    有料美拓閱讀 2,556評論 0 0
  • 1、分別取官網(wǎng)下載需要的第三方庫,下載完成后進行解壓 https://pypi.python.org/pypi/x...
    測試_機器貓閱讀 905評論 0 0
  • 學習Python的過程中,我們會遇到Excel的讀寫問題。通過搜索得知,我們可以使用xlwt module將數(shù)據(jù)寫...
    chliar閱讀 2,375評論 0 2
  • 石神,一位天才,一位數(shù)學家,一位數(shù)學老師,機緣巧合下,自殺的事被新搬來的鄰居打斷。他在看到花岡靖子母女的那刻起,就...
    橫沖直撞的小妖怪閱讀 502評論 0 0

友情鏈接更多精彩內(nèi)容