使用python操作excel
python操作excel主要用到xlrd和xlwt這兩個庫,即xlrd是讀excel,xlwt是寫excel的庫。
安裝xlrd模塊
#pip install xlrd
使用介紹
常用單元格中的數據類型
empty(空的)
string(text)
number
date
boolean
error
blank(空白表格)
empty爲0,string爲1,number爲2,date爲3,boolean爲4, error爲5(左邊爲類型,右邊爲類型對應的值)
導入模塊
import xlrd
打開Excel文件讀取數據
data = xlrd.open_workbook(filename[, logfile, file_contents, ...]) #文件名以及路徑,如果路徑或者文件名有中文給前面加一個r標識原生字符。 #filename:需操作的文件名(包括文件路徑和文件名稱);若filename不存在,則報錯FileNotFoundError;若filename存在,則返回值爲xlrd.book.Book對象。
常用的函數
excel中最重要的方法就是book和sheet的操作
(1)獲取book中一個工作表
names = data.sheet_names()
#返回book中所有工作表的名字 table = data.sheets()[0] #獲取所有sheet的對象,以列表形式顯示。可以通過索引順序獲取, table = data.sheet_by_index(sheet_indx)) #通過索引順序獲取,若sheetx超出索引範圍,則報錯IndexError;若sheetx在索引範圍內,則返回值爲xlrd.sheet.Sheet對象 table = data.sheet_by_name(sheet_name) #通過名稱獲取,若sheet_name不存在,則報錯xlrd.biffh.XLRDError;若sheet_name存在,則返回值爲xlrd.sheet.Sheet對象 以上三個函數都會返回一個xlrd.sheet.Sheet()對象 data.sheet_loaded(sheet_name or indx) # 檢查某個sheet是否導入完畢,返回值爲bool類型,若返回值爲True表示已導入;若返回值爲False表示未導入
(2)行的操作
nrows = table.nrows #獲取該sheet中的有效行數 table.row(rowx) #獲取sheet中第rowx+1行單元,返回值爲列表;列表每個值內容爲: 單元類型:單元數據 table.row_slice(rowx[, start_colx=0, end_colx=None]) #以切片方式獲取sheet中第rowx+1行從start_colx列到end_colx列的單元,返回值爲列表;列表每個值內容爲: 單元類型:單元數據 table.row_types(rowx, start_colx=0, end_colx=None) #獲取sheet中第rowx+1行從start_colx列到end_colx列的單元類型,返回值爲array.array類型。 #單元類型ctype:empty爲0,string爲1,number爲2,date爲3,boolean爲4, error爲5(左邊爲類型,右邊爲類型對應的值) table.row_values(rowx, start_colx=0, end_colx=None) #返回由該行中所有單元格的數據組成的列表 table.row_len(rowx) #返回該列的有效單元格長度 table..get_rows() #獲取某一sheet所有行的生成器
(3)列的操作
ncols = table.ncols #獲取列表的有效列數 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_rowx=None) #返回由該列中所有單元格的數據類型組成的列表 table.col_values(colx, start_rowx=0, end_rowx=None) #返回由該列中所有單元格的數據組成的列表
(4)單元格的操作
table.cell(rowx,colx) #返回單元格對象,返回值爲'xlrd.sheet.Cell'類型,返回值的格式爲“單元類型:單元值” table.cell_type(rowx,colx) #返回單元格中的數據類型 table.cell_value(rowx,colx) #返回單元格中的數據
單元格:單元格是表格中行與列的交叉部分,它是組成表格的最小單位,可拆分或者合併。單個數據的輸入和修改都是在單元格中進行的
注意:注意作用域問題,之前獲取的sheet之後,都在獲取到這個sheet值後,再進行,行和列以及單元格的操作。
(5)讀取單元格內容爲日期/時間的方式
若單元格內容的類型爲date,即ctype值爲3時,則代表此單元格的數據爲日期
xlrd.xldate_as_tuple(xldate, datemode) #若xldate數據爲日期/時間,則將轉化爲適用於datetime的元組; #返回值爲元組,格式爲:(year, month,day,hour,minute,nearest_second) #xldate:sheet對象中單元格的數據 #datemode:日期模式
""" 讀取sheet對象中的日期舉例 """ import datetime workbook = xlrd.open_workbook("測試.xlsx") sheet2_object = workbook.sheet_by_name("Sheet2") # value_type = sheet2_object.cell(0, 1).ctype value_type = sheet2_object.cell_type(0, 1) print(value_type) # 結果:3 if value_type == 3: print("單元格數據爲日期") cell_value = sheet2_object.cell_value(0, 1) print(cell_value) # 結果:43506.0 date_tuple = xlrd.xldate_as_tuple(cell_value, workbook.datemode) print(date_tuple) # 結果:(2019, 2, 10, 0, 0, 0) date_value = datetime.date(*date_tuple[:3]) print(date_value) # 結果:2019-02-10 date_format = date_value.strftime('%Y/%m/%d') print(date_format) # 結果:2019/02/10
(6)對合並的單元格執行操作
若表格爲xls格式的,打開workbook時需將formatting_info設置爲True,然後再獲取sheet中的合併單元格;
若表格有xlsx格式的,打開workbook時保持formatting_info爲默認值False,然後再獲取sheet中的合併單元格
data.merged_cells() #獲取sheet中合併單元格的信息,返回值爲列表; #若sheet對象中無合併單元格,則返回值爲空列表; #列表中每個單元格信息的格式爲:(row_start, row_end, col_start, col_end) #row_start表示合併單元格的起始行; #row_end表示合併單元格的結束行; #col_start表示合併單元格的起始列; #col_end表示合併單元格的結束列; #合併單元格的行取值範圍爲[row_start, row_end),包括row_start,不包括row_end; #合併單元格的列取值範圍爲[col_start, col_end),包括col_start,不包括col_end; #如:(1, 3, 4, 6):表示從第1到2行合併,從第4到第5列合併;
讀取合併單元格的數據
讀取合併單元格數據僅需merged_cells數據中的row_start和col_start這兩個索引即可
SheetObject.cell_value(rowx=row_start, colx=col_start) #獲取合併單元格的數據
""" 獲取合併的單元格並讀取單元格數據舉例 """ # 獲取xlsx格式的excel文件中的合併單元格 workbook = xlrd.open_workbook("測試.xlsx") sheet2_object = workbook.sheet_by_name("Sheet2") print(sheet2_object.merged_cells) # 結果: [(1, 2, 0, 2), (3, 6, 0, 2)] # 獲取xls格式的excel文件中的合併單元格 workbook1 = xlrd.open_workbook("測試.xls", formatting_info=True) sheet2_object1 = workbook1.sheet_by_name("Sheet2") print(sheet2_object1.merged_cells) # 結果: [(1, 2, 0, 2), (3, 6, 0, 2)] # 讀取合併單元格數據(僅需“起始行起始列”即可獲取數據) print(sheet2_object.cell_value(1, 0)) # 結果:合併 print(sheet2_object.cell_value(3, 0)) # 結果:合併2 # 或使用for循環獲取所有的合併單元格數據 for (row_start, row_end, col_start, col_end) in sheet2_object.merged_cells: print(sheet2_object.cell_value(rowx=row_start, colx=col_start))
問題現象:
1、使用open()函數、xlrd.open_workbook()函數打開文件,文件名若包含中文,會報錯找不到這個文件或目錄。
2、獲取sheet時若包含中文,也會報錯。
#打開文件 file = open(filename,'rb') #打開excel文件 workbook = xlrd.open_workbook(filename) #獲取sheet sheet = workbook.sheet_by_name(sheetname)
解決方案:
對參數進行轉碼即可。如:
filename = filename.decode('utf-8')