zoukankan      html  css  js  c++  java
  • python处理Excel文档

    安装pip

    安装openpyxl

    pip install openpyxl

    使用openpyxl读取excel文档

      一个 Excel文档   称为一个工作簿,一个工作簿包含多个表格,在Excel中能称为sheet。打开工作簿后会默认显示一个表格,这个表格一般称为活跃表。每个单元格都有唯一的坐标。行的坐标使用数字表示,列的坐标使用字母表示。,表格中左上角的单元格,坐标"A1"

      openpyxl中有三个不同层次的类。每个类都包含了若干属性和方法,便于获取表格数据

        Workbook对应 Excel工作簿(文档)

        Worksheet对应sheet (表格)

        cell 对应 单元格

       一个Workbook对象代表一个Excel文档,创建一个文件对象,使用load_workbook函数,接受filename参数

      wb是一个wb对象,它拥有很多的属性和方法

        active:获取活跃的Worksheet

        read_only:是否以read_only模式打开Excel文档

        encoding:文档的字符集编码

        properties:文档的元数据,如标题,创建者,创建日期等

        worksheets:以列表的形式返回所有的Worksheet

    In [12]: wb.active                                                              
    Out[12]: <Worksheet "c">
    
    In [13]: wb.read_only                                                           
    Out[13]: False
    
    In [14]: wb.worksheets                                                          
    Out[14]: [<Worksheet "python">, <Worksheet "java">, <Worksheet "c">]
    
    In [15]: wb.encoding                                                            
    Out[15]: 'utf-8'
    
    In [16]: wb.properties                                                          
    Out[16]: 
    <openpyxl.packaging.core.DocumentProperties object>
    Parameters:
    creator='wps', title=None, description=None, subject=None, identifier=None, language=None, created=datetime.datetime(2018, 5, 25, 19, 28), modified=datetime.datetime(2019, 11, 16, 15, 51, 27), lastModifiedBy='root', category=None, contentStatus=None, version=None, revision=None, keywords=None, lastPrinted=None

     Workbook对象的方法大都与Worksheet相关。常用方法如下:

      get_sheet_names:获取所有表格的名称

      get_sheet_by_name:通过表格名称获取Worksheet对象

      get_active_sheet:获取活跃的表格

      remove_sheet:删除一个表格

      create_sheet:创建一个空的表格

      copy_worksheet:在Workbook内拷贝表格

    In [25]: wb.get_sheet_by_name("c")                                                                                                                    
    /usr/local/lib/python3.6/site-packages/IPython/__main__.py:1: DeprecationWarning: Call to deprecated function get_sheet_by_name (Use wb[sheetname]).
      # encoding: utf-8
    Out[25]: <Worksheet "c">
    
    In [26]: wb.get_active_sheet()                                                                                                                        
    /usr/local/lib/python3.6/site-packages/IPython/__main__.py:1: DeprecationWarning: Call to deprecated function get_active_sheet (Use the .active property).
      # encoding: utf-8
    Out[26]: <Worksheet "c">
    
    In [27]: wb.get_sheet_names()                                                                                                                         
    /usr/local/lib/python3.6/site-packages/IPython/__main__.py:1: DeprecationWarning: Call to deprecated function get_sheet_names (Use wb.sheetnames).
      # encoding: utf-8
    Out[27]: ['python', 'java', 'c']

     以上告警信息 DeprecationWarning弃用警告 ,建议使用以下功能

    In [29]: wb.sheetnames                                                                                                                                
    Out[29]: ['python', 'java', 'c']
    
    In [30]: wb['python']                                                                                                                                 
    Out[30]: <Worksheet "python">
    
    In [31]: wb['java']                                                                                                                                   
    Out[31]: <Worksheet "java">
    
    In [32]: wb['c']                                                                                                                                      
    Out[32]: <Worksheet "c">
    
    
    In [34]: wb.active                                                                                                                                    
    Out[34]: <Worksheet "c">

     拿到一个worksheet就相当于拿到一个表格

    worksheet表格属性如下

      title:表格的标题

      dimensions:表格的大小,这时原大小是指有含有数据的表格大小

      max_row:表格的最大行

      min_row:表格的最小行

      max_column表格的最大列

      min_column表格的最小列

      rows按行获取单元格(Cell对象)

      columns按列获取单元格(Cell对象)

      freeze_panes冻结窗格

      values:按行获取表格的内容(数据)

    In [35]: ws = wb.active                                                                                                                               
    
    In [36]: ws                                                                                                                                           
    Out[36]: <Worksheet "c">
    
    In [37]: ws.title                                                                                                                                     
    Out[37]: 'c'
    
    In [38]: ws.dimensions                                                                                                                                
    Out[38]: 'A1:A1'
    
    In [39]: ws.min_column                                                                                                                                
    Out[39]: 1
    
    In [40]: ws.max_column                                                                                                                                
    Out[40]: 1
    
    In [41]: ws.min_row                                                                                                                                   
    Out[41]: 1
    
    In [42]: ws.max_row                                                                                                                                   
    Out[42]: 1
    
    In [43]: ws.columns                                                                                                                                   
    Out[43]: ()
    
    In [44]: ws.rows                                                                                                                                      
    Out[44]: ()
    
    In [45]: ws.values                                                                                                                                    
    Out[45]: <generator object values at 0x7f215f80c0a0>

    其中,columns、rows和values这几个属性都是通过生成器的方式返回数据。 openpyxl的设计中,需要返回数据时都是通过生成器获取所有的数值。需要注意的是,columns与rows返回的是Cell对象,values返回的是数据

      freeze_panes这个参数取值为None表示不冻结任何窗格。为A1表示冻结第一行。B1表示冻结第一列。同时冻结第一行和第一列,则为B2

      Worksheet(表格)一些常用的方法:

        iter_rows:按行获取所有单元格(Cell对象)

        iter_columns:按获取单元格

        append:在表格末尾添加数据

        merged_cells:合并多个单元格

        unmerge_cells:移除合并的单元格

    In [46]: list(ws.iter_rows(min_row=2,max_row=4,min_col=1,max_col=3))                                                                                  
    Out[46]: 
    [(<Cell 'c'.A2>, <Cell 'c'.B2>, <Cell 'c'.C2>),
     (<Cell 'c'.A3>, <Cell 'c'.B3>, <Cell 'c'.C3>),
     (<Cell 'c'.A4>, <Cell 'c'.B4>, <Cell 'c'.C4>)]

     从Worksheet(表格)的属性和方法的使用中,其返回值为Cell对象。一个Cell对象表示一个单元格。

      获取单元格,指定Excel坐标

    In [47]: ws['A1']                                                                                                                                     
    Out[47]: <Cell 'c'.A1>
    
    In [48]: ws['B1']                                                                                                                                     
    Out[48]: <Cell 'c'.B1>
    
    In [49]: ws.cell(row=1,column=2)                                                                                                                      
    Out[49]: <Cell 'c'.B1>
    
    In [50]: ws.cell(row=1,column=1)                                                                                                                      
    Out[50]: <Cell 'c'.A1>

    Cell对象比较简单,其常用属性如下

      row:单元格所在的行

      column:单元格所在的列

      value单元格取值

      cordinate:单元格坐标

    ws.values通过生成器访问数据并按行返回

    In [51]: from __future__ import print_function                                                                                                        
    
    In [52]: for row in ws.values: 
        ...:     print(*row) 
        ...:                                                                                                                                              
    None None None
    None None None
    None None None
    None None None

    rows属性按行返回Cell对象,因此,我们使用列表推导来获取每一个Cell对象的值

    In [53]: for row in ws.rows: 
        ...:     print(*[cell.value for cell in row]) 
        ...:                                                                                                                                              
    None None None
    None None None
    None None None
    None None None

    iter_rows方法在不加任何参数的情况下,与rows属性效果相同,因此,这种方法与前一种方法很像

    In [55]: for row in ws.iter_rows(): 
        ...:     print(*[cell.value for cell in row]) 
        ...:                                                                                                                                              
    None None None
    None None None
    None None None
    None None None

    最后这种方式是最麻烦的方式,首先获取表格的最小行数和最大行数,然后获取最小列数与最大列数,通过行和列的索引确定一个唯一单元格。确定单元格以后,打印单元格的值。这种方式是每确定一个单元格打印一次,因此,在print函数中将end参数取值来避免避免换行,并在内层for循环结束以后,显示地进行换行

    In [57]: for i in range(ws.min_row,ws.max_row + 1): 
        ...:     for j in range(ws.min_column,ws.max_column + 1): 
        ...:         print(ws.cell(row=i,column=j).value,end=' ') 
        ...:     print() 
        ...:                                                                                                                                              
    None None None 
    None None None 
    None None None 
    None None None

     使用openpyxl修改Excel文档

      一个Workbook对象代表一个工作簿(Excel文档),新建一个工作簿就是创建一个Workbook对象。创建完Workbook对象后,默认会有一个名为"sheet1"的表格,我们通过表格名称或wb.active(wb.get_active_sheet())方法来获取这个表格。通过title属性修改表格名称

    In [58]: from openpyxl import Workbook                                                                                                                
    
    In [59]: wb = Workbook()       
    
    In [60]: wb.get_sheet_names()                                                                                                                         
    /usr/local/lib/python3.6/site-packages/IPython/__main__.py:1: DeprecationWarning: Call to deprecated function get_sheet_names (Use wb.sheetnames).
      # encoding: utf-8
    Out[60]: ['Sheet']
    
    In [65]: wb.active                                                                                                                                    
    Out[65]: <Worksheet "Sheet">
    
    In [66]: ws = wb.active                                                                                                                               
    
    In [67]: ws.title                                                                                                                                     
    Out[67]: 'Sheet'
    
    In [68]: ws.title = 'student'                                                                                                                         
    
    In [69]: ws.title                                                                                                                                     
    Out[69]: 'student'

     可以使用create_sheet方法创建新的表格,也可以使用remove_sheet方法删除表格

    In [80]: wb.create_sheet("new sheet")                                                                                                                 
    Out[80]: <Worksheet "new sheet">
    
    In [81]: wb                                                                                                                                           
    Out[81]: <openpyxl.workbook.workbook.Workbook at 0x7f215d8b66d8>
    
    In [82]: wb.sheetnames                                                                                                                                
    Out[82]: ['student', 'new sheet']
    
    In [83]: wb.remove(wb["new sheet"])                                                                                                                   
    
    In [84]: wb.sheetnames                                                                                                                                
    Out[84]: ['student']
    
    In [85]: wb.active                                                                                                                                    
    Out[85]: <Worksheet "student">
    
    In [86]: wb.active()    
    
    In [88]: ws = wb.active                                                                                                                               
    
    In [89]: ws.title="new title"                                                                                                                         
    
    In [90]: wb.active                                                                                                                                    
    Out[90]: <Worksheet "new title">
    
    In [91]: wb.active.title                                                                                                                              
    Out[91]: 'new title'

     如果在填充数据,可以直接对单元格赋值。openpyxl还可以自动处理Python数据类型到Excel数据类型之间的转换

    In [92]: ws["A1"] = "Hello World"                                                                                                                     
    
    In [93]: import datetime                                                                                                                              
    
    In [94]: ws["A2"] = datetime.datetime.now() 

     保存信息,调用Workbook的save方法将数据保存到磁盘中

    In [95]: wb.save("sample.xlsx")                                                                                                                       

    内容如下图 

  • 相关阅读:
    【SSH网上商城项目实战15】线程、定时器同步首页数据(类似于CSDN博客定期更新排名)
    【SSH网上商城项目实战14】商城首页UI的设计
    Spring工具类:WebApplicationContextUtils
    多线程技术: 两个线程交替打印奇数和偶数
    常见的几种异常类型Exception
    【SSH网上商城项目实战13】Struts2实现文件上传功能
    【SSH网上商城项目实战12】添加和更新商品功能的实现
    【SSH网上商城项目实战11】查询和删除商品功能的实现
    【SSH网上商城项目实战10】商品类基本模块的搭建
    如何防止通过IP地址访问Tomcat管理页面
  • 原文地址:https://www.cnblogs.com/anyux/p/11872370.html
Copyright © 2011-2022 走看看