使用python操作excel

使用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')

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章