zoukankan      html  css  js  c++  java
  • python操作excel

    一、openpyxl介绍安装

    1.为什么要学Excel

         工作中不可避免的要用到excel,这点是非常重要的,这里主要介绍下python的openpyxl模块操作excel的一些方法。

         官方介绍文档地址:https://openpyxl.readthedocs.io/en/latest/usage.html,可以在这里直接下载HTML格式的说明文档,方便在有网络限制的时候查阅。

     

    2.安装openpyxl

    python中与excel操作相关的模块:

    • xlrd库:从excel中读取数据,支持xls、xlsx
    • xlwt库:对excel进行修改操作,不支持对xlsx格式的修改
    • xlutils库:在xlw和xlrd中,对一个已存在的文件进行修改。
    • openpyxl:主要针对xlsx格式的excel进行读取和编辑。

     

    安装方式:pip install openpyxl

    3.Excel中的三大对象

    • WorkBook:工作簿对象
    • Sheet:表单对象
    • Cell:表格对象

    二、openpyxl对Excel的操作

    • 创建一个工作薄:

        wb = openpyxl.Workbook()

    • 新增一个sheet表单:

        wb.create_sheet('test_case')

    • 保存case.xlsx文件:

        wb.save('cases.xlsx')

    • 打开已有的工作簿:

        wb = openpyxl.load_workbook('cases.xlsx')

    • 选取sheet页:

        指定获取名为Sheet1的sheet页:sh = wb['Sheet1'] 或者wb.get_sheet_by_name('Sheet1')

        获取所有sheet页的名称:wb.get_sheet_names()

        获得sheet名: sh.title

        获得当前正在显示的sheet, sheet =wb.active,也可以用wb.get_active_sheet()
    • 获取单元格:
        # 获取某个单元格的值,观察excel发现也是先字母再数字的顺序,即先列再行
        b4 =sheet['B4']
        # 分别返回
        print(f'({b4.column}, {b4.row}) is {b4.value}') # 返回的数字就是int型
        # 除了用下标的方式获得,还可以用cell函数, 换成数字,这个表示B2
        b4_too =sheet.cell(row=4, column=2)
        print(b4_too.value)

        b4.column返回B, b4.row返回4, value则是那个单元格的值。另外cell还有一个属性coordinate, 像b4这个单元格返回的是坐标B4。

        直接通过单元格的绝对位置B4去获取值会方便的多。

                  下面的方法可以转化字母列号和数字列号的转换:

          from openpyxl.utils import get_column_letter, column_index_from_string
          # 根据列的数字返回字母
          print(get_column_letter(2))  # B
          # 根据字母返回列的数字
          print(column_index_from_string('D'))  # 4

    • 获取最大行总数、最大列总数:

        sh.max_row、sh.max_column

    • 获取行和列:

        sheet.rows为生成器, 里面是每一行的数据,每一行又由一个tuple包裹。

        sheet.columns类似,不过里面是每个tuple是每一列的单元格。

        # 因为按行,所以返回A1, B1, C1这样的顺序

          for row in sheet.rows:
             for cell in row:
              print(cell.value)
        # A1, A2, A3这样的顺序
          for column in sheet.columns:
            for cell in column:
               print(cell.value)
     

        上面的代码就可以获得所有单元格的数据。如果要获得某行的数据呢?给其一个索引就行了,因为sheet.rows是生成器类型,不能使用索引,转换成list之后再使用索引,list(sheet.rows)[2]这样就获取到第二行的tuple对象。

          for cell in list(sheet.rows)[2]:
             print(cell.value)
    •  获取任意区间的单元格:

        可以使用range函数,下面的写法,获得了以A1为左上角,B3为右下角矩形区域的所有单元格。注意range从1开始的,因为在openpyxl中为了和Excel中的表达方式一致,并不和编程语言的习惯以0表示第一个值。

        for i in range(1, 4):

          for j in range(1, 3):
            print sheet.cell(row=i, column=j).value
        还可以像使用切片那样使用。sheet['A1':'B3']返回一个tuple,该元组内部还是元组,由每行的单元格构成一个元组。
          for row_cell in sheet['A1':'B3']:
            for cell in row_cell:
              print(cell)
    • 写入单元格:

        # 直接给单元格赋值就行

          sheet['A1'] = 'good'

        # 根据索引赋值

          sheet.cell(column=col, row=row, value="good")

         # 可以一次添加多行数据,从第一行空白行开始(下面都是空白行)写入。
              row = [1 ,2, 3, 4, 5]
          sheet.append(row)
         # 添加多行
          rows = [
         ['Number', 'data1', 'data2'],
         [2, 40, 30],
         [3, 40, 25],
         [4, 50, 30],
         [5, 30, 10],
         [6, 25, 5],
         [7, 50, 10],
          ]
         sheet.append(rows)

        由于append函数只能按行写入。如果我们想按列写入呢。append能实现需求么?如果把上面的列表嵌套看作矩阵。只要将矩阵转置就可以了。使用zip()函数可以实现,不过内部的列表变成了元组就是了。都是可迭代对象,不影响。

        list(zip(*rows))
                   # out    
        [('Number', 2, 3, 4, 5, 6, 7),('data1', 40, 40, 50, 30, 25, 50),('data2', 30, 25, 30, 10, 5, 10)]
     

        解释下上面的list(zip(*rows))首先*rows将列表打散,相当于填入了若干个参数,zip从某个列表中提取第1个值组合成一个tuple,再从每个列表中提取第2个值组合成一个tuple,一直到最短列表的最后一个值提取完毕后结束,更长列表的之后的值被舍弃,换句话,最后的元组个数是由原来每个参数(可迭代对象)的最短长度决定的。比如现在随便删掉一个值,最短列表长度为2,data2那一列(竖着看)的值全部被舍弃。

        rows = [
         ['Number', 'data1', 'data2'],
         [2, 40],
         [3, 40, 25],
         [4, 50, 30],
         [5, 30, 10],
         [6, 25, 5],
          [7, 50, 10],
          ]
          # out
          [('Number', 2, 3, 4, 5, 6, 7), ('data1', 40, 40, 50, 30, 25, 50)]

        最后zip返回的是zip对象,看不到数据的。使用list转换下就好了。使用zip可以方便实现将数据按列写入。

    • 给单元格添加注释

        >>> from openpyxl import Workbook
        >>> from openpyxl.comments import Comment
        >>> wb = Workbook()
        >>> ws = wb.active
        >>> comment = ws["A1"].comment
        >>> comment = Comment('This is the comment text', 'Comment Author')
        >>> comment.text
        'This is the comment text'
        >>> comment.author
        'Comment Author'

    • 获取单元格的颜色

        这一块忘了,后面补充  

    • 关闭工作薄:

        wb.close()

    • del 删除表单的用法:

        del wb['sheet_name'] 

    • remove 删除表单的用法:

        sh = wb['sheet_name']

        wb.remove(sh)

     
  • 相关阅读:
    boost::asio在VS2008下的编译错误
    Java集合框架——接口
    ACM POJ 3981 字符串替换(简单题)
    ACM HDU 1042 N!(高精度计算阶乘)
    OneTwoThree (Uva)
    ACM POJ 3979 分数加减法(水题)
    ACM HDU 4004 The Frog's Games(2011ACM大连赛区第四题)
    Hexadecimal View (2011ACM亚洲大连赛区现场赛D题)
    ACM HDU 4002 Find the maximum(2011年大连赛区网络赛第二题)
    ACM HDU 4001 To Miss Our Children Time (2011ACM大连赛区网络赛)
  • 原文地址:https://www.cnblogs.com/GHNSL/p/12297138.html
Copyright © 2011-2022 走看看