美文网首页
用Python让Excel飞起来——基本操作(二)

用Python让Excel飞起来——基本操作(二)

作者: 南太湖小蚂蚁 | 来源:发表于2021-11-28 14:16 被阅读0次

    上一篇文章我们实现了通过xlrd,xlwt和xlutils对Excel的读取和写入,并进行修改。但是xlrd等模块还存在一定的问题:仅仅支持对旧格式的.xls文件进行读写,而且无法修改原始Excel等等。因此我们这次使用openpyxl和pandas库来对Excel进行操作。
    下面我们首先来看一下如何用openpyxl包来读写Excel,首先我们需要导入openpyxl包(如果没有安装的话,可以使用pip install openpyxl来安装)
    总体上的读取方法与xlrd类似,不过API更加简单明了。读取Excel之前,我们需要先调用load_workbook方法来加载Excel。通过get_sheet_by_name()方法获取相应的sheet,或者通过get_active_sheet()方法获取当前活动的sheet。这里有一个要注意的地方,就是openpyxl的行列都是从1开始的,不像通常从0开始,因此在读取单元格的时候要+1,其余的部分就和xlrd类似了,代码如下:

    import openpyxl
    
    ## 读取Excel表格内容
    def read_excel(fileName='D:/Book1.xlsx'):
        wb = openpyxl.load_workbook(fileName)
        sheet = wb.get_sheet_by_name('Sheet1')
        nrows = sheet.max_row
        ncols = sheet.max_column
        ## 注意:openpyxl的行列数是从1开始计算的,因此通过sheet.cell()获取表单的值的时候需要从1开始
        for i in range(nrows):
            for j in range(ncols):
                print(sheet.cell(i+1,j+1).value, end=' ')
            print()
        
    read_excel()
    
    读取结果

    计算平均分的方法与前文类似

    ## 计算个人平均分
    def get_average(fileName='D://Book1.xlsx'):
        avg_dict = {}
        wb = openpyxl.load_workbook(fileName)
        sheet = wb.get_sheet_by_name('Sheet1')
        nrows = sheet.max_row
        ncols = sheet.max_column
        for row in range(1,nrows):
            avg = 0.0
            for col in range(1,ncols):
                avg += float(sheet.cell(row+1, col+1).value) ## 计算每一个学生的总分
            avg /= (ncols-1) ## 总分除以课程数即是平均分
            avg_dict[sheet.cell(row+1, 1).value] = avg ## 每行的第一列是学生姓名,用作字典的键,平均分作为值
        print(avg_dict)
        return avg_dict
    
    avg_dict = get_average()
    

    这里,我们先将平均分写入到一个新建的Excel工作表中,实现与上一篇文章类似的功能。新建Excel需要先通过openpyxl.Workbook()方法来获取一个新的Excel文档,通过active属性得到可访问的工作表sheet。接下来只要在表格中填入数据即可,需要注意的是序列号是从1开始的。

    ## 将字典写入到Excel中
    def write_excel(value_dict, resultName='D://Book2.xlsx'):
        wb = openpyxl.Workbook()
        sheet = wb.active
        #sheet = wb.create_sheet()
        ## 先在标题栏加入“姓名”和“平均分”列
        sheet.cell(1,1).value = '姓名'
        sheet.cell(1,2).value = '平均分'
        ## 遍历字典,写入姓名和平均分
        row = 2
        for key in value_dict.keys():
            sheet.cell(row,1).value = key
            sheet.cell(row,2).value = value_dict[key]
            row+=1
        wb.save(resultName)
        
    write_excel(avg_dict)
    

    以上做法我们是将结果存入到新建的Excel的,如我们想要直接更新原始的Excel,用xlwt是无法做到的,但是openpyxl可以比较方便的实现此功能。我们在创建一个Excel文档并获取到sheet后,在表格的第一行和的最后一列之后添加一个新列,标题是“平均分”,然后遍历每一行,将每一行的第二列的值(也就是学生姓名)与字典表的键进行对应,若与键相同,则将值作为平均分,并写入到这一行的最后一列中。

    ## 修改原有的Excel
    def update_excel(value_dict, fileName='D://Book3.xlsx'):
        wb = openpyxl.load_workbook(fileName)
        sheet = wb.get_sheet_by_name('Sheet1') 
        nrows = sheet.max_row
        ncols = sheet.max_column
        sheet.cell(1, ncols+1).value = '平均分' ## 在标题栏上添加一列平均分
        ## 遍历每一行,得到学生姓名,根据姓名在字典中查询到平均分,并写入到Excel中,实现更新Excel
        for i in range(1,nrows):
            for key in value_dict.keys():
                name = sheet.cell(i+1,1).value
                if name==key:
                    sheet.cell(i+1, ncols+1).value = value_dict[key]
        wb.save(fileName)
    
    update_excel(avg_dict)            
    

    更新后,效果如图。


    更新结果

    接下来,我们看看用pandas如何读写Excel,其实用pandas操作Excel数据是最方便的,pandas读取Excel成一个DataFrame,然后就可以使用pandas的函数对数据进行各种处理了。
    导入pandas后,读取一个Excel只需要一行代码:

    import pandas as pd
    
    ## 读取Excel
    df = pd.read_excel('D://Book1.xlsx', sheet_name='Sheet1')
    

    在jupyter中可以看到输出结果:


    读取Excel

    同样的,计算平均分也非常简单,也是只有一行代码:

    ## 用pandas获取每个学生平均分
    df["平均分"] = df.mean(axis=1) #axis 0为列,1为行
    

    这里其实就是对每一行求平均值,pandas会自动对数字型求和,行中有字符型数据也不会报错。
    可以看到平均分已经计算出来了,并修改了Excel。


    计算平均分并修改Excel

    将修改后的结果出入到Excel依然只需要一行代码:

    df.to_excel("D:/Book4.xlsx", index=False) ## 加入index=False,表示不需要写入索引
    
    写入新的Excel

    可以看到数据已经被写入到新的Excel中。
    pandas确实是最方便的工具包,之前我们用xlrd,xlwt和openpyxl写了很多行代码的功能,在pandas中三句话就搞定了,效率之高的确值得肯定。
    下一篇文章,我会研究一下怎么使用一些Python工具包对Excel表格调整格式。

    微信公众“小晖程序”同步更新。

    相关文章

      网友评论

          本文标题:用Python让Excel飞起来——基本操作(二)

          本文链接:https://www.haomeiwen.com/subject/jxdbtrtx.html