python处理Excel文档
Posted anyux
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python处理Excel文档相关的知识,希望对你有一定的参考价值。
安装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文档的主要内容,如果未能解决你的问题,请参考以下文章