用openpyxl操作excel表格
用openpyxl操作excel表格
openpyxl 是一个用来操作excel 2010 的xlsx/xlsm的Python库。
官方文档
安装
pip3 install openpyxl
如果excel表格里面包含图片,想处理图片的话,需要安装pillowpip3 install Pillow
首先来个例子
from openpyxl import Workbook
wb = Workbook()
# 切换到活动工作表
ws = wb.active
# 数据可以直接写到单元格中
ws['A1'] = 42
# 可以用append添加行
ws.append([1,2,3])
# Python数据可以直接转换
import datetime
ws['A2'] = datetime.datetime.now()
#保存
wb.save('sample.xlsx')
创建一个excel文档
我们没必要创建一个文档来体验openpyxl,只需要导入Workbook类就可以开始使用openpyxl了。
from openpyxl import Workbook
wb = Workbook()
一个工作薄(workbook)创建之后至少含有一个工作表(worksheet),我们可以用openpyxl.workbook.Workbook.active()
来切换切换为当前使用的工作表。ws = wb.active
如果有多个worksheet,我们一般是切换到第一个工作表
我们也可以用openpyxl.workbook.Workbook.create_sheet()
来创建工作表。
# 创建一个worksheet在最后面的位置(默认创建的工作表会在最后面,除非你指定位置)
ws1 = wb.create_sheet("mysheet1")
#创建一个工作表在最前面的位置,注意编号
ws2 = wb.create_sheet("mysheet",0)
当然我们也可以更改worksheet的名字用 title 属性ws.title = "New Title"
默认的标签颜色是白色的,我们也可以用tabColor属性更改标签颜色,颜色格式为RRGGBBws.sheet_properties.tabColor = "1072BA"
当然,如果你更改了工作表(worksheet)的名字,你可以用切换过去ws = wb["New Title"]
你可以用openpyxl.workbook.Workbook.sheetnames()
来查看所有工作表名。print(wb.sheetnames)
当然,你也可以遍历一下
for sheet in wb:
print(sheet.title)
我们可以用openpyxl.workbook.Workbook.copy_worksheet()
来复制工作表
source = wb.active
target = wb.copy_worksheet(source)
只可以复制单元格和样式,无法在工作薄之间复制单元格。
数据操作
编辑一个单元格
我们已经知道了如何访问工作表(worksheet),下面我们就可以修改单元格内容了。
我们可以直接得到单元格内容c = ws["A4"]
也可以直接修改单元格内容ws["A4"] = 4
有workbook方法,当然也有worksheet方法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)
这样会创建100*100个单元格,当然,里面什么内容都没有
编辑多个单元格
我们可以用切片来访问一个单元格范围cell_range = ws["A1":"C2"]
行和列我们也可以用类似的方法得到
colc = ws["C"]
col_range = ws["C:D"]
row10 = ws[10]
row_range = ws[5:10]
你也可以用openpyxl.worksheet.Worksheet.iter_rows()
方法
>>>> for col 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>
同样,用openpyxk.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.cols
属性
>>> tuple(ws.cols)
((<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
你也可以启用数据类型和格式判断
You can also enable type and format inference
>>> wb = Workbook(guess_types = True)
>>> c.value = '12%'
>>> print(c.value)
0.12
1.
>>> import datetime
>>> d.value = datetime.datetime.now()
>>> print(d.value)
datetime.datetime.now(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("balance.xlsx")
警告:
如果balance.xlsx文件已经存在,会被直接覆盖掉,木有任何提示的哦
考虑到你可能没有对应的软件来打开office文件,所以并不是强制你必须保存为xlsx或者xlsm文件。
因为OOXML文件是基于.zip文件的,所以你可以以.zip作为后缀,然后用你喜欢的压缩文件管理器来打开。
下面还有一部分没有翻译,因为暂时用不到那些功能,以后用上了再说吧。
打开一个文件,读取里面数据
你可以用openpyxl.load_workbook()
来打开文件
>>> from openpyxl import load_workbook
>>> wb2 = load_workbook("test.xlsx")
>>> print(wb2.get_sheet_names())
['Sheet2', 'New Title', 'Sheet1']
>>>ws = wb['sheet2']
>>>ws['A1'].value
'姓名'