openpyxl3.0官方文档(1)——入门教程

创建工作簿¶

在使用openpyxl库时,无需创建一个空白的Excel文件。只需要导入Workbook类:

    >>> from openpyxl import Workbook
    >>> wb = Workbook()

在Excel工作簿中至少包含一个工作表。可以通过Workbook.active属性来获取当前活动工作表:

    >>> ws = wb.active

active属性默认为0。在未重新赋值情况下,可以使用此方法获得第一个工作表。
可以使用Workbook.create_sheet()方法来创建新的工作表:

    >>> ws1 = wb.create_sheet("Mysheet") # insert at the end (default)
    # or
    >>> ws2 = wb.create_sheet("Mysheet", 0) # insert at first position
    # or
    >>> ws3 = wb.create_sheet("Mysheet", -1) # insert at the penultimate position

如果新建表名相同,在创建时将自动按数字命名,例如Sheet, Sheet1, Sheet2。可以在任何时刻通过Worksheet.title属性来修改名称:

    ws.title = "New Title"

包含此标题的工作表标签的默认背景颜色为白色。可以将新的RRGGBB值赋值给Worksheet.sheet_properties.tabColor属性来修改颜色:

    ws.sheet_properties.tabColor = "1072BA"

在给工作表命名后,你就可以使用该名字作为工作簿的一个键来获取工作表:

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

可以通过Workbook.sheetname属性来获取所有的工作表名称:

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

您可以使用for循环遍历所有的工作表:

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

可以使用Workbook.copy_worksheet()方法在同一个工作簿中创建工作表的副本:

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

只有单元格(包括值、样式、超链接和注释)和某些工作表属性(包括维度、格式和属性)被复制。所有其他工作簿/工作表属性不被复制,例如图像、图表。
您也不能在工作簿之间复制工作表。如果工作簿是打开的、只读的或只写的,也不能复制工作表。

处理数据¶

访问一个单元格¶

现在我们知道如何获得工作表,我们可以开始修改单元格内容。可以把单元格位置作为工作表的键直接访问:

    >>> c = ws['A4']

这将返回A4位置的单元格。如果不存在将创建单元格A4。可以直接为单元格赋值:

    >>> ws['A4'] = 4

Worksheet.cell()方法可实现相同作用,该方法使用行和列值参数来访问单元格:

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

注解
在内存中创建工作表时,它不包含“单元格”。它们是第一次访问时创建的。
警告
由于这个特性,滚动单元格而不是直接访问单元格将在内存中创建所有单元格,即使您没有给它们赋值。
比如:

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

将在内存中创建100x100个单元格。

访问多个单元格¶

可以使用切片访问单元格区域:

    >>> cell_range = ws['A1':'C2']

可以单独指定行或列的范围:

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

您也可以使用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>

同样的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>

注解
出于性能原因,Worksheet.iter_cols()方法在只读模式下不可用。
如果需要遍历文件的所有行或列,可以使用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>))

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>))

注解
出于性能原因,Worksheet.columns属性在只读模式下不可用。

只包括数值¶

如果只需要工作表中的值,可以使用对象:obj:Worksheet.values属性。这将遍历工作表中的所有行,但只返回单元格值:

    for row in ws.values:
       for value in row:
         print(value)

两者Worksheet.iter_rows()Worksheet.iter_cols()可以设置values_only参数来仅返回单元格的值:

    >>> for row in ws.iter_rows(min_row=1, max_col=3, max_row=2, values_only=True):
    ...   print(row)
    (None, None, None)
    (None, None, None)

数据存储¶

当我们有一个单元格类Cell对象,我们就可以给它赋值:

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

保存到文件¶

保存工作簿最简单、最安全的方法是使用函数Workbook.save()

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

警告
此操作将覆盖现有文件而不发出警告。
注解
文件扩展名不必是xlsx或xlsm,但如果不使用正式扩展名,则可能在使用其他应用程序直接打开文件时遇到一些问题。
由于OOXML文件基本上是ZIP文件,因此您还可以使用您喜爱的ZIP压缩文档管理器打开它。

保存为流¶

如果要将文件保存到流中,例如在使用网络应用程序(如Pyramid、Flask或Django),则只需提供NamedTemporaryFile()

    >>> from tempfile import NamedTemporaryFile
    >>> from openpyxl import Workbook
    >>> wb = Workbook()
    >>> with NamedTemporaryFile() as tmp:
            wb.save(tmp.name)
            tmp.seek(0)
            stream = tmp.read()

可以指定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')
    >>> # Need to save with the extension *.xlsx
    >>> wb.save('new_document.xlsm')
    >>> # MS Excel can't open the document
    >>>
    >>> # or
    >>>
    >>> # Need specify attribute keep_vba=True
    >>> wb = load_workbook('document.xlsm')
    >>> wb.save('new_document.xlsm')
    >>> # MS Excel will not open the document
    >>>
    >>> # or
    >>>
    >>> wb = load_workbook('document.xltm', keep_vba=True)
    >>> # If we need a template document, then we must specify extension as *.xltm.
    >>> wb.save('new_document.xlsm')
    >>> # MS Excel will not open the document

从文件加载¶

和写入Excel文件类似,您可以使用openpyxl.load_workbook()方法打开现有工作簿:

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

本教程到此结束。

水平有限,如果有朋友发现文中许多翻译不当的地方,请随时指正。
翻译不易,也请大家多多点赞!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,386评论 6 479
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,939评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,851评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,953评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,971评论 5 369
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,784评论 1 283
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,126评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,765评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,148评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,744评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,858评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,479评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,080评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,053评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,278评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,245评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,590评论 2 343