python第三方库之openpyxl(1)

简介

Openpyxl是一个用于读写Excel 2010 xlsx/xlsm/xltx/xltm文件的Python库,其功能非常强大。Excel表格可以理解为一个二维矩阵,行用1,2,3,4,5.....等表示,在Openpyxl可以用来作为行索引。列用A,B,C,D,E,F.......表示,在Openpyxl中可以用来当做列索引,描述一个单元格的位置需要一个行标、一个列标。如A1表示第一行第一列对应的单元格,E4表示第四行第五列对应的单元格。

简单示例:

from openpyxl import Workbook
wb = Workbook() # 实例化一个工作簿对象 # 获取当前活跃的工作簿
ws = wb.active # 数据可以直接分配给具体单元格
ws['A1'] = 42 # 行也可以被追加
ws.append([1, 2, 3]) # Python类型将自动转换
import datetime
ws['A2'] = datetime.datetime.now() # 保存成Excel文件
wb.save("sample.xlsx")

用法示例

在内存中操作工作簿

没有必要在文件系统上创建一个文件来使用openpyxl,直接导入Workbook类就可以使用它

>>> from openpyxl import Workbook
>>> wb = Workbook() # 实例化一个工作簿对象

Workbook()类通常至少创建一个工作表,可以使用active()方法获得当前活跃的工作簿

>>> ws = wb.active

注意:这个函数使用_active_sheet_index属性,默认设置为0。除非您修改它的值,否则您将总是使用这个方法获得第一个工作表。

也可以用openpyxl.workbook.Workbook.create_sheet()方法创建新的工作簿

>>> ws1 = wb.create_sheet("Mysheet") # 默认在末尾插入
# or
>>> ws2 = wb.create_sheet("Mysheet", 0) # 在第一个位置插入

表格在创建的时候就会自动的按照顺序以(Sheet, Sheet1, Sheet2, …)的方式命名,你随时都可以用title属性来改变表格的名称

ws.title = "New Title"

在默认情况下,持有这个标题的标签的背景颜色是白色的。你可以通过给sheet_properties.tabColor属性赋一个RRGGBB值来改变它。

ws.sheet_properties.tabColor = "1072BA"

一旦你给了一个工作表一个名字,你就可以把它作为一个键来获取这个工作簿

>>> ws3 = wb["New Title"]

您可以通过openpyxl.workbook.Workbook.sheetnames()方法查看工作簿的所有工作表的名称

>>> print(wb.sheetnames)
['Sheet2', 'New Title', 'Sheet1']

你也可以循工作表

>>> for sheet in wb:
... print(sheet.title)

你可以用openpyxl.workbook.Workbook.copy_worksheet()方法在一个工作簿中创建工作表的副本

>>> source = wb.active
>>> target = wb.copy_worksheet(source)

注意:只有单元格(包括值、样式、超链接和注释)和某些工作表属性(包括维度、格式和属性)被复制。所有其他工作簿/工作表属性都不会被复制——例如图像、图表。

你不能在工作簿之间复制工作表。如果工作簿是以只读或写方式打开的,那么您也不能复制工作表。

玩转数据

现在我们知道了如何访问工作表,我们可以开始修改单元内容

可以直接以工作表键的方式来访问单元格

>>> c = ws['A4']

上面可以返回一个A4单元格,如果A4单元格不存在,就会创建一个。可以直接分配值。

>>> ws['A4'] = 4

同时还有一个openpyxl.worksheet.Worksheet.cell()方法,这提供了使用行和列表示法访问单元格的方法。

>>> d = ws.cell(row=4, column=2, value=10)

注意:当一个工作表在内存中创建时,它不包含任何单元格。它们是在第一次访问时创建的。由于这个特性,滚动浏览单元而不是直接访问它们将在内存中创建它们,即使您没有给它们赋值。

例如:

>>> for i in range(1,101):
... for j in range(1,101):
... ws.cell(row=i, column=j)

将在内存中创建100x100个单元格,什么都不做。

访问多个单元格

可以使用切片来访问单元格范围

>>> cell_range = ws['A1':'C2']  #获取A1到C2之间的单元格

行或列的范围也可以得到类似的结果

>>> colC = ws['C']
>>> col_range = ws['C:D']
>>> row10 = ws[10]
>>> row_range = ws[5:10]

也可以使用openpyxl.worksheet.Worksheet.iter_rows()方法

>>> for row in ws.iter_rows(min_row=1, max_col=3, max_row=2):
... for cell in row:
... print(cell)
<Cell Sheet1.A1>
<Cell Sheet1.B1>
<Cell Sheet1.C1>
<Cell Sheet1.A2>
<Cell Sheet1.B2>
<Cell Sheet1.C2>

除此之外openpyxl.worksheet.Worksheet.iter_cols()方法可以返回列

>>> for col in ws.iter_cols(min_row=1, max_col=3, max_row=2):
... for cell in col:
... print(cell)
<Cell Sheet1.A1>
<Cell Sheet1.A2>
<Cell Sheet1.B1>
<Cell Sheet1.B2>
<Cell Sheet1.C1>
<Cell Sheet1.C2>

如果您需要遍历文件的所有行或列,您可以使用openpyxl.worksheet.Worksheet.rows()方法

>>> ws = wb.active
>>> ws['C9'] = 'hello world'
>>> tuple(ws.rows)
((<Cell Sheet.A1>, <Cell Sheet.B1>, <Cell Sheet.C1>),
(<Cell Sheet.A2>, <Cell Sheet.B2>, <Cell Sheet.C2>),
(<Cell Sheet.A3>, <Cell Sheet.B3>, <Cell Sheet.C3>),
(<Cell Sheet.A4>, <Cell Sheet.B4>, <Cell Sheet.C4>),
(<Cell Sheet.A5>, <Cell Sheet.B5>, <Cell Sheet.C5>),
(<Cell Sheet.A6>, <Cell Sheet.B6>, <Cell Sheet.C6>),
(<Cell Sheet.A7>, <Cell Sheet.B7>, <Cell Sheet.C7>),
(<Cell Sheet.A8>, <Cell Sheet.B8>, <Cell Sheet.C8>),
(<Cell Sheet.A9>, <Cell Sheet.B9>, <Cell Sheet.C9>))

或者openpyxl.worksheet.Worksheet.columns()方法

>>> tuple(ws.columns)
((<Cell Sheet.A1>,
<Cell Sheet.A2>,
<Cell Sheet.A3>,
<Cell Sheet.A4>,
<Cell Sheet.A5>,
<Cell Sheet.A6>,
...
<Cell Sheet.B7>,
<Cell Sheet.B8>,
<Cell Sheet.B9>),
(<Cell Sheet.C1>,
<Cell Sheet.C2>,
<Cell Sheet.C3>,
<Cell Sheet.C4>,
<Cell Sheet.C5>,
<Cell Sheet.C6>,
<Cell Sheet.C7>,
<Cell Sheet.C8>,
<Cell Sheet.C9>))

数据存储

一旦我们有了openpyxl.cell.Cell类,我们可以给它赋值

>>> c.value = 'hello, world'
>>> print(c.value)
'hello, world' >>> d.value = 3.14
>>> print(d.value)
3.14

你也可以启用类型和格式推断

>>> wb = Workbook(guess_types=True)
>>> c.value = '12%'
>>> print(c.value)
0.12 >>> import datetime
>>> d.value = datetime.datetime.now()
>>> print d.value
datetime.datetime(2010, 9, 10, 22, 25, 18) >>> c.value = '31.50'
>>> print(c.value)
31.5

保存到一个文件

最简单和最安全的保存工作簿的方法是调用openpyxl.workbook.Workbook对象的openpyxl.workbook.Workbook.save()方法

>>> wb = Workbook()
>>> wb.save('balances.xlsx')

警告:这个操作将在没有警告的情况下覆盖现有的文件。

扩展并不一定是xlsx或xlsm,如果您不使用官方扩展,直接用另一个应用程序打开它,您可能会遇到一些麻烦。

由于OOXML文件基本上是ZIP文件,所以您也可以用.ZIP结束文件名,并使用您最喜欢的ZIP归档管理器打开它。

你可以指定属性template=True,以保存工作簿作为模板。

>>> wb = load_workbook('document.xlsx')
>>> wb.template = True
>>> wb.save('document_template.xltx')

或者将该属性设置为False(缺省值),以保存为文档

>>> wb = load_workbook('document_template.xltx')
>>> wb.template = False
>>> wb.save('document.xlsx', as_template=False)

注意:您应该监视数据属性和文档扩展,以便在文档模板中保存文档,反之亦然,否则结果表引擎不能打开文档

以下将会导致错误

>>> wb = load_workbook('document.xlsx')
>>> # 需要用 *.xlsx扩展名保存
>>> wb.save('new_document.xlsm')
>>> # MS Excel不能打开文档
>>>
>>> # or
>>>
>>> # 需要指定属性keep_vba = True
>>> wb = load_workbook('document.xlsm')
>>> wb.save('new_document.xlsm')
>>> # MS Excel不能打开文档
>>>
>>> # or
>>>
>>> wb = load_workbook('document.xltm', keep_vba=True)
>>> # 如果我们需要一个模板文档,那么我们必须指定扩展为.xltm
>>> wb.save('new_document.xlsm')
>>> # MS Excel不能打开文档

从文件加载

和写一样,您可以导入openpyxl.load workbook()来打开现有的工作簿

>>> from openpyxl import load_workbook
>>> wb2 = load_workbook('test.xlsx')
>>> print wb2.get_sheet_names()
['Sheet2', 'New Title', 'Sheet1']

python第三方库之openpyxl(1)的更多相关文章

  1. Python第三方库之openpyxl(3)

    Python第三方库之openpyxl(3) 区域图 区域图类似于折线图,绘图线下面的区域会被填充,通过将分组设置为“standard”.“stacked”或“percentStacked”,可以获得 ...

  2. Python第三方库之openpyxl(12)

    Python第三方库之openpyxl(12) 地面天气图 在工作表上的列或行中安排的数据可以在一个表中绘制.当您想要在两组数据之间找到最佳组合时,一个表面图表是有用的.正如在地形图中一样,颜色和图案 ...

  3. Python第三方库之openpyxl(11)

    Python第三方库之openpyxl(11) Stock Charts(股票图) 在工作表上按特定顺序排列的列或行中的数据可以在股票图表中绘制.正如其名称所暗示的,股票图表通常被用来说明股价的波动. ...

  4. Python第三方库之openpyxl(10)

    Python第三方库之openpyxl(10) 雷达图 在工作表上的列或行中排列的数据可以在雷达图中绘制.雷达图比较多个数据系列的总值.它实际上是一个圆形x轴上的面积图的投影.有两种类型的雷达图:st ...

  5. Python第三方库之openpyxl(9)

    Python第三方库之openpyxl(9) 油炸圈饼图 甜甜圈图表与饼图相似,只是他们用的是环而不是圆.他们还可以将几个系列的数据绘制成同心环 from openpyxl import Workbo ...

  6. Python第三方库之openpyxl(8)

    Python第三方库之openpyxl(8) 饼图 饼图将数据绘制成一个圆片,每个片代表整体的百分比.切片是按顺时针方向绘制的,0在圆的顶部.饼图只能取一组数据.该图表的标题将默认为该系列的标题. 2 ...

  7. Python第三方库之openpyxl(7)

    Python第三方库之openpyxl(7) 散点图 散点或xy图表类似于一些折线图.主要的区别在于,一个系列的值被绘制在另一个值上.当值未排序时,这是有用的. from openpyxl impor ...

  8. Python第三方库之openpyxl(6)

    Python第三方库之openpyxl(6) 折线图 折线图允许在固定轴上绘制数据,它们类似于散列图,主要的区别在于,在折线图中,每个数据序列都是根据相同的值绘制的,不同的轴可以用于辅助轴,与条形图类 ...

  9. Python第三方库之openpyxl(5)

    Python第三方库之openpyxl(5) 气泡图 气泡图类似于散点图,但使用第三个维度来确定气泡的大小,图表可以包括多个项目 from openpyxl import Workbook from ...

  10. Python第三方库之openpyxl(4)

    Python第三方库之openpyxl(4) 2D柱状图 在柱状图中,值被绘制成水平条或竖列. 垂直.水平和堆叠柱状图. 注意:以下设置影响不同的图表类型 1.在垂直和水平条形图之间切换,分别设置为c ...

随机推荐

  1. 头部和信号栏一个颜色appcloud

    <header id="header" > <ul > <li class="active" onclick="api. ...

  2. 【原创】微信公众号与HTML 5混合模式揭秘4——jssdk调用微信扫一扫

    微信公众号与HTML 5混合模式揭秘1——如何部署JSSDK 微信公众号与HTML 5混合模式揭秘2——分享手机相册中照片 微信公众号与HTML 5混合模式揭秘3——JSSDK获取地理位置   在JS ...

  3. 【学习笔记】六:面向对象的程序设计——理解JS中的对象属性、创建对象、JS中的继承

    ES中没有类的概念,这也使其对象和其他语言中的对象有所不同,ES中定义对象为:“无序属性的集合,其属性包含基本值.对象或者函数”.现在常用的创建单个对象的方法为对象字面量形式.在常见多个对象时,使用工 ...

  4. 【extjs6学习笔记】0.1 准备:基础概念 (01)

    1. Ext.application 应用程序入口点 2. Ext.onReady() 页面加载完成后触发动作 3. Ext.define() 4. Ext.data.proxy.Proxy 5. E ...

  5. SqlDbx远程链接DB2数据库

    1.首先下载IBM的IBM Data Server Client,百度云链接:http://pan.baidu.com/s/1kVBVjan 密码:2gtz 2.安装好客户端之后,打开cmd,运行db ...

  6. NBUT 1117 Kotiya's Incantation(字符输入处理)

    题意: 比较两个串,有三种情况:完全相同,可见字符相同,不同.每个字符串以'-'结尾.难点在输入. 思路: 字符逐个读入,直到'-'为止,读出两串就可以直接进行判断.如果不足两串则结束.输入时需要注意 ...

  7. COGS 1578. 次小生成树初级练习题

    ☆   输入文件:mst2.in   输出文件:mst2.out   简单对比时间限制:1 s   内存限制:256 MB [题目描述] 求严格次小生成树 [输入格式] 第一行包含两个整数N 和M,表 ...

  8. Python学习日志9月15日

    一周就要过去了,而我跟一周以前没什么区别.回想一下,我这周做了什么事情呢.恍然若失.这周的精力都浪费在很多不必要的事情上了.学过一片古文,讲后羿学射箭,他有一个同学跟他一样聪明,在一起学习.后羿呢,专 ...

  9. Servlet The Filter

    The Filter Filter不会产生Request或者是Response, 但是会在两者访问资源时, 对其作出改变.其可以作用于静态资源和动态资源. LifeCycle Filter会和Serv ...

  10. 1.JOIN和UNION区别

    1.JOIN和UNION区别join 是两张表做交连后里面条件相同的部分记录产生一个记录集,union是产生的两个记录集(字段要一样的)并在一起,成为一个新的记录集 . JOIN用于按照ON条件联接两 ...