• python使用openpyxl操作execl


    openpyxl

    openpyxl可以用来对excel进行操作,但只能操作xlsx文件而不能操作xls文件。

    主要用到三个概念:Workbooks,Sheets,Cells。
    Workbook就是一个excel工作薄;
    Sheet是工作表中的一张工作表;
    Cell就是简单的一个格。
    openpyxl就是围绕着这三个概念进行的:打开Workbook,定位Sheet,操作Cell。

    读取与创建

    读取Workbooks

    可以导入openpyxl.load_workbook()来打开一个已经存在的workbook:

    >>> from openpyxl import load_workbook
    >>> wb2 = load_workbook('test.xlsx')
    >>> print wb2.get_sheet_names()
    ['Sheet2', 'New Title', 'Sheet1']
    
     

    创建Workbooks与Sheets

    在刚开始使用openpyxl的时候,不需要直接在文件系统中创建一个文件,仅仅需要导入Workbook类并开始使用它:

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

    一个workbook总是会创建至少一个worksheet(工作表),可以通过openpyxl.workbook.Workbook.active()这个属性去获取:

    >>> ws = wb.active

    这个函数使用_active_sheet_index这个属性,默认设置的值是0,除非你指定一个值,否则总是获取到第一个worksheet。

    你可以使用openpyxl.workbook.Workbook.create_sheet()来创建一个新的worksheet:

    >>> ws1 = wb.create_sheet("Mysheet") # insert at the end (default)# or
    >>> ws2 = wb.create_sheet("Mysheet", 0) # insert at first position

    当创建脚标的时候会自动创建一个名字,按照(Sheet, Sheet1, Sheet2, ...)这个列表名创建,你可以使用tiitle属性来修改这个名字:

    >>> ws.title = "New Title"

    一旦给了一个worksheet名字,就可以通过一个key去获取这个worksheet:

    >>> ws3 = wb["New Title"]

    你可以使用openpyxl.workbook.Workbook.sheetnames()这个属性获取所有的脚标的名字:

    >>> print(wb.sheetnames)['Sheet2', 'New Title', 'Sheet1']

    可以迭代所有的脚标:

    >>> for sheet in wb:
    ... print(sheet.title)

    可以使用openpyxl.workbook.Workbook.copy_worksheet()这个属性复制一个worksheet:

    >>> source = wb.active
    >>> target = wb.copy_worksheet(source)

    注意:只有cells 和 styles能够被复制,不能在workbooks之间复制worksheets,你可以在一个workbook中复制worksheets

    数据操作

    获取一个cell

    现在我们已经知道怎么访问一个worksheet,我们可以开始修改cell的内容了。(一个cell就是一个单元格)
    cell可以直接通过key来获取:

    >>> c = ws['A4']

    这将会返回一个cell或创建一个不存在的cell。cell 的值可以直接被赋值:

    >>> ws['A4'] = 4

    也可以使用另外一个方法openpyxl.worksheet.Worksheet.cell():

    >>> d = ws.cell(row=4, column=2, value=10)

    Note:当在内存当中创建一个worksheet的时候,它没有包含任何cell,当它们第一次被访问的时候被创建

    Warning:因为excel表的滚动特性,滚动出来的cell也会被创建出来,即使没有访问那些cell,例如:

    >>> for i in range(1,101):
    ... for j in range(1,101):
    ... ws.cell(row=i, column=j)

    这将会创建100*100个空的cell

    访问多个cell

    使用切片可以访问多个cell

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

    行和列能够被轻松的获取到:

    >>> colC = ws['C']
    >>> col_range = ws['C:D']
    >>> row10 = ws[10]
    >>> row_range = ws[5:10]

    也可以使用openpyxl.worksheet.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 Sheet1.A1>
    <Cell Sheet1.B1>
    <Cell Sheet1.C1>
    <Cell Sheet1.A2>
    <Cell Sheet1.B2>
    <Cell Sheet1.C2>

    相似的方法openpyxl.worksheet.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 Sheet1.A1>
    <Cell Sheet1.A2>
    <Cell Sheet1.B1>
    <Cell Sheet1.B2>
    <Cell Sheet1.C1>
    <Cell Sheet1.C2>

    如果你想迭代一个文件的所有行或列,可以使用openpyxl.worksheet.Worksheet.rows()这个属性:

    >>> ws = wb.active
    >>> ws['C9'] = 'hello world'
    >>> tuple(ws.rows)
    ((<Cell Sheet.A1>, <Cell Sheet.B1>, <Cell Sheet.C1>),
    (<Cell Sheet.A2>, <Cell Sheet.B2>, <Cell Sheet.C2>),
    (<Cell Sheet.A3>, <Cell Sheet.B3>, <Cell Sheet.C3>),
    (<Cell Sheet.A4>, <Cell Sheet.B4>, <Cell Sheet.C4>),
    (<Cell Sheet.A5>, <Cell Sheet.B5>, <Cell Sheet.C5>),
    (<Cell Sheet.A6>, <Cell Sheet.B6>, <Cell Sheet.C6>),
    (<Cell Sheet.A7>, <Cell Sheet.B7>, <Cell Sheet.C7>),
    (<Cell Sheet.A8>, <Cell Sheet.B8>, <Cell Sheet.C8>),
    (<Cell Sheet.A9>, <Cell Sheet.B9>, <Cell Sheet.C9>))

    或者openpyxl.worksheet.Worksheet.columns()这个属性:

    >>> tuple(ws.columns)
    ((<Cell Sheet.A1>,
    <Cell Sheet.A2>,
    <Cell Sheet.A3>,
    <Cell Sheet.A4>,
    <Cell Sheet.A5>,
    <Cell Sheet.A6>,
    ...
    <Cell Sheet.B7>,
    <Cell Sheet.B8>,
    <Cell Sheet.B9>),
    (<Cell Sheet.C1>,
    <Cell Sheet.C2>,
    <Cell Sheet.C3>,
    <Cell Sheet.C4>,
    <Cell Sheet.C5>,
    <Cell Sheet.C6>,
    <Cell Sheet.C7>,
    <Cell Sheet.C8>,
    <Cell Sheet.C9>))


    数据存储

    一旦我们有了一个openpyxl.cell.Cell,我们就可以给它赋值:

    >>> c.value = 'hello, world'
    >>> print(c.value)'hello, world'
    >>> d.value = 3.14
    >>> print(d.value)3.14

    也能使用类型和格式推断:

    >>> wb = Workbook(guess_types=True)
    >>> c.value = '12%'
    >>> print(c.value)
    0.12
    >>> import datetime
    >>> d.value = datetime.datetime.now()
    >>> print d.valuedatetime.datetime(2010, 9, 10, 22, 25, 18)
    >>> c.value = '31.50'
    >>> print(c.value)
    31.5


    保存到文件

    最简单和快速的保存一个workbook方法是使用openpyxl.workbook.Workbook模块的openpyxl.workbook.Workbook.save()这个方法:

    >>> wb = Workbook()
    >>> wb.save('balances.xlsx')

    Warning:这个方法将会在没有警告提示下覆盖已经有的内容
    可以使用template=True将一个workbook保存成一个模版:

    >>> wb = load_workbook('document.xlsx')
    >>> wb.template = True
    >>> wb.save('document_template.xltx')

    或者设置这个属性为false(默认)来保存为一个文件:

    >>> wb = load_workbook('document_template.xltx')
    >>> wb.template = False
    >>> wb.save('document.xlsx', as_template=False)

    *Warning:当保存文档的时候在模版文档中你应该注意文档的扩展名(后缀名)和数据描述,否则可能会导致文档不能被再次打开,如下错误式例:
    注解 以下操作将失败:

    >>> wb = load_workbook('document.xlsx')
    >>> # 应该保存成扩展名为*.xlsx
    >>> wb.save('new_document.xlsm')
    >>> # Excel软件不能再次打开此文件
    >>>
    >>> # 或者
    >>>
    >>> # 应该指定属性keep_vba=True
    >>> wb = load_workbook('document.xlsm')
    >>> wb.save('new_document.xlsm')
    >>> # Excel软件不能再次打开此文件
    >>>
    >>> # 或者
    >>>
    >>> wb = load_workbook('document.xltm', keep_vba=True)
    >>> # 如果我们需要一个模版文件,就必须指定扩展名为 *.xltm.
    >>> wb.save('new_document.xlsm')
    >>> # Excel软件不能再次打开此文件
    
     

     原文链接

     更多阅读:

    Working with Excel Spreadsheets

    openpyxl简单用法

  • 相关阅读:
    vmware Unable to open kernel device "\.Globalvmx86": The system cannot find the file 的解决方法
    nc和telnet配合使用
    linux下批量替换文件内容
    Linux动态库的导出控制
    goang Receiver & interface
    Go与C语言的互操作 cgo
    Go fsm
    Git多账号登陆
    mysql 安装与配置、使用
    Reverse Integer
  • 原文地址:https://www.cnblogs.com/-wenli/p/11590221.html
Copyright © 2020-2023  润新知