• 【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等等

  • 相关阅读:
    POJ3255(次短路)
    POJ2831(次小生成树问题)
    POJ1679(次小生成树)
    POJ2230(打印欧拉回路)
    HDU5469(树的dfs)
    JSON.parse()和JSON.stringify()的区别
    jQuery中.bind() .live() .delegate() .on()的区别
    javascript 伪数组和转化为标准数组
    JavaScript中本地对象、内置对象和宿主对象(转)
    获取非行间样式和定义样式(元素)
  • 原文地址:https://www.cnblogs.com/franknihao/p/6535980.html
Copyright © 2020-2023  润新知