zoukankan      html  css  js  c++  java
  • workbook数据相关操作

    访问单个单元格

    c = ws['A4'] #返回单元格A4,如果单元格不存在,则会自动创建
    ws['A4'] = 4  #为单元格A4赋值为4
        
    d = ws.cell(row=4, column=2, value=10)  #给单元格B4赋值为10

      当一个worksheet在内存中创建时,是不包含任何单元格的,只有当第一次访问时才会被创建
      当通过cell()函数访问大批量单元格时,这些单元格虽然没有被赋值,但这些单元格却已在内存中创建

    for x in range(1,101):
        for y in range(1,101):
            ws.cell(row=x, column=y) #会在内存中创建100*100个单元格

    访问多个单元格

    cell_range = ws['A1':'C2']  #访问从A1到C2的所有单元格
    
    colC = ws['C']  #访问C列的所有单元格
    col_range = ws['C:D']  #访问C列和D列的所有单元格
    
    row10 = ws[10]  #访问第10行的所有单元格
    row_range = ws[5:10]  #访问第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 Sheet1.A1>
    <Cell Sheet1.B1>
    <Cell Sheet1.C1>
    <Cell Sheet1.A2>
    <Cell Sheet1.B2>
    <Cell Sheet1.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 Sheet1.A1>
    <Cell Sheet1.A2>
    <Cell Sheet1.B1>
    <Cell Sheet1.B2>
    <Cell Sheet1.C1>
    <Cell Sheet1.C2>
    '''

      出于性能方面的考虑,Worksheet.iter_cols()在read-only模式下是不可用的
      我认为这可能是因为内存的大小是有限的,由于无法事先预估文件的大小,假如文件有一亿行数据
      则iter_cols方法在以列为单位遍历文件时,先遍历第一列,可能遍历到第一千万行时,内存就已经不够了

    遍历整个文件的所有行和列

    可以遍历整个worksheet中的数据

    比如一个worksheet中数据,最大坐标跨度为,最大行数为999,最大列为AA,则遍历的范围将是A1:AA999

    相当于在excel的worksheet中,进行ctrl+A的操作

    ws['C9'] = 'hello world'
    tuple(ws.rows) #获取A1到C9的所有单元格,以行为单位
    '''
    输出:
    ((<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>))
    '''
    
    tuple(ws.columns) #获取A1到C9的所有单元格,以列为单位
    '''
    输出:
    ((<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>))
    '''

      出于性能方面的考虑,Worksheet.columns在read-only模式下是不可用的

    单元格值处理
    如果只想处理单元格的值,可使用属性Worksheet.values,该属性只返回单元格的值

    #该方法仅遍历单元格的值
    for row in ws.values:
       for value in row:
         print(value) 
    
    #Worksheet.iter_rows()和Worksheet.iter_cols()方法也可通过制定参数的方式只获取单元格的值
    for row in ws.iter_rows(min_row=1, max_col=3, max_row=2, values_only=True):
        print(row)
    '''
    输出:
    (None, None, None)
    (None, None, None)
    '''

    数据存储

    c = ws['A4']
    c.value = 'hello, world' #给单元格A4赋值

    保存文件
    使用save()函数是最简单和最安全的方式

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

    注意:
      1) 该方式保存的文件会在没有警告的情况下覆盖原来的同名文件,因此要小心
      2) 文件的扩展名不一定非要xlsx,但是如果不是的话,可能会导致office打不开

    保存成流

    如果将文件保存成流,比如当使用Pyramid, Flask or Django等应用程序时,你可以简单提供一个NamedTemporaryFile()函数

    from tempfile import NamedTemporaryFile
    from openpyxl import Workbook
    
    wb = Workbook()
    with NamedTemporaryFile() as tmp:
        wb.save(tmp.name)
        tmp.seek(0)
        stream = tmp.read()
        
    #加载一个文档,通过指定属性template为True,就可将workbook保存成template 
    wb = load_workbook('document.xlsx')
    wb.template = True 
    wb.save('document_template.xltx')
    
    #加载一个模板文件,通过指定属性template为False,就可将workbook保存成文档
    wb = load_workbook('document_template.xltx')
    wb.template = False 
    wb.save('document.xlsx', as_template=False)

      应该监视数据属性和文档扩展名,以便在模板中保存文档,或者在文档中保存模板,
      否则结果表引擎将无法打开文档

      以下几种情况会保存失败

    wb = load_workbook('document.xlsx')
    wb.save('new_document.xlsm') #需保存成扩展名为xlsx,否则excel无法打开
    
    wb = load_workbook('document.xlsm')
    wb.save('new_document.xlsm') #需指定属性keep_vba=True,否则excel无法打开
    
    wb = load_workbook('document.xltm', keep_vba=True)
    wb.save('new_document.xlsm') # 如果需要一个模板, 则需要指定扩展名为*.xltm

    加载文件

    同时也可以使用openpyxl.load_workbook()打开一个文件

    from openpyxl import load_workbook #加载文件需要导入load_workbook类
    
    wb2 = load_workbook('test.xlsx')
    print(wb2.sheetnames)  #输出:['Sheet2', 'New Title', 'Sheet1'],输出该workbook的worksheet名字
  • 相关阅读:
    Unreal Engine 4 蓝图完全学习教程(三)—— 节点的基本知识
    Unreal Engine 4 蓝图完全学习教程(二)—— 初步尝试
    微信小程序框架分析小练手(三)——仿香哈菜谱小程序制作
    Unreal Engine 4 蓝图完全学习教程(一)—— 简要介绍
    微信小程序框架分析小练手(二)——天气微信小程序制作
    微信小程序框架分析小练手(一)——猫眼电影底部标签导航制作
    第四次作业:使用Packet Tracer理解RIP路由协议及ICMP协议
    Python小白入门题一——文件增删改
    katalon studio升级到6.3.3版本后如何生成测试报告
    IP地址网段表示法
  • 原文地址:https://www.cnblogs.com/shiliye/p/11541468.html
Copyright © 2011-2022 走看看