§1 教程

1 教程

1.1 创建工作薄

1.1.1 创建一个工作薄

使用openpyxl时不需要在计算机文件系统中提前创建excel工作簿文件,只需要导入Workbook类即可。

from openpyxl import Workbook

wb = Workbook()
wb.save('text.xlsx')
  • 程序运行时可以新建一个text.xlsx文件;
  • 也可以打开并修改一个现有的“text. xlsx”文件。前提是文件没有被占用;
  • 除非特别指定路径,否则,文件是在程序文件的同一路径之下。

1.1.2 添加工作表

1.1.2.1 active方法

一个工作簿(workbook)至少要有一个工作表(worksheet),可以使用Workbook.active属性创建一个默认工作表。

ws = wb.active

使用此方法创建的工作表位置需要默认是0。
除非创建时修改工作表位置,否则此方法创建的的工作表默认都是第一个工作表,即序号为0的工作表。

image.png

1.1.2.2 create_sheet()方法

另外,还可以使用Workbook.create_sheet()方法创建工作表

ws1 = wb.create_sheet("Mysheet0") # 从后方插入一个工作表(默认)
# or
ws2 = wb.create_sheet("Mysheet1", 0) # 从最前面插入一个工作表。
# or
ws3 = wb.create_sheet("Mysheet2", -1) # 在倒数第二的位置插入一个工作表。
image.png

1.1.3 工作表命名

工作表创建时名称会自动命名,命名的序列是 (Sheet, Sheet1, Sheet2, …)。我们也可以随时修改工作表名称,工作表名称修改时,使用Worksheet.title的属性:

ws1.title = "插入工作表1"
ws2.title = "插入工作表2"  
ws3.title = "插入工作表3" 

1.1.4 更改工作表标签的背景色

工作表标签背景色默认是白色,我们可以使用Worksheet.sheet_properties.tabColor属性改变背景颜色,此时的背景色代码应为“RRGGBB”格式。

ws1.sheet_properties.tabColor = "1072BA"
image.png

1.1.5 获取工作表

  • 给工作表命名后,可以将名称作为工作簿关键字的方式获取。
print(wb["插入工作表1"]) # ws4实际上就是ws1
  • 使用属性Workbook.sheetnames获取工作簿所有的工作表名称。
print(wb.sheetnames)
image.png
  • 也可以循环浏览工作表
for sheet in wb: 
    print(sheet)
    print(sheet.title)
image.png

1.1.6 复制工作表

在同一工作薄里面通过复制创建工作表。方法:Workbook.copy_worksheet()

source = wb.active
target = wb.copy_worksheet(source)
image.png

注意:

  1. 只有表格中的数据、格式、超链接、注释以及一部分工作表属性(包括尺寸、格式和特性等)会被复制,其他的诸如图片、图表等不会被复制。
  2. 不能跨工作薄复制。
  3. 只读模式的工作表不能复制。

1.2 数据操作

1.2.1 单个单元格

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

c = ws['A4']

这将返回A4处的单元格,或者创建一个不存在的单元格。也可直接赋值:ws['A4'] = 6
也可以通过Worksheet.cell()方法进行赋值。该方法可以使用行和列表示法访问单元格:
d = ws.cell(row=1,column=4,value=6) # 行列值的顺序

注意:在内存中创建工作表时,工作表对象一般是不包含单元格。单元格是在第一次访问时才创建的。

正是由于这个特性,需要创建单元格时一般是使用滚动单元格方式创建,而不是直接访问并给它们赋值。例如下面这个方法就是创建了一个100*100的空单元格。

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

1.2.2 多单元格操作

  • 可以使用切片功能访问指定范围的单元格.cell_range = ws['A1':'C2']
  • 行或列的范围可以简单的获得
colC = ws['C'] # 获取C列
col_range = ws['C:D'] # 获取c、d两列
row10 = ws[10] # 获取的10行
row_range = ws[5:10] # 获取第5-10行
  • 使用方法Worksheet.iter_rows()获取行
for row in ws.iter_rows(min_row=1,max_row=2,max_col=3):
    for cellin row:
         print(cell)
图片.png
  • 使用方法Worksheet.iter_cols()获取列。须注意的是,由于性能原因,该方法在只读模式下不可用。
for row in ws.iter_cols(min_row=1,max_row=2,max_col=3):
    for cellin row:
         print(cell)
图片.png
  • 如果需要整篇文档的行,可以使用 Worksheet.rows属性
ws = wb.active
ws['C9'] = 'hello world'
a = tuple(ws.rows)
print(a)
图片.png
  • 如果需要整篇文档的列,可以使用 Worksheet.columns属性。但需注意,只读模式下不适用。
ws = wb.active
ws['C9'] = 'hello world'
b = tuple(ws.columns)
print(a)
图片.png

1.2.3 值的操作

如果是只针对工作表中的值进行操作,可以使用属性Worksheet.values。此时会按行迭代工作表中的所有值。
If you just want the values from a worksheet you can use the Worksheet.values property. This iterates over all the rows in a worksheet but returns just the cell values:

for row in ws.values: # 读取行的值
    for value in row: # 读取每个单元格的值
        print(value) # 打印出每个单元格的值
图片.png

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)
效果
for col in ws.iter_cols(min_row=1,max_row=5,max_col=3,values_only=True):
    print(col) # 打印包含列数据的列表
图片.png

1.3 数据保存

如果我们知道了某一个单元格,我们就可以给这个单元格分配一个数据。

# 变量赋值
c = ws['A2']
d = ws.cell(2,2)

# 单元格数据赋值
c.value = 20200726
d.value = '赵宝玉'

# 显示单元格数据
print(c.value)
print(d.value)

1.3.1 保存数据至文件

保存数据是简单直接也是最安全的方法是使用Workbook对象的workbook.save()方法。但是

警告
需要注意的是,如果文件已存在,本操作将会直接覆盖文件,而不会提前警告。

注意
文件扩展名不强制为xlsxxlsm,但如果不使用正式扩展名,则直接用另一个应用程序打开它可能会遇到一些问题。
由于OOXML文件基本上是ZIP文件,所以您也可以用您最喜欢的ZIP文档管理器打开它。

from openpyxl import Workbook

wb = Workbook() # 给工作薄赋值,注意大小写
wb.save('student.xlsx')

或者

import openpyxl

wb = openpyxl.Workbook()
wb.save('student.xlsx')

1.3.2 保存为流文件

如果你相保存为流文件时,在使用诸如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”属性将工作薄保存为模板文件。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无法打开文档

# 或者

# 需要特别指出属性“ keep_vba=True”
wb = load_workbook('document.xlsm')
wb.save('new_document.xlsm')
# MS Excel无法打开文档

# 或者

wb = load_workbook('document.xltm', keep_vba=True)
# 如果需要模板文件,需要特别指明扩展名为“*.xltm”
wb.save('new_document.xlsm')
# MS Excel无法打开文档

1.4 加载文件

与写入文件一样,我们可以使用openpyxl.load_workbook()方法来打开已存在的工作薄文件。

from openpyxl import load_workbook

wb2 = load_workbook(result.xlsx')
print wb2.sheetnames

输出结果是:['调查结果', '评价结果']

===

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