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的工作表。
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 数据操作
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()
方法。但是
警告
需要注意的是,如果文件已存在,本操作将会直接覆盖文件,而不会提前警告。
注意
文件扩展名不强制为xlsx
或xlsm
,但如果不使用正式扩展名,则直接用另一个应用程序打开它可能会遇到一些问题。
由于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
输出结果是:['调查结果', '评价结果']
===
网友评论