python操做excel主要用到xlrd和xlwt這兩個庫,即xlrd是讀excel,xlwt是寫excel的庫。html
須要安裝這2個庫,安裝的方式有多重能夠直接使用pip安裝(根據本身的需求安裝):python
如pip安裝小程序
pip3 install xlrd
pip3 install xlwt
本身先建一個excel表格內容以下:app
有上面的Excel表格知道里面有2個sheet,其中第一個sheet1有內容,sheet2沒有內容ide
下面是關於python對Excel讀的基本操做:ui
import xlwt, xlrd from datetime import date, datetime # 打開excel文件,建立一個workbook對象,book對象也就是fruits.xlsx文件,表含有sheet名 workbook = xlrd.open_workbook(r'C:\Users\PC\Desktop\sss.xlsx') print(workbook.sheet_names()) # 獲得一個列表裏面的元素就是sheet的名字 # 上面執行的結果爲['Sheet1', 'Sheet2'] print(workbook.sheets()) # 獲得的是一個列表裏面的元素就是每個sheet對象 # 上面執行的結果爲[<xlrd.sheet.Sheet object at 0x0000019BB9D915C0>, <xlrd.sheet.Sheet object at 0x0000019BB9D91128>] sheet_name = workbook.sheet_names()[0] # 從零開始,取第一個sheet的名字 sheet_obj = workbook.sheets()[0] # 從零開始取第一個sheet對象 print(sheet_name, sheet_obj) # 上面執行的結果爲:Sheet1 <xlrd.sheet.Sheet object at 0x000001E620A7CBE0> # 根據sheet索引或者名稱獲取sheet內容 rsheet = workbook.sheet_by_index(0) # 取第一個工做簿根據索引 rsheet_name = workbook.sheet_by_name(sheet_name) # 根據sheet的名字取第一個工做簿 print('rsheet_index', rsheet) print('rsheet_name', rsheet_name) # 獲取總行數,列數和名字根據sheet的內容也就是上面的rsheet或者rsheet_name print(rsheet.nrows, rsheet.ncols, rsheet.name) rows = rsheet.nrows # 獲取總列數 cols = rsheet.ncols # sheet名稱 sheet_name = rsheet.name # 獲取整行和整列的值 rows2_values = rsheet.row_values(1) # 獲取第二行內容,獲得的是一個列表 cols3_values = rsheet.col_values(2) # 獲取第三列內容,獲得的是一個列表 print(rows2_values, cols3_values) # ['小杰', 23.0, 33919.0, '鍵盤', '朋友'] ['出生日期', 33919.0, 33920.0, 33921.0, 33922.0, 33923.0, '暫無'] # 經過cell的位置座標取得cell值的幾種方式 print('獲取第二行第一列的值', rsheet.cell(1, 0).value) print('獲取第二行第一列的值', rsheet.cell_value(1, 0)) print('獲取第二行第一列的值', rsheet.row(1)[0].value) # 獲取單元格內容的數據類型 print(rsheet.cell(1, 0).ctype)
運行結果以下編碼
能夠看到上面的日期這裏列在表格中明明寫的是日期在這裏是浮點數。那讓咱們來解決這一個問題:spa
一、python讀取excel中單元格內容爲日期的方式excel
python讀取excel中單元格的內容返回的有5種類型,即上面例子中的ctype:code
ctype : 0 empty,1 string, 2 number, 3 date, 4 boolean, 5 error
即date的ctype=3,這時須要使用xlrd的xldate_as_tuple來處理爲date格式,
先判斷表格的ctype=3時xldate才能開始操做。繼續上面的代碼:
# 關於單元格里面時間格式的轉換 print(rsheet.cell(2, 0).ctype) # 結果爲1(字符) print(rsheet.cell(2, 1).ctype) # 結果爲2(數字) print(rsheet.cell(2, 2).ctype) # 結果爲3(日期) print(rsheet.cell(2, 3).ctype) # 結果爲1(字符) print(rsheet.cell(2, 4).ctype) # 結果爲0(空值) 這個是由於合併單元格的緣由 print(rsheet.cell(2, 2).value) # 打印的是一個浮點數 # 結果爲 33920.0 print(xlrd.xldate_as_tuple(rsheet.cell(2, 2).value, workbook.datemode)) # 轉化爲一個咱們可以看得懂的元組 # 結果爲 (1992, 11, 12, 0, 0, 0) date_tuple = xlrd.xldate_as_tuple(rsheet.cell(2, 2).value, workbook.datemode) date_time = date(*date_tuple[:3]).strftime('%Y/%m/%d') # 轉換爲正常的日期格式 print(date_time) # 1992/11/12 # 有上面咱們能夠簡單地判斷是否是時間若是是時間就作轉換 row = 2 # 這個能夠改爲你想要的行數 col = 2 # 這個能夠改爲你想要的列數 if (rsheet.cell(row, col).ctype == 3): date_value = xlrd.xldate_as_tuple(rsheet.cell_value(rows, col), workbook.datemode) date_tmp = date(*date_value[:3]).strftime('%Y/%m/%d')
那麼問題又來了,上面 rsheet.cell(2,4).ctype 返回的值是0,說明這個單元格的值是空值,明明是合併的單元格內容"好朋友",這個是我以爲這個包功能不完善的地方,若是是合併的單元格那麼應該合併的單元格的內容同樣,可是它只是合併的第一個單元格的有值,其它的爲空。
二、讀取合併單元格的內容:
這個是真沒技巧,只能獲取合併單元格的第一個cell的行列索引,才能讀到值,讀錯了就是空值。
即合併行單元格讀取行的第一個索引,合併列單元格讀取列的第一個索引,如上述,讀取行合併單元格"好朋友"和讀取列合併單元格"暫無"只能以下方式:
# 關於合併單元格里面裏面的空值 # 如: print(rsheet.cell(2, 4).ctype) # 結果爲0(空值) 這個是由於合併單元格的緣由 # 明明這裏是合併單元格應該顯示好朋友的 # 讀取合併單元格的內容 print(rsheet.col_values(4)[1]) # 結果爲朋友 print(rsheet.col_values(4)[2]) # 這個是合併的行若是讀取就是空值 print(rsheet.row_values(6)[2]) # 結果爲暫無 print(rsheet.row_values(6)[3]) # 這個是合併的列若是讀取就是空值 print(rsheet.merged_cells) # 結果爲[(6, 7, 2, 5), (1, 3, 4, 5), (3, 6, 4, 5)] # 上面的的(6, 7, 2, 5)這個元組裏面的元素分別爲(row,row_range,col,col_range) # (row,row_range)表示爲包含row可是不包含row_range。上面能夠解讀爲 # 由於是從零開始計數的因此能夠這樣說第七行(數字爲6)的第三列(數字爲2)到第五列(數字爲4)合併 # 有上面的規律咱們可使用如下方式獲取合併單元格的內容 # 這樣咱們就可使用如下的方式獲取合併的單元格的信息, merge = [] for (rlow, rhigh, clow, chigh) in rsheet.merged_cells: merge.append([rlow, clow]) for index in merge: print(rsheet.cell_value(index[0], index[1])) # 有上面咱們知道列合併咱們能夠看到該行的合併的第一列的內容就是合併列的內容其餘的就不是這個內容。 # 爲了準確的得到合併單元格的內容咱們可使用上面的方式得到
#!/usr/bin/env python # -*-coding:utf-8-*- import xlwt, xlrd f = xlwt.Workbook() # 建立一個工做簿 sheet1 = f.add_sheet('sheet1', cell_overwrite_ok=True) # 建立sheet row0 = ["姓名", "年齡", "出生日期", "愛好"] column0 = ["張三", "李四", "王五"] # 生成第一行 for i in range(0, len(row0)): sheet1.write(0, i, row0[i]) # 第一個參數表示的是行,第二個參數表示的列,第三個表示的是數據 for i in range(0, len(column0)): sheet1.write(i + 1, 0, column0[i]) # 給第二行的人物加信息 sheet1.write(1, 1, 23) sheet1.write(1, 2, '1993/04/22') sheet1.write(1, 3, '足球') f.save('test.xls')
上面這個只是寫入一個新的不可以對已有的Excel表格進行修改
因爲xlrd不能對已存在的xlsx文件,進行修改!因此必須使用OpenPyXL
OpenPyXL:較好的支持對xlsx文件的修改,功能比較強大,適用於須要處理XLSX文件,須要修改XLSX文件中的值,最後生成xlsx。openpyxl(可讀寫excel表)專門處理Excel2007及以上版本產生的xlsx文件,xls和xlsx之間轉換容易
注意:若是文字編碼是「gb2312」 讀取後就會顯示亂碼,請先轉成Unicode。
官網上最推薦的是openpyxl:
綜上,因此選擇使用OpenPyX來作一個修改excel的小程序。
OpenPyXL的官網參考:
https://openpyxl.readthedocs.io/en/latest/usage.html
https://openpyxl.readthedocs.io/en/stable/
一、OpenPyXL模塊的安裝
pip3 install OpenPyXL
二、快速實現xlsx文件的單元格修改
舉例:增長一列地區,並增長相應的值,而且修改某一我的的出生日期
from openpyxl import load_workbook # excel文件絕對路徑 file_home = r'C:\Users\PC\Desktop\sss.xlsx' wb = load_workbook(filename=file_home) # 打開excel文件 sheet_ranges = wb['Sheet1'] print(sheet_ranges['A1'].value) # 打印A1單元格的值 ws = wb['Sheet1'] # 根據Sheet1這個sheet名字來獲取該sheet # 添加一欄爲地區,而且給上數據 ws["F1"] = '地區' # 修改C1的值爲LJK5679842 ws['F2'] = '湖北' ws['F3'] = '雲南' ws['F4'] = '湖南' ws['F5'] = '北京' ws['F6'] = '江蘇' # 修改小明的出生日期 ws['c3'] = '1991/11/12' wb.save(file_home) # 保存修改後的excel
執行前的excel表格
執行後的Excel表格
能夠看到上面增長和修改的數據。