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名字
  • 相关阅读:
    poj 2676 Suduku (dfs)
    poj 1562 Oil Deposits (dfs)
    poj 2907 Collecting Beepers (dfs)
    poj 1655 Balancing Act (树形dfs)
    poj 3411 Paid Roads (dfs)
    hdu 2896 病毒侵袭 (AC)
    hdu 3065 病毒侵袭持续中 (AC)
    poj 2251 Dungeon Master (bfs)
    java中debug使用
    Swing入门级小项目总结
  • 原文地址:https://www.cnblogs.com/shiliye/p/11541468.html
Copyright © 2011-2022 走看看