在阅读本文之前,请确保您已满足或可能满足一下条件:
从如何使用Python操作Excel(一)中,我们可以得到一个“example.xlsx”文件,内容如图。
本文会继续讲解openpyxl的用法。
对工作表的行或列进行操作时,使用Worksheet
类中的方法,insert_row(),delete_row(),insert_col(),delete_col()
。
from openpyxl import load_workbook
import openpxl
wb = load_workbook("example.xlsx")
ws = wb.get_sheet_by_name("demo")
ws.insert_rows(1) # 在第一行前插入一行
ws.insert_rows(1, 2) # 在第一行前插入两个
ws.delete_rows(2) # 删除第二行
ws.delete_rows(2, 2) # 删除第二行及其后边一行(共两行)
ws.insert_cols(3) # 在第三列前插入一列
ws.insert_cols(3, 2) # 在第三列前插入两列
ws.delete_cols(4) # 删除第四列
ws.delete_cols(4, 2) #删除第四列及其后边一列(共两列)
wb.save("example.xlsx")
在前文中我们讲到了如何访问单元格,如:
ws['A1']
ws['A1'].value
我们还可以使用行或列的方式访问:
ws['A'][1].value # ws['A1'].value
ws[1][2].value # ws['C1'].value
ws['A'] # 会返回元祖,‘A’列中所有的内容
ws[1] # 会返回元祖,第1行中所有的内容
>>> ws[1]
(<Cell 'demo'.A1>, <Cell 'demo'.B1>, <Cell 'demo'.C1>, <Cell 'demo'.D1>, <Cell 'demo'.E1>, <Cell 'demo'.F1>, <Cell 'demo'.G1>, <Cell 'demo'.H1>, <Cell 'demo'.I1>, <Cell 'demo'.J1>, <Cell 'demo'.K1>, <Cell 'demo'.L1>, <Cell 'demo'.M1>, <Cell 'demo'.N1>, <Cell 'demo'.O1>, <Cell 'demo'.P1>, <Cell 'demo'.Q1>, <Cell 'demo'.R1>, <Cell 'demo'.S1>)
>>> ws['A']
(<Cell 'demo'.A1>, <Cell 'demo'.A2>, <Cell 'demo'.A3>, <Cell 'demo'.A4>, <Cell 'demo'.A5>, <Cell 'demo'.A6>, <Cell 'demo'.A7>, <Cell 'demo'.A8>, <Cell 'demo'.A9>, <Cell 'demo'.A10>, <Cell 'demo'.A11>, <Cell 'demo'.A12>, <Cell 'demo'.A13>, <Cell 'demo'.A14>, <Cell 'demo'.A15>, <Cell 'demo'.A16>, <Cell 'demo'.A17>, <Cell 'demo'.A18>, <Cell 'demo'.A19>)
PS:我们还可用切片的方式来访问一个范围内的单元格。
>>> ws["A1:B3"]
(
(<Cell 'demo'.A1>, <Cell 'demo'.B1>),
(<Cell 'demo'.A2>, <Cell 'demo'.B2>),
(<Cell 'demo'.A3>, <Cell 'demo'.B3>)
)
>>> ws["A1:B3"][1][1].value
4
>>> ws['A1':'B3']
(
(<Cell 'demo'.A1>, <Cell 'demo'.B1>),
(<Cell 'demo'.A2>, <Cell 'demo'.B2>),
(<Cell 'demo'.A3>, <Cell 'demo'.B3>)
)
>>>
请留意两种切片的不同。
还可以使用行切片或者列切片:
>>> ws['A:B']
((<Cell 'Sheet'.A1>, <Cell 'Sheet'.A2>, <Cell 'Sheet'.A3>, <Cell 'Sheet'.A4>, <Cell 'Sheet'.A5>, <Cell 'Sheet'.A6>, <Cell 'Sheet'.A7>, <Cell 'Sheet'.A8>, <Cell 'Sheet'.A9>, <Cell 'Sheet'.A10>, <Cell 'Sheet'.A11>, <Cell 'Sheet'.A12>, <Cell 'Sheet'.A13>, <Cell 'Sheet'.A14>, <Cell 'Sheet'.A15>, <Cell 'Sheet'.A16>, <Cell 'Sheet'.A17>, <Cell 'Sheet'.A18>, <Cell 'Sheet'.A19>), (<Cell 'Sheet'.B1>, <Cell 'Sheet'.B2>, <Cell 'Sheet'.B3>, <Cell 'Sheet'.B4>, <Cell 'Sheet'.B5>, <Cell 'Sheet'.B6>, <Cell 'Sheet'.B7>, <Cell 'Sheet'.B8>, <Cell 'Sheet'.B9>, <Cell 'Sheet'.B10>, <Cell 'Sheet'.B11>, <Cell 'Sheet'.B12>, <Cell 'Sheet'.B13>, <Cell 'Sheet'.B14>, <Cell 'Sheet'.B15>, <Cell 'Sheet'.B16>, <Cell 'Sheet'.B17>, <Cell 'Sheet'.B18>, <Cell 'Sheet'.B19>))
>>> ws[1:2]
((<Cell 'Sheet'.A1>, <Cell 'Sheet'.B1>, <Cell 'Sheet'.C1>, <Cell 'Sheet'.D1>, <Cell 'Sheet'.E1>, <Cell 'Sheet'.F1>, <Cell 'Sheet'.G1>, <Cell 'Sheet'.H1>, <Cell 'Sheet'.I1>, <Cell 'Sheet'.J1>, <Cell 'Sheet'.K1>, <Cell 'Sheet'.L1>, <Cell 'Sheet'.M1>, <Cell 'Sheet'.N1>, <Cell 'Sheet'.O1>, <Cell 'Sheet'.P1>, <Cell 'Sheet'.Q1>, <Cell 'Sheet'.R1>, <Cell 'Sheet'.S1>), (<Cell 'Sheet'.A2>, <Cell 'Sheet'.B2>, <Cell 'Sheet'.C2>, <Cell 'Sheet'.D2>, <Cell 'Sheet'.E2>, <Cell 'Sheet'.F2>, <Cell 'Sheet'.G2>, <Cell 'Sheet'.H2>, <Cell 'Sheet'.I2>, <Cell 'Sheet'.J2>, <Cell 'Sheet'.K2>, <Cell 'Sheet'.L2>, <Cell 'Sheet'.M2>, <Cell 'Sheet'.N2>, <Cell 'Sheet'.O2>, <Cell 'Sheet'.P2>, <Cell 'Sheet'.Q2>, <Cell 'Sheet'.R2>, <Cell 'Sheet'.S2>))
首先你要清晰的明白,你要使用的公式是什么。同时你需要知道的是,openpyxl能够在工作表中执行公式进行计算,但是并不能在程序中打印公式的值
>>> ws['A20']="=SUM(A1:A19)"
>>> ws['A20'].value
'=SUM(A1:A19)'
>>> wb.save("formula.xlsx") # 请查看A20
即便如此,openpyxl却可以帮助你检查公式名是否正确:
>>> from openpyxl.utils import FORMULAE
>>> "SUM" in FORMULAE
True
当然,你也可以用print(FORMULAE)
来看看都有什么公式可以用(与Excel并没有什么不一样)。
使用ws.move_range()
方法来移动单元格。
ws.move_range("D4:F10", rows=-1, cols=2)
会将单元格D4-F10
,向上移动1行,想右移动两行。参数ows和cols
用来控制单元格的移动方向。如果目标单元格有内容,会被覆盖。
使用ws.merge_cells()和ws.unmerge_cell()
l来和合并,拆分单元格。
>>> ws.merge_cells('A2:D2') # 值为ws['A2']的值
>>> ws["A2"] # <Cell 'demo'.A2>
>>> ws["A2"].value # 2
>>> ws["B2"].value # 空
>>> ws.unmerge_cells('A2:D2') # 值会回到ws['A2'],'B2:D2'会为空。
>>> ws.merge_cells(start_row=2, start_column=1, end_row=4, end_column=4)
>>> ws.unmerge_cells(start_row=2, start_column=1, end_row=4, end_column=4)
想要用openpyxl
向工作表中插入图片,需要安装Pillow
库:
from openpyxl.drawing.image import Image
img = Image('logo.jpg')
ws.add_image(img, 'A21')
wb.save("img.xlsx")
ws1 = wb.create_sheet() # 新建一张表Sheet
ws1.column_dimensions.group('A','D', hidden=True) # 列折叠,A-D列
ws1.row_dimensions.group(1,10, hidden=True) # 行折叠 1-10行
wb.save('group.xlsx')
只读模式,仅用来读取文档内信息,不可写。
wb = load_workbook(filename="example.xlsx", read_only=True)
wb.create_sheet("test.xlsx") # 会报错
Traceback (most recent call last):
File "<pyshell#27>", line 1, in <module>
wb.create_sheet("test.xlsx")
File "D:\Python\lib\site-packages\openpyxl\workbook\workbook.py", line 194, in create_sheet
raise ReadOnlyWorkbookException('Cannot create new sheet in a read-only workbook')
openpyxl.utils.exceptions.ReadOnlyWorkbookException: Cannot create new sheet in a read-only workbook
只写模式,仅用来写入数据。
wb = Workbook(write_only=True)
ws = wb.create_sheet()
type(ws) # <class 'openpyxl.worksheet._write_only.WriteOnlyWorksheet'>
hasattr(ws,"value") # false
hasattr(ws,"title") # True
即是说,ws已经不是worksheet对象,而是WriteOnlyWorksheet对象,也没有value属性,不可以读取单元格的值。这样做是为了让Python处理只有写入大量数据的情况,更快。
可以使用Cell
对象的nember_format
属性来查看单元格的数字样式。
wb = load_workbook("example.xlsx")
ws = wb.active
ws['A1'].nember_format # 'General'
# 现在将单元格的数字格式设置为数值
ws['A1'].nember_format # '0.00_ '
# 可以在Python中修改数字格式如:
ws['A1'].nember_format = 'General'
# 单元格可以直接赋值时间日期类型的数据类型,如:
ws['A1'] = datetime.datetime.now()
ws['A1'].value # datetime.datetime(2019, 6, 9, 19, 57, 40, 918556)
# 可以用is_date属性判断单元格是否为日期类型的数据
ws['A1'].is_date
今天的内容主要是及第一篇文章之后,继续讲如何使用Python操作单元格和工作表。
好了,今天的内容就到这里了。我们下次见。