• python操作excel


    相关模块

    1. xlrd: excel表格,新版本仅支持xls格式,久版本可支持xlsx格式
    2. xlwt:excel表格,不可修改已存在的excel表格
    3. xlutils:结合xlrd可实现那修改excel
    4. xlsxwriter:只支持新建excel向其中写入数据,不支持对已有excel的读取和修改。支持附加图标
    5. xlwings: 读写excel,并且能够进行单元格格式的修改
    6. openpyxl:读写excel,只能处理.xlsx文件
    7. win32com:读写excel,可实现整个excel文档的复制
    8. pandas:读写excel
    9. PyExcelerator(Platform: Win,Unix-like) :读写excel文件,但不可修改已存在excel,常用于写excel
      1.xlrd
    import xlrd
    
    data = xlrd.open_workbook('abcd.xls') # 打开xls文件
    tem_excel = xlrd.open_workbook('日统计.xls', formatting_info=True)  #携带格式打开一个文件
    
    table = data.sheets()[0] # 打开第一张表
    
    nrows = table.nrows # 获取表的行数
    
    for i in range(nrows): # 循环逐行打印
    
        if i == 0:# 跳过第一行
    
            continue
    
        print (table.row_values(i)[:13]) # 取前十三列
    

    2.xlwt

    import xlwt
    
    wbk = xlwt.Workbook()
    
    sheet = wbk.add_sheet('sheet 1')
    
    sheet.write(0,1,'test text')#第0行第一列写入内容
    
    wbk.save('test.xls')
    

    3.xlutils
    https://xlutils.readthedocs.io/en/latest/ (参考文档)
    该软件包提供了用于处理excel文件的实用程序的集合。

    • xlutils.copy 用于将xlrd.Book对象复制到xlwt.Workbook对象的工具
    • xlutils.display 实用程序功能,用于xlrd以用户友好和安全的方式显示有关对象的信息
    • xlutils.filter 用于将现有Excel文件拆分和过滤为新Excel文件的微型框架
    • xlutils.margins 用于查找多少Excel文件包含有用数据的工具
    • xlutils.save 用于将xlrd.Book对象序列化回Excel文件的工具
    • xlutils.styles 用于格式化信息的工具表示了Excel文件中的样式
    • xlutils.view 易于使用的工作簿工作表中包含的数据视图

    xlutils.copy,配合xlrd和xlrt,可修改已存在的excel表格。

    from xlrd import open_workbook
    from xlutils.copy import copy
    rb = open_workbook('balances.xlsx', on_demand=True)  #**使用on_demand = True,open_workbook()会占用更少的内存**
    rb.sheet_by_index(0).cell(0,1).value
    wb = copy(rb)  #use xlutils.copy to copy the xlrd.Book object into an xlwt.Workbook object
    #Now that you have an xlwt.Workbook, you can modify cells and then save the changed workbook back to a file:
    wb.get_sheet(0).write(0,1,'changed!')
    wb.save('test.xls')   #注:**一定要保存为xls格式,否则会因格式错误导致文件无法打开**
    

    xlutils.display,该模块包含quoted_sheet_name()和 cell_display()功能,可轻松安全地显示所返回的信息xlrd。

    4.xlsxwriter
    5.xlwings
    xlwings可以和matplotlib、numpy以及pandas无缝连接,支持读写numpy、pandas数据类型,将matplotlib可视化图表导入到excel中。
    官方文档:http://docs.xlwings.org/zh_CN/latest/
    Here are the last versions of xlwings to support:
    Python 3.5: 0.19.5
    Python 2.7: 0.16.6

    基本操作:

    import xlwings as xw
    import pandas as pd
    import matplotlib.pyplot as plt
    #与工作簿建立连接
    #wb = xw.Book()  # this will create a new workbook
    wb = xw.Book('balances.xlsx')  # connect to a file that is open or in the current working directory
    #wb = xw.Book(r'C:path	ofile.xlsx')  # on Windows: use raw strings to escape backslashes
    sht = wb.sheets['sheet']  #初始化工作表(sheet)对象
    #如查找的工作表不存在,则会报错 com_error: (-2147352567, '发生意外。', (0, None, None, None, 0, -2147352565), None)
    #读写数据
    sht.range('A1').value = 'Foo 1'
    print(sht.range('A1').value)
    #区域扩展
    sht.range('A1').value = [['Foo 1', 'Foo 2', 'Foo 3'], [10.0, 20.0, 30.0]]
    print(sht.range('A1').expand().value)
    #强大的转换器 能够处理大多数数据类型的双向转换,包括Numpy arrays和Pandas DataFrames
    df = pd.DataFrame([[1,2], [3,4]], columns=['a', 'b'])
    sht.range('A1').value = df
    print(sht.range('A1').options(pd.DataFrame, expand='table').value)
    #Matplotlib 图表可以作为图片放在Excel中展示
    fig = plt.figure()
    plt.plot([1, 2, 3, 4, 5])
    sht.pictures.add(fig, name='MyPlot', update=True)
    


    与工作簿建立连接:
    xw.Book 提供了连接到工作簿的最简单的方法: 它在所有的app实例中查找指定的工作簿,如果同一个工作簿在多个app实例中存在,就会返回一个错误信息。 连接活动app实例中的工作簿用 xw.books ,连接指定app实例中的工作簿用:

    6.openpyxl
    https://openpyxl.readthedocs.io/en/stable/ (参考文档)

    创建工作表

    from openpyxl import Workbook
    #Create a workbook
    wb = Workbook() #获取工作簿
    print(wb,type(wb))
    ws = wb.active #获取工作表,该方法默认参数是0,总是得到第一个工作表.(获取工作簿时默认会有一个名为sheet的工作表)
    print(ws,type(ws))
    ws1 = wb.create_sheet("Mysheet")  # insert at the end (default)
    ws2 = wb.create_sheet("Mysheet", 0) # insert at first position
    ws3 = wb.create_sheet("Mysheet", -1)  # insert at the penultimate position
    ws4 = wb.create_sheet("yoursheet")  # insert at the penultimate position
    ws2.title = "New Title"   #修改工作表名,Sheets are given a name automatically when they are created. They are numbered in sequence (Sheet, Sheet1, Sheet2, …)
    ws5 = wb["New Title"]  #给工作表命名后,就可以将其作为工作簿的键,获取该工作表
    print(wb.sheetnames)   #查看工作簿中所有工作表的名称
    for sheet in wb:    #遍历工作簿
        print(sheet.title)
    target = wb.copy_worksheet(ws)  #在单个工作簿中创建工作表的副本,注意不能在工作簿之间复制工作表。如果工作簿以只读或仅写 模式打开,则不能复制工作表
    #Copy an existing worksheet in the current workbook
    #.. warning::
    #            This function cannot copy worksheets between workbooks.
    #            worksheets can only be copied within the workbook that they belong
    print(target)
    

    运行结果

    操作数据

    from openpyxl import Workbook
    #Create a workbook
    wb = Workbook() #获取工作簿
    ws = wb.active #获取工作表
    **#访问一个单元格**
    c = ws['A4']  #单元格可以直接作为工作表的键进行访问,返回A4处的单元格,如果尚未存在则创建一个
    print(c,type(c))
    ws['A4'] = 4  #可以直接配置值
    d = ws.cell(row=4, column=2, value=10)  #使用行和列表示法访问单元格
    #注:在内存中创建工作表时,它不包含任何单元格。它们是在首次访问时创建的。
    
    **#访问多个单元格**
    cell_range = ws['A1':'C2']  #使用切片访问单元格范围,返回一个嵌套元组
    print(11,cell_range)
    colC = ws['C']
    print(22,colC)
    col_range = ws['C:D']
    row10 = ws[10]  #返回第10行的数据,得到一个包含各单元格对象的元组
    print(33,row10)
    row_range = ws[5:10]  #返回5-10行的单元格对象
    print(44,row_range)
    #也可以使用Worksheet.iter_rows()方法,同样,该Worksheet.iter_cols()方法将返回列,但出于性能原因,该Worksheet.iter_cols()方法在只读模式下不可用。
    for row in ws.iter_rows(min_row=1, max_col=3, max_row=2):
        for cell in row:
            print(cell)
    #如果需要遍历文件的所有行或列,则可以使用以下 Worksheet.rows属性或Worksheet.columns属性,该Worksheet.columns属性在只读模式下不可用。
    tuple(ws.rows)
    
    

    仅值

    from openpyxl import Workbook
    #Create a workbook
    wb = Workbook() #获取工作簿
    ws = wb.active #获取工作表,该方法默认参数是0,总是得到第一个工作表.(获取工作簿时默认会有一个名为sheet的工作表)
    n = 1
    for x in range(1,4):
            for y in range(1,4):
                ws.cell(row=x, column=y,value=n)
                n += 1
    for row in ws.values:   #Worksheet.values属性,仅返回单元格值
           for value in row:
                 print(value)
    for row in ws.iter_rows(min_row=1, max_col=3, max_row=2, values_only=True):
        #values_only参数,只返回单元格的值
        print(row)
    

    数据存储
    一旦有了Cell,我们可以为其分配一个值

    from openpyxl import Workbook
    #Create a workbook
    wb = Workbook() #获取工作簿
    ws = wb.active #获取工作表,该方法默认参数是0,总是得到第一个工作表.(获取工作簿时默认会有一个名为sheet的工作表)
    n = 1
    for row in ws.iter_rows(min_row=1, max_col=3, max_row=2):
        for cell in row:
            cell.value = n   #为cell分配值
            n = n + 2
    for row in ws.values:
        for value in row:
            print(value)
    wb.save('balances.xlsx')   #保存到文件,操作将覆盖现有文件,而不会发出警告
    

    从文件加载
    使用openpyxl.load_workbook()打开现有的工作簿

    from openpyxl import load_workbook
    wb = load_workbook('balances.xlsx')
    ws = wb.active
    for row in ws.values:
        for cell in row:
            print(cell)
    

    简单使用

    • 写工作簿
    from openpyxl import Workbook
    from openpyxl.utils import get_column_letter
    
    wb = Workbook()
    dest = 'empty_book.xlsx'
    ws1 = wb.active
    ws1.title = 'range names'
    for row in range(1,10):
        ws1.append(range(8))
    
    ws2 = wb.create_sheet(title='pi')
    ws2['F2'] = 3.14
    
    ws3 = wb.create_sheet(title='data')
    for row in range(10,20):
        for col in range(27,32):
            _ = ws3.cell(column=col, row=row, value="{0}".format(get_column_letter(col)))
        wb.save(filename=dest)
    
    • 阅读现有工作簿
    from openpyxl import load_workbook
    wb = load_workbook(filename = 'empty_book.xlsx')
    sheet_ranges = wb['range names']
    print(sheet_ranges['D6'].value)
    注:在load_workbook中可以使用几个标志。data_only控制具有公式的单元格是否具有公式(默认值)或Excel上次读取工作表时存储的值。keep_vba控制是否保留任何Visual Basic元素(默认)。如果保留它们,则它们仍不可编辑。
    

    *使用数字格式

    import datetime
    from openpyxl import Workbook
    wb = Workbook()
    ws = wb.active
    # set date using a Python datetime
    ws['A1'] = datetime.datetime(2010, 7, 21)
    ws['A1'].number_format
    


    *使用公式

    from openpyxl import load_workbook
    ws = wb.active
    # add a simple formula
    ws["A1"] = "=SUM(1, 1)"
    wb.save("empty_book.xlsx")
    

    *只读模式(用于大量读取数据)

    from openpyxl import load_workbook
    
    wb = load_workbook(filename='large_file.xlsx', read_only=True)
    ws = wb['big_data']
    
    for row in ws.rows:
        for cell in row:
            print(cell.value)
    
    # Close the workbook after reading
    wb.close()
    

    *只写模式(用于大量写入数据)
    要转储大量数据时,需确保已安装lxml

    from openpyxl import Workbook
    
    wb = Workbook(write_only=True)
    ws = wb.create_sheet()
    # now we'll fill it with 100 rows x 200 columns
    for irow in range(100):
        ws.append(['%d' % i for i in range(200)])
    # save the file
    wb.save('new_big_file.xlsx') # doctest: +SKI
    

    插入和删除行

    from openpyxl import load_workbook
    #openpyxl.worksheet.worksheet.Worksheet.insert_rows()
    #openpyxl.worksheet.worksheet.Worksheet.insert_cols()
    #openpyxl.worksheet.worksheet.Worksheet.delete_rows()
    #openpyxl.worksheet.worksheet.Worksheet.delete_cols()
    wb = load_workbook(filename = 'empty_book.xlsx')
    ws = wb.active
    ws.insert_rows(7)   #插入空行
    ws.delete_cols(6, 3)  #删除行
    wb.save('empty_book.xlsx')
    

    移动范围

    ws.move_range("D4:F10", rows=-1, cols=2)  #将范围内的单元格D4:F10向上移动一列,向右移动两列。单元将覆盖任何现有单元。
    

    7.win32com
    pywin32直接包装了几乎所有的Windows API,可以方便地从Python直接调用。
    https://github.com/mhammond/pywin32 (源码)
    http://www.yfvb.com/help/win32sdk/ (win32中文参考手册)
    https://docs.microsoft.com/en-us/search/ (win32英文参考手册)
    https://github.com/wuxc/pywin32doc/blob/master/PyWin32.chm (pywin32文档)
    安装pywin32后,在lib的site-packages下面的win32目录下,有一个demos。
    安装

    python -m pip install pywin32 -i https://pypi.tuna.tsinghua.edu.cn/simple
    
    from win32com.client import Dispatch    
    import win32com.client    
    

    8.pandas
    https://www.pypandas.cn/ (pandas中文网)推荐
    https://pandas.pydata.org/pandas-docs/stable/ (参考文档)推荐
    pandas利器:

    • DataFrame是Pandas中的一个表格型的数据结构,包含有一组有序的列,每列可以是不同的值类型(数值、字符串、布尔型等),DataFrame即有行索引也有列索引,可以被看做是由Series组成的字典。
    • Series是一种类似于一维数组的对象,是由一组数据以及一组与之像相关的数据标签(即索引)组成,仅由一组数据也可以产生简单的Series对象。
      该模块处理excel时依赖xlrd和openpyxl模块,需提前安装好
    import pandas as pd
    #导入数据
    df = pd.read_excel('balances.xlsx')  #方式一:直接读取,默认读取到这个Excel的第一个表单,参数可选(io[, sheet_name, header, names, …])
    #df = pd.ExcelFile.parse('sheet')  #方式二:根据sheet索引
    
    #pandas操作Excel的行列
    
    data=df.head()#默认读取前5行的数据,得到一个二位矩阵
    print(data,type(data))
    
    #获取所有数据
    data1=df.values#
    print(data1,type(data1))
    
    #读取指定的单行,数据会存在列表里面
    data=df.iloc[0].values  #0表示第一行 这里读取数据并不包含表头
    print("第一行数据:
    {0}".format(data))
    
    #读取指定的多行,数据会存在嵌套的列表里面
    data=df.iloc[[1,2]].values  #读取指定多行的话,就要在iloc[]里面嵌套列表指定行数
    print("读取指定行的数据:
    {0}".format(data))
    
    #读取指定的行列
    data=df.iloc[1,2]  #读取第一行第二列的值,这里不需要嵌套列表
    print("读取指定行的数据:
    {0}".format(data))
    
    #读取指定的多行多列值
    data=df.iloc[[1,2],[True,False,False]].values#读取第一行第二行的title以及data列的值,这里需要嵌套列表
    print("读取多行多列值:
    {0}".format(data))
    
    #读取所有行的指定列
    data=df.iloc[:,0:2].values#读所有行前3列的值,这里需要嵌套列表
    print("读取所有行指定列的数据:
    {0}".format(data))
    
    #获取行号并打印输出
    print("输出行号列表",df.index.values)
    
    #获取列名并打印输出
    print("输出列标题",df.columns.values)
    
    #获取指定行的值
    print("输出值",df.sample(3).values)#这个方法类似于head()方法以及df.values方法
    
    #获取指定列的值
    print("输出值
    ",df['data'].values)
    
    #导出数据
    df.to_excel('out.xlsx',sheet_name='sheet1',index=True)  #方法一
    
    writer = pd.ExcelWriter('out.xlsx')  #方法二,同时需要在多个工作表中写入时使用
    df.to_excel(writer,sheet_name='sheet2',index=True)
    df.to_excel(writer,sheet_name='sheet3',index=True)
    writer.save()
    

    9.PyExcelerator
    安装
    https://sourceforge.net/projects/pyexcelerator/
    使用方法:
    http://blog.donews.com/limodou/a460033.aspxrchive/2005/07/09/460033.aspx

    拓展
    https://www.cnblogs.com/yangguanghuayu/p/11778595.html (xlrd和xlwt)
    https://www.cnblogs.com/zhang-can/p/7652702.html (xlrd和xlwt)
    https://blog.csdn.net/weixin_40612082/article/details/89710773 (xlrd和xlwt,字体边框格式相关)
    https://blog.csdn.net/qq404766692/article/details/8365542(win32com和PyExcelerator使用)
    https://www.cnblogs.com/wanglle/p/11455758.html (openpyxl)
    https://blog.csdn.net/qq_42067550/article/details/105466112 (xlutils模块无法拷贝)
    https://www.zhihu.com/tardis/sogou/art/54847656 (win32com复制整个excel表格)
    https://blog.csdn.net/peiwang245/article/details/100544691 (win32com详细用法)
    https://www.py.cn/jishu/jichu/12879.html (基本语法)
    pip install -i https://pypi.tuna.tsinghua.edu.cn/simple gevent (pip镜像)
    Linux下,修改 ~/.pip/pip.conf (没有就创建一个), 修改 index-url至tuna,内容如下:

     [global]
     index-url = https://pypi.tuna.tsinghua.edu.cn/simple
    

    windows下,直接在user目录中创建一个pip目录,如:C:Usersxxpip,新建文件pip.ini,内容如下:

    [global]
     index-url = https://pypi.tuna.tsinghua.edu.cn/simple
    

    d:python3.5python.exe -m pip install --upgrade pip

  • 相关阅读:
    ABAP 动态内表构建 Dynamic internal table
    RFC权限分配
    ERP从业来的总结
    WORD中插入VISIO图形,打印乱码解决
    SAP中程序间的相互调用,SUBMIT关键字的用法
    SDva01的屏幕增强
    STL中的binder
    C++中的new
    C++数组中多态问题分析
    Gdiplus中实现双Buffer绘图
  • 原文地址:https://www.cnblogs.com/tingshu/p/14381635.html
Copyright © 2020-2023  润新知