zoukankan      html  css  js  c++  java
  • python读写Excel

    Python读写excel

    对于python 处理excel 表格,这个日常工作的需求还是不少,于是查查资料,自己写写,总结一下,记录一下,下次遇到直接拿过来用,方便自己,方便大家。

    好在python有读写excel package很方便。

    • xlrd:用于读Excel文件
    • xlwt:写Excel包,文件后缀名为.xls,最多只能存65536行数据(2的16次方)
    • xlsxwriter:也是写Excel包,文件后缀名.xlsx,最大支持1048576(2的20次方)行数据,16384(2的14次方)列数据
    • openpyxl:既能读也能写,非常厉害,还能插入删除一行一列,后缀名是.xlsx

    一,xlrd,xlwt 使用

    ## 1,导入模块
    import xlrd
    ## 2, 打开Excel文件读取数据
    data = xlrd.open_workbook('excel.xls')
    
    ##3,获取一个工作表
    table = data.sheets()[0]          #通过索引顺序获取
    table = data.sheet_by_index(0) #通过索引顺序获取
    table = data.sheet_by_name(u'Sheet1')#通过名称获取
    
    ## 4,获取整行和整列的值(返回数组)
    table.row_values(i)
    table.col_values(i)
    
    ## 5,获取行数和列数 
    table.nrows
    table.ncols
    
    ## 6,获取单元格
    table.cell(0,0).value
    table.cell(2,3).value
    
    

    就我自己使用的时候觉得还是获取cell最有用,这就相当于是给了你一个二维数组,余下你就可以想怎么干就怎么干了。得益于这个十分好用的库代码很是简洁。但是还是有若干坑的存在导致话了一定时间探索。现在列出来:

    1、首先就是我的统计是根据姓名统计各个表中的信息的,但是调试发现不同的表中各个名字貌似不能够匹配,开始怀疑过编码问题,不过后来发现是因为空格。因为在excel中输入的时候很可能会顺手在一些名字后面加上几个空格或是tab键,这样看起来没什么差别,但是程序处理的时候这就是两个完全不同的串了。我的解决方法是给每个获取的字符串都加上strip()处理一下。效果良好

    2、还是字符串的匹配,在判断某个单元格中的字符串(中文)是否等于我所给出的的时候发现无法匹配,并且各种unicode也不太奏效,百度过一些解决方案,但是都比较复杂或是没用。最后我采用了一个比较变通的方式:直接从excel中获取我想要的值再进行比较,效果是不错就是通用行不太好,不过问题还没解决。

    #导入xlwt模块
    import xlwt
    # 创建一个Workbook对象,这就相当于创建了一个Excel文件
    book = xlwt.Workbook(encoding='utf-8', style_compression=0)
    '''
    Workbook类初始化时有encoding和style_compression参数
    encoding:设置字符编码,一般要这样设置:w = Workbook(encoding='utf-8'),就可以在excel中输出中文了。
    默认是ascii。当然要记得在文件头部添加:
    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
    style_compression:表示是否压缩,不常用。
    '''
    #创建一个sheet对象,一个sheet对象对应Excel文件中的一张表格。
    # 在电脑桌面右键新建一个Excel文件,其中就包含sheet1,sheet2,sheet3三张表
    sheet = book.add_sheet('test', cell_overwrite_ok=True)
    # 其中的test是这张表的名字,cell_overwrite_ok,表示是否可以覆盖单元格,其实是Worksheet实例化的一个参数,默认值是False
    # 向表test中添加数据
    sheet.write(0, 0, 'EnglishName')  # 其中的'0-行, 0-列'指定表中的单元,'EnglishName'是向该单元写入的内容
    sheet.write(1, 0, 'Marcovaldo')
    txt1 = '中文名字'
    sheet.write(0, 1, txt1.decode('utf-8'))  # 此处需要将中文字符串解码成unicode码,否则会报错
    txt2 = '马可瓦多'
    sheet.write(1, 1, txt2.decode('utf-8'))
     
    # 最后,将以上操作保存到指定的Excel文件中
    book.save(r'e:\test1.xls')  # 在字符串前加r,声明为raw字符串,这样就不会处理其中的转义了。否则,可能会报错
    
    

    建议还是用ascii编码,不然可能会有一些诡异的现象。

    二,xlsxwriter使用

    #coding:utf-8
    import xlsxwriter
     
    workbook=xlsxwriter.Workbook('demo1.xlsx')#创建一个excel文件
    worksheet=workbook.add_worksheet(u'sheet1')#在文件中创建一个名为TEST的sheet,不加名字默认为sheet1
     
    worksheet.set_column('A:A',20)#设置第一列宽度为20像素
    bold=workbook.add_format({'bold':True})#设置一个加粗的格式对象
     
    worksheet.write('A1','HELLO')#在A1单元格写上HELLO
    worksheet.write('A2','WORLD',bold)#在A2上写上WORLD,并且设置为加粗
    worksheet.write('B2',U'中文测试',bold)#在B2上写上中文加粗
     
    worksheet.write(2,0,32)#使用行列的方式写上数字32,35,5
    worksheet.write(3,0,35.5)#使用行列的时候第一行起始为0,所以2,0代表着第三行的第一列,等价于A4
    worksheet.write(4,0,'=SUM(A3:A4)')#写上excel公式
    
    workbook.close()
    
    

    三,用openpyxl向Excel插入一行或一列

    功能非常强大,文档主页点这里

    • 插入列用insert_cols
    • 插入行用insert_rows

    读并加一列示例:

    import openpyxl
    
    wb = openpyxl.load_workbook('0.xlsx')
    ws = wb.worksheets[0]
    # 在第3列之前插入数据,这里序号是从1开始的
    ws.insert_cols(3)
    # 插入数据
    for index, row in enumerate(ws.rows):#按行读取
        if index == 0:
            row[2].value = '新字段'
        else:
            row[2].value = index
    wb.save('0_new.xlsx')
    

    写示例:

    import openpyxl
    wb = openpyxl.Workbook()#创建一个表
    sheet = wb.active#找到活动sheet页,
    sheet.title = 'New Sheet'
    sheet['C3'] = 'hello world'#这里读取是一样的,按cell读
    for i in range(10):
        sheet["A%d" % (i+1)].value = i + 1
    
    sheet["E1"].value = "=SUM(A:A)"#还可以写公式
    wb.save('新的excel.xlsx')
    
    
    
  • 相关阅读:
    iBatis.Net(4):DataMapper API
    【转】一步一步学Linq to sql(七):并发与事务
    【转】一步一步学Linq to sql(五):存储过程
    iBatis.Net(5):Data Map
    【转】一步一步学Linq to sql(三):增删改
    iBatis.Net(6):Data Map(深入)
    【转】一步一步学Linq to sql(四):查询句法
    【转】一步一步学Linq to sql(二):DataContext与实体
    .NET自动字符编码识别程序库 NChardet
    SQL UNIQUE Constraint
  • 原文地址:https://www.cnblogs.com/michaelcjl/p/11797700.html
Copyright © 2011-2022 走看看