Python openpyxl 库

作者: 大梦三千秋 | 来源:发表于2020-03-29 18:06 被阅读0次

    openpyxl 库


    简介


    openpyxl 是一个用于读取/写入 Excel 2010 xlsx/xlsm/xltx/xltm 文件的 Python 库

    Excel 文件


    这里介绍下一些基本定义:Excel 电子表格文档称为工作簿。单个工作簿保存在扩展名为 .xlsx 的文件中。每个工作簿可以包含多个工作表。

    安装 openpyxl 模块


    openpyxl 是一个第三方模块,当要用于处理 Excel 文件时,须先安装。使用以下的命令进行安装

    $ pip install openpyxl
    

    创建工作簿


    可以通过导入 openpyxl 的 Workbook 类来创建工作簿(workbook)。例如:

    >>> from openpyxl import Workbook
    >>> wb = Workbook()
    

    创建工作簿后,至少有一个工作表(worksheet)。可以使用 Workbook.active 属性来获取:

    >>> ws = wb.active
    

    默认情况下,这个方法获取的是第一个工作表

    创建新的工作表 ,可以使用 Workbook.create_sheet() 方法:

    >>> ws1 = wb.create_sheet('Mysheet')
    >>> ws2 = wb.create_sheet('Mysheet', 0)
    >>> ws3 = wb.create_sheet('Mysheet', -1)
    

    创建新工作表的时候,会自动赋予一个名字。会按照(Sheet,Sheet1,Sheet2)这样的顺序依次赋值 。不过能够通过 Worksheet.title 属性来修改这个名称。

    ws.title = "New Title"
    

    如果想要查看一个工作簿中所有工作表的名称,可以通过 Workbook.sheetname 属性来进行查看:

    >>> wb.sheetnames
    ['Mysheet1', 'New Title', 'Mysheet2', 'Mysheet']
    

    当然也可以用循环遍历的方式:

    >>> for sheet in wb:
    ...     print(sheet)
    ...
    <Worksheet "Mysheet1">
    <Worksheet "New Title">
    <Worksheet "Mysheet2">
    <Worksheet "Mysheet">
    

    处理数据


    当创建完工作簿以及工作表后,现在就可以考虑修改单元格的内容。单元格能够作为工作表的键直接访问:

    >>> c = ws['A1']
    

    这个时候,将会返回 A1 处单元格,如果不存在的话,则创建一个。这个时候,可以直接赋值:

    >>> ws['A1'] = 3
    

    除了用这种大写字母(表示列)加数字(表示行)的形式来访问单元格。

    还可以通过 Worksheet.cell()方法直接使用行和列的表示法来访问单元格:

    >>> a = ws.cell(row=3, column=1, value=8)
    

    访问多个单元格

    当需要访问多个单元格的时候,可以使用切片的方法。当访问一个区域可以参考如下写法:

    >>> cell_range = ws['A1':'D3']
    

    当访问多行或多列时,可以使用如下的方法:

    >>> col_c =  ws['C']
    >>> col_range = ws['C':'D']
    >>> row_10 = ws[10]
    >>> row_range = ws[5:10]
    

    除了使用上面切片的方法。同样可以使用 Worksheet.iter_rows() 方法访问,这个方法将逐行返回:

    >>> for row in ws.iter_rows(min_row=1, max_col=3, max_row=
    2):
    ...     for cell in row:
    ...         print(cell)
    ...
    <Cell 'New Title'.A1>
    <Cell 'New Title'.B1>
    <Cell 'New Title'.C1>
    <Cell 'New Title'.A2>
    <Cell 'New Title'.B2>
    <Cell 'New Title'.C2>
    

    同样的,还有 Worksheet.iter_cols() 方法,这个方法将逐列返回:

    >>> for col in ws.iter_cols(min_row=1, max_col=3, max_row=
    2):
    ...     for cell in col:
    ...         print(cell)
    ...
    <Cell 'New Title'.A1>
    <Cell 'New Title'.A2>
    <Cell 'New Title'.B1>
    <Cell 'New Title'.B2>
    <Cell 'New Title'.C1>
    <Cell 'New Title'.C2>
    

    这里有需要注意的地方,Worksheet.iter_cols 方法在只读模式下不可用。

    如果需要遍历的是文件中所有的行或列,则可以考虑 Worksheet.rows 属性:

    >>> ws = wb.active
    >>> ws['C4'] = 'Hello World!'
    >>> tuple(ws.rows)
    ((<Cell 'Mysheet1'.A1>, <Cell 'Mysheet1'.B1>, <Cell 'Mysheet1'.C1>),
     (<Cell 'Mysheet1'.A2>, <Cell 'Mysheet1'.B2>, <Cell 'Mysheet1'.C2>),
     (<Cell 'Mysheet1'.A3>, <Cell 'Mysheet1'.B3>, <Cell 'Mysheet1'.C3>),
     (<Cell 'Mysheet1'.A4>, <Cell 'Mysheet1'.B4>, <Cell 'Mysheet1'.C4>))
    

    或者 Worksheet.columns 属性:

    >>> tuple(ws.columns)
    ((<Cell 'Mysheet1'.A1>,
      <Cell 'Mysheet1'.A2>,
      <Cell 'Mysheet1'.A3>,
      <Cell 'Mysheet1'.A4>),
     (<Cell 'Mysheet1'.B1>,
      <Cell 'Mysheet1'.B2>,
      <Cell 'Mysheet1'.B3>,
      <Cell 'Mysheet1'.B4>),
     (<Cell 'Mysheet1'.C1>,
      <Cell 'Mysheet1'.C2>,
      <Cell 'Mysheet1'.C3>,
      <Cell 'Mysheet1'.C4>))
    

    返回单元格的值


    如果只是需要返回工作表中单元格的值,可以使用 Worksheet.values 属性。

    该方法将遍历工作表中所有行,但仅返回单元格中的值。

    >>> for row in ws.values:
    ...     for value in row:
    ...         print(value)
    ...
    None
    None
    None
    None
    None
    None
    None
    None
    None
    Hello World!
    None
    Hello World!
    

    保存数据到文件中


    保存工作簿,可以使用 Workbook 对象的 Workbook.save() 方法:

    >>> wb.save('temp.xlsx')
    

    打开保存的文件,可以看到,下面的工作表名,正是上面创建的表名。

    文件信息

    以及上面使用方法插入表格中的内容。

    表格内容

    加载文件


    当加载文件,可以使用 openpyxl.load_workbook() 方法来打开一个本地存在的文件:

    >>> from openpyxl import load_workbook
    >>> wb2 = load_workbook('temp.xlsx')
    >>> wb2.sheetnames
    ['Mysheet1', 'New Title', 'Mysheet2', 'Mysheet']
    

    补充


    插入时间

    >>> import datetime
    >>> from openpyxl import load_workbook
    >>> wb2 = load_workbook('temp.xlsx')
    >>> ws = wb2.active
    >>> ws.title
    'Mysheet1'
    >>> ws['A1'] = datetime.datetime.now()
    >>> ws['A1'].value
    datetime.datetime(2020, 3, 29, 16, 29, 21, 786731)
    >>> ws['A1'].number_format
    'yyyy-mm-dd h:mm:ss'
    

    使用公式

    可以直接将 Excel 的公式,用字符串的格式赋值给某个单元格,如下:

    >>> ws['A2'] = '=SUM(1,1)'
    >>> ws['A2'].value
    '=SUM(1,1)'
    

    合并/拆分单元格

    当需要合并和拆分单元格时,可以使用 worksheet.merge_cells() 方法以及 worksheet.unmerge_cells() 方法:

    >>> ws.merge_cells('A2:B2')
    >>> # 先将 A3:B3 合并,再尝试拆分
    ... ws.merge_cells('A3:B3')
    >>> ws.unmerge_cells('A3:B3')
    

    加载图像

    这一步依赖 Pillow 库,所以使用之前需要先安装 Pillow 库。

    >>> from openpyxl.drawing.image import Image
    >>> img = Image('k.jpg')
    >>> ws.add_image(img, 'A5')
    >>> wb.save('temp_1.xlsx')
    

    以上用法结果展示

    简单用法-结果展示

    在这张图片可以看到,A1 插入的时间已经生效。

    A2 显示的结果是 2,红色标记的部分,表示这个结果是用这个公式得到的结果,也就说明公式插入也是生效的。

    同时可以看到,A2:B2 单元格已经合并。

    最后是插入图片,可以看到在 A5 单元格,成功插入了一张图片。


    以上内容就是关于 openpyxl 库对 Excel 文件进行处理的简单用法。


    欢迎关注微信公众号《书所集录》

    相关文章

      网友评论

        本文标题:Python openpyxl 库

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