zoukankan      html  css  js  c++  java
  • Python第三方库之openpyxl(2)

    Python第三方库之openpyxl(2)

    简单的使用

    写一个工作簿

    >>> from openpyxl import Workbook
    >>> from openpyxl.compat import range
    >>> from openpyxl.utils import get_column_letter
    >>>
    >>> wb = Workbook()
    >>>
    >>> dest_filename = 'empty_book.xlsx'
    >>>
    >>> ws1 = wb.active
    >>> ws1.title = "range names"
    >>>
    >>> for row in range(1, 40):
    ...     ws1.append(range(600))
    >>>
    >>> ws2 = wb.create_sheet(title="Pi")
    >>>
    >>> ws2['F5'] = 3.14
    >>>
    >>> ws3 = wb.create_sheet(title="Data")
    >>> for row in range(10, 20):
    ...     for col in range(27, 54):
    ...         _ = ws3.cell(column=col, row=row, value="{0}".format(get_column_letter(col)))
    >>> print(ws3['AA10'].value)
    AA
    >>> wb.save(filename = dest_filename)
    View Code

    读一个现有的工作簿

    >>> from openpyxl import load_workbook
    >>> wb = load_workbook(filename = 'empty_book.xlsx')
    >>> sheet_ranges = wb['range names']
    >>> print(sheet_ranges['D18'].value)
    3

    注意:在loadworkbook中有几个可以使用的标志

    1.guess_types 在读取单元时启用或禁用(默认)类型推断

    2.data_only 控制带有公式的单元格是否有公式(默认)或上次Excel读取表的值

    3.keep_vba 控制任何可视的基本元素是否被保留(默认)。如果它们被保存了它们仍然是不可编辑的

    注意:openpyxl目前没有在Excel文件中读取所有可能的项目,因此如果打开并保存相同的名称,那么图像和图表将从现有文件中丢失

    使用数字格式

    >>> import datetime
    >>> from openpyxl import Workbook
    >>> wb = Workbook()
    >>> ws = wb.active
    >>> # 使用Python datetime设置日期
    >>> ws['A1'] = datetime.datetime(2010, 7, 21)
    >>>
    >>> ws['A1'].number_format
    'yyyy-mm-dd h:mm:ss'
    >>> # 您可以在具体情况下启用类型推断
    >>> wb.guess_types = True
    >>> # 使用字符串和%符号设置百分比
    >>> ws['B1'] = '3.14%'
    >>> wb.guess_types = False
    >>> ws['B1'].value
    0.031400000000000004
    >>>
    >>> ws['B1'].number_format
    '0%'

    使用公式

    >>> from openpyxl import Workbook
    >>> wb = Workbook()
    >>> ws = wb.active
    >>> # 添加一个简单的公式
    >>> ws["A1"] = "=SUM(1, 1)"
    >>> wb.save("formula.xlsx")

    注意:你必须使用英文名作为一个函数,函数参数必须用逗号隔开,而不是其他的标点符号,比如分号

    openpyxl从来没有计算过公式但是可以检查公式的名称

    >>> from openpyxl.utils import FORMULAE
    >>> "HEX2DEC" in FORMULAE
    True

    合并/ 分割单元格

    >>> from openpyxl.workbook import Workbook
    >>>
    >>> wb = Workbook()
    >>> ws = wb.active
    >>>
    >>> ws.merge_cells('A2:D2')
    >>> ws.unmerge_cells('A2:D2')
    >>>
    >>> # 相当于
    >>> ws.merge_cells(start_row=2, start_column=1, end_row=4, end_column=4)
    >>> ws.unmerge_cells(start_row=2, start_column=1, end_row=4, end_column=4)

    插入图像

    >>> from openpyxl import Workbook
    >>> from openpyxl.drawing.image import Image
    >>>
    >>> wb = Workbook()
    >>> ws = wb.active
    >>> ws['A1'] = 'You should see three logos below'
    >>> # 制作一个图片
    >>> img = Image('logo.png')
    >>> # 在单元格旁边添加工作表和锚
    >>> ws.add_image(img, 'A1')
    >>> wb.save('logo.xlsx')

    折叠列

    >>> import openpyxl
    >>> wb = openpyxl.Workbook()
    >>> ws = wb.create_sheet()
    >>> ws.column_dimensions.group('A','D', hidden=True)
    >>> wb.save('group.xlsx')

    与pandas和NumPy一起工作

    NumPy支持

    openpyxl已经为NumPy类型的浮点数、整数和布尔型提供了支持。使用pandas的时间戳类型支持DateTimes

    Working with Pandas Dataframes

    openpyxl.utils.dataframe.dataframe_to_rows()函数提供了一个简单的方式来处理Pandas Dataframes

    from openpyxl.utils.dataframe import dataframe_to_rows
    wb = Workbook()
    ws = wb.active
    
    for r in dataframe_to_rows(df, index=True, header=True):
        ws.append(r)

    虽然pandas本身支持转换为Excel,但这为客户端代码提供了额外的灵活性,包括将dataframes直接传输到文件的能力。

    将一个dataframe转换为高亮显示标题和索引的工作表

    wb = Workbook()
    ws = wb.active
    
    for r in dataframe_to_rows(df, index=True, header=True):
        ws.append(r)
    
    for cell in ws['A'] + ws[1]:
        cell.style = 'Pandas'
    
    wb.save("pandas_openpyxl.xlsx")

    或者,如果你只想转换数据你可以使用write-only模式

    from openpyxl.cell.cell import WriteOnlyCell
    wb = Workbook(write_only=True)
    ws = wb.create_sheet()
    
    cell = WriteOnlyCell(ws)
    cell.style = 'Pandas'
    
     def format_first_row(row, cell):
    
        for c in row:
            cell.value = c
            yield cell
    
    rows = dataframe_to_rows(df)
    first_row = format_first_row(next(rows), cell)
    ws.append(first_row)
    
    for row in rows:
        row = list(row)
        cell.value = row[0]
        row[0] = cell
        ws.append(row)
    
    wb.save("openpyxl_stream.xlsx")
    View Code

    这段代码和标准的工作簿同样适用

    将工作表转换为Dataframe

    要将工作表转换为Dataframe,您可以使用values属性。如果工作表没有标题或索引,这很容易

    df = DataFrame(ws.values)

    如果工作表确实有标题或索引,比如由pandas创建的,那么就需要做更多的工作

    data = ws.values
    cols = next(data)[1:]
    data = list(data)
    idx = [r[0] for r in data]
    data = (islice(r, 1, None) for r in data)
    df = DataFrame(data, index=idx, columns=cols)
  • 相关阅读:
    借助backtrace和demangle实现异常类Exception
    mysql数据库表里首行和末行的取得方法
    斐波那契高效算法(4种算法综合分析)
    sublime学习之--批量在多行首位加入代码
    Zabbix --> client安装以及怎样加入数据库的动态监控视图
    sdut 3-6 静态数据成员与静态成员函数
    poj3411Paid Roads
    python中get pass用法
    Qt之QListWidget:项目的多选与单选设置
    Qt之QListWidget:项目的多选与单选设置
  • 原文地址:https://www.cnblogs.com/Keys819/p/9315126.html
Copyright © 2011-2022 走看看