• xlrd、xlwt操作execl表格


    在python中操作execl进行数据读写的时候,可以使用xlrd进行文件的读取,使用xlwt将数据写入execl中。

    1.xlrd

    xlwt用来读取execl中的数据,常见的用法如下。

    (1)打开execl文件并获取所有的sheet

    >>> import xlrd
    >>> workbook = xlrd.open_workbook(r'D:Program FilesNotepad++Student.xlsx')
    >>> print workbook.sheet_names()
    [u'Sheet1', u'Sheet2', u'Sheet3']

    (2)根据下标获取sheet名称

    >>> sheet2_name=workbook.sheet_names()[1]
    >>> print sheet2_name
    Sheet2

    (3)根据sheet索引或者名称获取sheet内容,同时获取sheet名称、行数、列数

    >>> sheet2 = workbook.sheet_by_index(1)
    >>> print sheet2.name,sheet2.nrows,sheet2.ncols
    Sheet2 6 5
    >>> sheet2 = workbook.sheet_by_name('Sheet2')
    >>> print sheet2.name,sheet2.nrows,sheet2.ncols
    Sheet2 6 5

    (4)根据sheet名称获取整行和整列的值

    >>> sheet2 = workbook.sheet_by_name('Sheet2')
    >>> rows = sheet2.row_values(3)
    >>> cols = sheet2.col_values(2)
    >>> print rows
    [u'lisi2', 19.0, 41462.0, u'basketball', u'friend2'] #标红部分为日期2013/7/7,实际却显示为浮点数。后面有描述如何纠正
    >>> print cols
    [u'u51fau751fu65e5u671f', 42129.0, 41796.0, 41462.0, 40941.0, u''] # 问题同上

    (5)获取指定单元格的内容

    >>> print sheet2.cell(1,0).value.encode('utf-8')
    xiaoming2
    >>> print sheet2.cell_value(1,0).encode('utf-8')
    xiaoming2
    >>> print sheet2.row(1)[0].value.encode('utf-8')
    xiaoming2

    (6)获取单元格内容的数据类型

    >>> print sheet2.cell(1,0).ctype #第2行第1列:xiaoming2 为string类型
    1
    >>> print sheet2.cell(1,1).ctype #第2行第2列:12  为number类型
    2
    >>> print sheet2.cell(1,2).ctype #第2行第3列:2015/5/5 为date类型
    3

    (7)获取单元格内容为日期类型的方式

     使用xlrd的xldate_as_tuple处理为date格式,先判断表格的ctype=3时xlrd才能执行操作,如下:

    >>> from datetime import datetime,date
    >>> sheet2.cell(1,2).ctype
    3
    >>> sheet2.cell(1,2).value
    42129.0
    >>> xlrd.xldate_as_tuple(sheet2.cell_value(1,2),workbook.datemode)
    (2015, 5, 5, 0, 0, 0)
    >>> date_value = xlrd.xldate_as_tuple(sheet2.cell_value(1,2),workbook.datemode)
    >>> date(*date_value[:3])
    datetime.date(2015, 5, 5)
    >>> date(*date_value[:3]).strftime('%Y/%m/%d')
    '2015/05/05'

    那么如果是在脚本中需要获取并显示单元格内容为日期类型的,可以先做一个判断。判断ctype是否等于3,如果等于3,则用时间格式处理:

    if (sheet.cell(row,col).ctype == 3):
      date_value = xlrd.xldate_as_tuple(sheet.cell_value(row,col),book.datemode)
      date_tmp = date(*date_value[:3]).strftime('%Y/%m/%d')

    (8)获取合并单元格的内容

    >>> sheet2.cell(1,4).value #第4列的第2行和第3行是合并单元格
    u'friend'
    >>> sheet2.cell(2,4).value
    u''
    >>> sheet2.cell(5,1).value #第6行的第2和第3第4列是合并单元格,这里我们只获取到第6行第2列的值而第3列第4列获取的内容为空,如何处理?
    u'None'
    >>> sheet2.cell(5,2).value
    u''
    >>> sheet2.cell(5,3).value
    u''

     从实验结果可以看出来,第6行的第2和第3第4列是合并单元格,但这里我们只获取到第6行第2列的值而第3列第4列获取的内容为空,理论上来说合并的

    单元格内容应该是一样的,但是现在只有合并的第一个单元格可以获取到值,其他为空,如何处理? 再用一种更直观的方式显示

    >>> sheet2.row_values(5)
    [u'zhaoliu2', u'None', u'', u'', u''] #标红的部分为合并单元格
    >>> sheet2.col_values(4)
    [u'u5173u7cfb', u'friend', u'', u'friend2', u'', u''] #标红的部分为合并单元格,注意这里是两个合并单元格

    可以利用merged_cells方法进行处理,处理的方法是只能获取合并单元格的第一个cell的行列索引,才能读到值,读错了就是空值。即合并行单元格读取

    行的第一个索引,合并列单元格读取列的第一个索引。这里,需要在读取文件的时候添加个参数,将formatting_info参数设置为True,默认是False,否

    则可能调用merged_cells方法获取到的是空值。

    >>> workbook = xlrd.open_workbook(r'D:Program FilesNotepad++Student.xlsx',formatting_info=True) 
    
    >>> sheet2 = workbook.sheet_by_name('sheet2') 
    
    >>> sheet2.merged_cells 
    [(1, 3, 4, 5), (3, 5, 4, 5), (5, 6, 1, 5)]

    merged_cells返回的这四个参数的含义是:(row,row_range,col,col_range),其中[row,row_range)包括row,不包括row_range,col也是一样,下标从0开

    始。即(1, 3, 4, 5)的含义是:第2到3行(不包括第4行)合并,(5, 6, 1, 5)的含义是:第2到5列合并。利用这个,可以分别获取合并的三个单元格的内容:

    >>> print sheet2.cell_value(1,4) #(1, 3, 4, 5)
    friend
    >>> print sheet2.cell_value(3,4) #(3, 5, 4, 5)
    friend2
    >>> print sheet2.cell_value(5,1) #(5, 6, 1, 5)
    None

    2.xlwt

    xlwt用来往execl中写入数据,功能还是比较丰富的。

    先来看一个比较简单的例子。

    import xlwt
    # 创建一个workbook 设置编码
    workbook = xlwt.Workbook(encoding = 'utf-8')
    # 创建一个worksheet
    worksheet = workbook.add_sheet('My Worksheet')
    
    # 写入excel
    # 参数对应 行, 列, 值
    worksheet.write(1,0, label = 'this is test')
    
    # 保存
    workbook.save('Excel_test.xls')

    运行之后,就会在当前目录之下生成一个叫做“Excel_test.xls”的文件。

    当然你还可以做一些样式上面的更改。

    (1)设置字体的样式

    import xlwt
    
    workbook = xlwt.Workbook(encoding = 'ascii')
    worksheet = workbook.add_sheet('My Worksheet')
    
    style = xlwt.XFStyle() # 初始化样式
    font = xlwt.Font() # 为样式创建字体
    font.name = 'Times New Roman' 
    font.bold = True # 黑体
    font.underline = True # 下划线
    font.italic = True # 斜体字
    style.font = font # 设定样式
    worksheet.write(0, 0, 'Unformatted value') # 不带样式的写入
    
    worksheet.write(1, 0, 'Formatted value', style) # 带样式的写入
    
    workbook.save('formatting.xls') # 保存文件

    (2)设置单元格宽度

    import xlwt
    
    workbook = xlwt.Workbook()
    worksheet = workbook.add_sheet('My Sheet')
    worksheet.write(0, 0,'My Cell Contents')
    
    # 设置单元格宽度
    worksheet.col(0).width = 3333
    workbook.save('cell_width.xls')

    (3)输出一个日期到单元格

    import xlwt
    import datetime
    workbook = xlwt.Workbook()
    worksheet = workbook.add_sheet('My Sheet')
    style = xlwt.XFStyle()
    
    #设置日期的格式
    style.num_format_str = 'M/D/YY' # Other options: D-MMM-YY, D-MMM, MMM-YY, h:mm, h:mm:ss, h:mm, h:mm:ss, M/D/YY h:mm, mm:ss, [h]:mm:ss, mm:ss.0
    worksheet.write(0, 0, datetime.datetime.now(), style)
    workbook.save('Excel_Workbook.xls')

    (4)向单元格添加一个公式

    import xlwt
    workbook = xlwt.Workbook()
    worksheet = workbook.add_sheet('My Sheet')
    worksheet.write(0, 0, 5) # Outputs 5
    worksheet.write(0, 1, 2) # Outputs 2
    worksheet.write(1, 0, xlwt.Formula('A1*B1')) # Should output "10" (A1[5] * A2[2])
    worksheet.write(1, 1, xlwt.Formula('SUM(A1,B1)')) # Should output "7" (A1[5] + A2[2])
    workbook.save('Excel_Workbook.xls')

    (5)向单元格添加一个超链接

    import xlwt
    workbook = xlwt.Workbook()
    worksheet = workbook.add_sheet('My Sheet')
    worksheet.write(0, 0, xlwt.Formula('HYPERLINK("http://www.google.com";"Google")')) # Outputs the text "Google" linking to http://www.google.com
    workbook.save('Excel_Workbook.xls')

    (6)合并列和行

    import xlwt
    workbook = xlwt.Workbook()
    worksheet = workbook.add_sheet('My Sheet')
    worksheet.write_merge(0, 0, 0, 3, 'First Merge') # Merges row 0's columns 0 through 3.  合并第一行的0到3列
    font = xlwt.Font() # Create Font  #创建一个样式
    font.bold = True # Set font to Bold
    style = xlwt.XFStyle() # Create Style
    style.font = font # Add Bold Font to Style
    worksheet.write_merge(1, 2, 0, 3, 'Second Merge', style) # 合并1到2行的0列到3列
    workbook.save('Excel_Workbook.xls')

    (7)设置单元格内容的对齐方式

    import xlwt
    workbook = xlwt.Workbook()
    worksheet = workbook.add_sheet('My Sheet')
    alignment = xlwt.Alignment() # Create Alignment
    alignment.horz = xlwt.Alignment.HORZ_CENTER # May be: HORZ_GENERAL, HORZ_LEFT, HORZ_CENTER, HORZ_RIGHT, HORZ_FILLED, HORZ_JUSTIFIED, HORZ_CENTER_ACROSS_SEL, HORZ_DISTRIBUTED
    alignment.vert = xlwt.Alignment.VERT_CENTER # May be: VERT_TOP, VERT_CENTER, VERT_BOTTOM, VERT_JUSTIFIED, VERT_DISTRIBUTED
    style = xlwt.XFStyle() # Create Style
    style.alignment = alignment # Add Alignment to Style
    worksheet.write(0, 0, 'Cell Contents', style)
    workbook.save('Excel_Workbook.xls')

    (8)为单元格添加边框

    import xlwt
    workbook = xlwt.Workbook()
    worksheet = workbook.add_sheet('My Sheet')
    borders = xlwt.Borders() # Create Borders
    borders.left = xlwt.Borders.DASHED 
        DASHED虚线
        NO_LINE没有
        THIN实线
        
    # May be: NO_LINE, THIN, MEDIUM, DASHED, DOTTED, THICK, DOUBLE, HAIR, MEDIUM_DASHED, THIN_DASH_DOTTED, MEDIUM_DASH_DOTTED, THIN_DASH_DOT_DOTTED, MEDIUM_DASH_DOT_DOTTED, SLANTED_MEDIUM_DASH_DOTTED, or 0x00 through 0x0D.
    borders.right = xlwt.Borders.DASHED
    borders.top = xlwt.Borders.DASHED
    borders.bottom = xlwt.Borders.DASHED
    borders.left_colour = 0x40
    borders.right_colour = 0x40
    borders.top_colour = 0x40
    borders.bottom_colour = 0x40
    style = xlwt.XFStyle() # Create Style
    style.borders = borders # Add Borders to Style
    worksheet.write(0, 0, 'Cell Contents', style)
    workbook.save('Excel_Workbook.xls')

    (9)为单元格设置背景色

    import xlwt
    workbook = xlwt.Workbook()
    worksheet = workbook.add_sheet('My Sheet')
    pattern = xlwt.Pattern() # Create the Pattern
    pattern.pattern = xlwt.Pattern.SOLID_PATTERN # May be: NO_PATTERN, SOLID_PATTERN, or 0x00 through 0x12
    pattern.pattern_fore_colour = 5 # May be: 8 through 63. 0 = Black, 1 = White, 2 = Red, 3 = Green, 4 = Blue, 5 = Yellow, 6 = Magenta, 7 = Cyan, 16 = Maroon, 17 = Dark Green, 18 = Dark Blue, 19 = Dark Yellow , almost brown), 20 = Dark Magenta, 21 = Teal, 22 = Light Gray, 23 = Dark Gray, the list goes on...
    style = xlwt.XFStyle() # Create the Pattern
    style.pattern = pattern # Add Pattern to Style
    worksheet.write(0, 0, 'Cell Contents', style)
    workbook.save('Excel_Workbook.xls')
  • 相关阅读:
    第十三周编程总结
    第十二周总结
    第十一周课程总结
    第十周编程总结
    第七次实验报告及编程总结
    第六次实验报告及学习总结
    课程总结
    第十四周课程总结&实验报告
    第十三周课程总结
    第十二周总结
  • 原文地址:https://www.cnblogs.com/yangmingxianshen/p/9176461.html
Copyright © 2020-2023  润新知