python处理Excel文档

Posted anyux

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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")                                                                                                                       

 

内容如下图 

 

 

 

 

 

 

 

 

以上是关于python处理Excel文档的主要内容,如果未能解决你的问题,请参考以下文章

python处理Excel文档

使用 Python 代码片段编写 LaTeX 文档

python处理Excel文档

Python处理Excel文档之openpyxl

Python自动化办公-处理Excel文档

python使用xlsxwriter模块生成和处理Excel文档