-
時間: 2020-08-18 整理: qiyuan
安裝和導入
1.模塊介紹
在 python 中使用 xlrd/xlwt 和 openpyxl 模塊可以對Excel電子表格(xls、xlsx文件)進行讀寫等操作. 本篇以 python3 為基礎,以 xlrd/xlwt 模塊為“學習和研究”對象,對 xlrd/xlwt 中常見的用法進行梳理和記錄.
2.模塊安裝
pip install xlrd
pip install xlwt
3.模塊導入
import xlrd import xlwt
xlrd模塊
1.語法說明
import xlrd # 導入xlrd模塊 1.打開excel文件,獲取文件內容 excel = '/Users/usr/Downloads/TEMP/DVT.xlsx' data = xlrd.open_workbook(excel) data.nsheets # 獲取該excel文件中包含的sheet的數量 data.sheets() # 返回該excel文件中所有sheet對象組成的列表 data.sheet_names() # 返回該excel文件中所有sheet名稱組成的列表 data.sheet_names()[index] # 獲取excel文件中指定索引的sheet的名稱 data.sheet_loaded(sheet_name or index) # 檢查某個sheet是否導入完畢 2.獲取某個sheet數據 table = data.sheets()[index] # 根據sheet索引獲取sheet內容 table = data.sheet_by_index(index) # 根據sheet索引獲取sheet內容 table = data.sheet_by_name(sheet_name) # 根據sheet名稱獲取sheet內容 table.name # 獲取sheet名稱 3.操作行、列、單元格 # 行的操作 table.nrows # 獲取該sheet中的有效行數 table.row(rowx) # 返回由該行中所有單元格對象組成的列表 table.row_slice(rowx) # 返回由該列中所有的單元格對象組成的列表 table.row_types(rowx,start_colx=0,end_colx=None) # 返回由該行中所有單元格的數據類型組成的列表 table.row_values(rowx,start_colx=0, end_colx=None) # 返回由該行中所有單元格數據組成的列表 table.row_len(rowx) # 返回該列的有效單元格長度 # 列的操作 table.ncols # 獲取該sheet中的有效列數 table.col(colx,start_rowx=0,end_rowx=None) table.col_slice(colx,start_rowx=0,end_rowx=None) table.col_types(colx,start_rowx=0,end_rows=None) table.col_values(colx,start_rowx=0,end_rows=None) # 單元格的操作 table.cell(rowx,colx) # 返回單元格對象 table.cell_value(rowx,colx) # 返回單元格中的數據 table.cell(rowx,colx).value table.row(rowx)[index].value table.col(colx)[index].value table.cell_type(rowx,colx) # 返回單元格中的數據類型 sheet2.cell(rowx,colx).ctype table.row(rowx)[index].ctype table.col(colx)[index].ctype 4.獲取單元格內容為特定類型方式 # ctype: 0 empty,1 string,2 number,3 date,4 boolean,5 error,6 blank # 獲取單元格內容為date格式 from datetime import datetime,date if sheet1.cell(3,6).ctype == 3: cell_value = sheet1.cell(3,6).value) date_value = xlrd.xldate_as_tuple(cell_value, data.datemode) date_value_str = date(*data_value[:3]) date_value_str = date(*data_value[:3]).strftime('%Y/%m/%d') # 獲取單元格內容為number(int)格式 if sheet1.cell(3,5).ctype == 2: cell_value = sheet1.cell(3,5).value num_value = int(cell_value) 5.獲取合並單元格的內容 data = xlrd.open_workbook(filename, formattinng_info=True) sheet1 = data.sheet_by_name('OTA_02') sheet1.merged_cells # 返回: (row,row_range,col,col_range) # 總結規律: 獲取merge_cells返回的row和col的低位索引即可 merge_value = [] for (row,row_range,col,col_range) in sheet1.merged_cells: merge_value.append((row,col)) print(merge_value) for v in merge_value: cell_value = sheet1.cell(v[0],v[1]).value print(cell_value) 6.打開包含中文字符的文件名和sheet名時報錯的解決辦法 # 1.使用open()函數,xlrd.open_workbook()函數打開文件,文件名若包含中文,會報錯找不到這個文件或目錄 # 2.獲取sheet時,若包含中文,也會報錯 file = open(filename,'rb') # 打開文件 workbook = xlrd.open_workbook(filename) # 打開excel文件 sheet = workbook.sheet_by_name(sheetname) # 獲取sheet # 解決方案: # a.對參數進行轉碼即可,如: filename = filename.decode('utf-8') # b.也試過unicode函數,不過,在ride中運行時出現了報錯,不推薦 filename = unicode(filename,'utf-8')
2.示例
BOOK_LIST.xlsx : Sheet1
使用 xlrd 模塊讀取表格內容:

# -*- coding: utf-8 -*- import xlrd from datetime import datetime, date def read_excel(): data = xlrd.open_workbook(r'/media/psf/Home/Downloads/TEMP/BOOK_LIST.xlsx') print('Sheet列表:', data.sheet_names(), '數量:', data.nsheets) table = data.sheets()[0] # table = data.sheet_by_index(0) # table = data.sheet_by_name('Sheet1') print('Sheet名稱:', table.name, '行數:', table.nrows, '列數:', table.ncols) print('-------- 按行顯示Sheet內容: --------') for rowx in range(0, table.nrows): print('第{}行:'.format(rowx + 1), table.row_values(rowx)) # print('第{}行:'.format(rowx + 1), table.row_types(rowx)) print('-------- 按列顯示Sheet內容: --------') for colx in range(0, table.ncols): print('第{}列:'.format(colx + 1), table.col_values(colx)) # print('第{}列:'.format(colx + 1), table.col_types(colx)) print('-------- 按行顯示Sheet所有單元格對象: --------') for rowx in range(0, table.nrows): print('第{}行:'.format(rowx + 1), table.row(rowx)) print('-------- 按列顯示Sheet所有單元格對象: --------') for colx in range(0, table.ncols): print('第{}列:'.format(colx + 1), table.col(colx)) print('-------- 獲取合並單元格內容: --------') # 獲取合並單元格內容 print('合並單元格的索引和范圍:', table.merged_cells) for (rowx,row_range,colx,col_range) in table.merged_cells: print('合並單元格的內容:',table.cell(rowx,colx).value,'(','合並單元格寬:',col_range,'高:',row_range,')') print('-------- 獲取/轉換單元格內容為特定類型: --------') # 獲取單元格內容為int類型 print('轉換前:', table.col(0,1,None)) print('轉換后', end=': ') for cellobj in table.col(0,1,None): if cellobj.ctype == 2: cell_value = cellobj.value num_value = int(cell_value) print(num_value, end=', ') else: print(cellobj.value, end=', ') print('') # 獲取單元格內容為date格式 print('轉換前:', table.col(6,1,None)) print('轉換后', end=': ') for cellobj in table.col(6,1,None): if cellobj.ctype == 3: cell_value = cellobj.value date_value = xlrd.xldate_as_tuple(cell_value, data.datemode) data_value_obj = date(*date_value[:3]) data_value_str = date(*date_value[:3]).strftime('%Y/%m/%d') print(data_value_str,end=', ') else: print(cellobj.value, end=', ') if __name__ == '__main__': read_excel()
運行結果:
(提示: 如果圖片不清晰影響閱讀,可鼠標右鍵點擊圖片選擇 ‘在新標簽頁中打開圖片’ 查看高清大圖,或選擇 ‘圖片存儲為...’ 到本地查看)
xlwt模塊
1.語法說明
import xlwt # 導入模塊 1.創建Workbook對象 wb = xlwt.Workbook() 2.新增sheet ws = wb.add_sheet('sheet') ws = wb.add_sheet('聯系人', cell_overwrite_ok=True) 3.寫入數據 ws.write(0,0,'Hello') ws.write(2,0,100) ws.write(2,1,200) ws.write(2,2,xlwt.Formula("A3+B3")) ws.write(4,2,'技術部') ws.write(4,5,'186777233') ws.write(4,6,'wangwu@163.com') ws.write_merge(21,21,0,1,u'Summary') # 合並單元格 4.設定單元格樣式、列寬 ws.col(0).width = 200*30 5.保存工作薄 wb.save('/Users/usr/Downloads/TEMP/example.xls')
2.示例
BOOK_LIST.xlsx : Sheet2
使用 xlwt 模塊創建新的表格並寫入數據:

# -*- coding: utf-8 -*- import xlwt from datetime import datetime,date def set_style(name,height,bold=False): style = xlwt,XFStyle() font = xlwt.Font() font.name = name font.blod = blod font.color_index = 4 font.height = height # borders = xlwt.Borders() # borsers.left = 6 # borders.right = 6 # borders.top = 6 # borders.bottom = 6 style.font = font # style.borders = borders return style def write_excel(): f = xlwt.Workbook() sheet1 = f.add_sheet(u'sheet1',cell_voerwrite_ok=True) row0 = [u'業務',u'狀態',u'北京',u'上海',u'廣州',u'深圳',u'狀態小計',u'合計'] columnn0 = [u'機票',u'船票',u'火車票',u'汽車票',u'其它'] status = [u'預訂',u'出票',u'退票',u'業務小計'] for i in range(0,len(row0)): sheet1.write(0,i,row0[i],set_style('Times New Roman', 220, True)) i,j = 1,0 while i < 4*len(column0) and j < len(column0): sheet1.write_merge(i,i+3,0,0,column[j],set_style('Arial',220,True)) sheet1.write_merge(i,i+3,7,7) i += 4 j += 1 sheet1.write_merage(21,21,0,1,u'合計',set_style('Times New Roman',220,True)) i = 0 while i < 4*len(column0): for j in range(0,len(status)): sheet1.write(j+i+1,1,status[j]) i += 4 f.save('demo1.xlsx') if __name__ == '__main__': write_excel()
--the end--