【Python】excel讀寫操作 xlrd & xlwt


xlrd

■  xlrd

  xlrd模塊用於讀取excel文件內容

  基本用法:

workbook = xlrd.open_workbook('文件路徑')
workbook.sheet_names()    #返回所有sheet的列表
workbook.sheet_by_index(...)    #通過index來獲得一個sheet對象,index從0開始算起
workbook.sheet_by_name(...)    #根據sheet名獲得相應的那個sheet對象

   在得到sheet對象之后,就可以用它的一些方法和變量來獲取數據:

  sheet.name    sheet的名字

  sheet.nrows    sheet的行數

  sheet.ncols    sheet的列數

  sheet.get_rows()    返回一個迭代器,遍歷所有行,給出每個行的值列表

  sheet.row_values(index)    返回某一行的值列表

  sheet.row(index)    返回一個row對象,可以通過row[index]來獲取這行里的單元格cell對象

  sheet.col_values(index)    返回某一列的值列表

  sheet.cell(row,col)    獲取一個cell對象(row和col都從0開始算)

 

  上面提到的cell對象就是一個單元格的抽象,cell對象有value變量來獲取其值。    *value都是以unicode的形式存儲的,如果內容是中文,記得要encode一下

  要獲得特定的cell對象的值有多種方法,如

    sheet.cell(x,y).value

    sheet.cell_value(x,y)

    sheet.row(x)[y].value

  除了value變量外,cell還有一些其他的變量和方法:

    .ctype    返回該單元格數據類型的代碼(0表示空,1表示string,2表示number,3表示date,4表示boolean,5表示error)。當ctype == 3 時,雖是日期,但那時python是按照float來處理的,需要用xldate_as_tuple方法來將其轉化為日期格式,這個方法的用法就是xlrd.xldate_as_tuple(xldate,datemode), xldate表示一個ctype是3的一個值,datemode是屬於workbook的一個屬性。

 

  *關於讀取合並單元格

    在默認情況中,合並單元格只在最左上角的子單元格可以讀取到值,其他都是空的。為了解決此問題,在open_workbook時加上參數formatting_info = True (這個只支持excel97-03的xls文件

    這樣,sheet.merged_cells會返回當前表中所有合並單元格的信息,格式是像[(7,8,2,5),(1,3,4,5)...]這樣的一個列表。其中每一項都是一個單元格,比如(7,8,2,5)的意思是這個sheet中的第七行的第2-4行合並,和序列的分片操作一樣,是算頭不算尾,所以7,8是指合並的僅第七行(這個7不是index而是index+1),2,5則表示第二列到第四列,不包括第五列。這個“不算尾”的做法是區別於xlwt模塊中的合並單元格處理的。

    這么一來,想要知道某個合並單元格的值信息的話,只要關注每個元組的第一項和第三項就行了。

  

xlwt

  xlwt用於寫入excel,基本創建方法和xlrd類似:

wk = xlwt.Workbook()
st = wk.add_sheet('sheetname')
st.write(x,y,...,style)    #意思是將內容...寫入index為(x,y)的單元格內,style可以自定義,詳情見下文
st.write(x,x+m,y,y+n,...,style)    #可以直接寫入一個合並單元格,x為開始的row的index,x+m是結束的row的index,y類似。注意:這里是包括x+m行的,和xlrd讀取合並單元格設定不一樣
'''
經試驗,發現似乎並不能直接寫入一個合並單元格,比較好的做法是首先調用merge方法合並出一個單元格,然后寫入數據到合並單元格的最左上角的子單元格
'''
wk.save('路徑')    #保存文件

 

   *關於style  可以單獨定義一個def_style函數來統一處理

   比如:

def def_style():
    style = xlwt.XFStyle()

  ##########這部分設置字體######### font
= xlwt.Font() font.name = 'Times New Roman' #或者換成外面傳進來的參數,這樣可以使一個函數定義所有style font.bold = 'True' font.height = '...' font.size = '...' font.colour_index('...') style.font = font
  ########這部分設置居中格式####### alignment
= xlwt.Alignment() alignment.horz = xlwt.Alignment.HORZ_CENTER #水平居中 alignment.vert = xlwt.Alignment.VERT_CENTER #垂直居中 style.alignment = alignment
  #########還可以添加幾個設置顏色,邊框的部分##########
return style ####################################### #核心意思是指,要通過這個函數來設置一些style的屬性 #比如字體,居中格式等等 #最終再返回一個style #######################################

#這樣在寫入的時候就可以通過def_style()來返回一個style對象,來設置style了
  xlwt.write(0,0,'test',def_style())

   

  *單元格大小並不會根據內容的大小和多少自動調整,要通過

    sheet.row(x).height = ...

    sheet.col(x).width = ...

   來調整單元格大小

 

  *若要設置cell的背景色,邊框等可以設置style的其他屬性,比如

    背景色要設置 style.pattern,如:

    ptn = xlwt.Pattern()

    ptn.pattern = xlwt.Pattern.SOLID_PATTERN

    ptn.pattern_fore_colour = 顏色代碼 //注意這個顏色代碼不是RGB的六位顏色代碼,而是xlwt內部的一套代碼。具體可以參考xlwt.Styles中一些類似叫做color_map的數據,下表作參考:

aqua 0x31
black 0x08
blue 0x0C
blue_gray 0x36
bright_green 0x0B
brown 0x3C
coral 0x1D
cyan_ega 0x0F
dark_blue 0x12
dark_blue_ega 0x12
dark_green 0x3A
dark_green_ega 0x11
dark_purple 0x1C
dark_red 0x10
dark_red_ega 0x10
dark_teal 0x38
dark_yellow 0x13
gold 0x33
gray_ega 0x17
gray25 0x16
gray40 0x37
gray50 0x17
gray80 0x3F
green 0x11
ice_blue 0x1F
indigo 0x3E
ivory 0x1A
lavender 0x2E
light_blue 0x30
light_green 0x2A
light_orange 0x34
light_turquoise 0x29
light_yellow 0x2B
lime 0x32
magenta_ega 0x0E
ocean_blue 0x1E
olive_ega 0x13
olive_green 0x3B
orange 0x35
pale_blue 0x2C
periwinkle 0x18
pink 0x0E
plum 0x3D
purple_ega 0x14
red 0x0A
rose 0x2D
sea_green 0x39
silver_ega 0x16
sky_blue 0x28
tan 0x2F
teal 0x15
teal_ega 0x15
turquoise 0x0F
violet 0x14
white 0x09
yellow 0x0D

 

    style.pattern = ptn

 

    border = xlwt.Borders()

    border.left = xlwt.Borders.THICK

    border.top/right/bottom等等


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM