0 前言
在阅读本文之前,请确保您已满足或可能满足一下条件:
请确保您具备基本的Python编程能力。
请确保您会使用Excel。
请确保您的电脑已经安装好Python且pip可用。
请确保您已经读过前文:
如何使用Python操作Excel(一)LogicPanda,公众号:编程杂艺Python | 使用Python操作Excel文档(一)
从如何使用Python操作Excel(一)中,我们可以得到一个“example.xlsx”文件,内容如图。
本文会继续讲解openpyxl的用法。
1. 在工作表中插入/删除行/列
对工作表的行或列进行操作时,使用Worksheet
类中的方法,insert_row(),delete_row(),insert_col(),delete_col()
。
from openpyxl import load_workbookimport openpxlwb = 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")
2. 访问单元格
在前文中我们讲到了如何访问单元格,如:
ws['A1']ws['A1'].value
我们还可以使用行或列的方式访问:
ws['A'][1].value # ws['A1'].valuews[1][2].value # ws['C1'].valuews['A'] # 会返回元祖,‘A’列中所有的内容ws[1] # 会返回元祖,第1行中所有的内容
>>> ws[1] (, , , , , , , , , , , , , , , , , , )>>> ws['A'] (, , , , , , , , , , , , , , , , , , )
PS:我们还可用切片的方式来访问一个范围内的单元格。
>>> ws["A1:B3"] ((, ),(, ),(, ))>>> ws["A1:B3"][1][1].value 4>>> ws['A1':'B3'] ((, ),(, ),(, ))>>>
请留意两种切片的不同。
还可以使用行切片或者列切片:
>>> ws['A:B']((, , , , , , , , , , , , , , , , , , ), (, , , , , , , , , , , , , , , , , , ))>>> ws[1:2]((, , , , , , , , , , , , , , , , , , ), (, , , , , , , , , , , , , , , , , , ))
3. 使用公式
首先你要清晰的明白,你要使用的公式是什么。同时你需要知道的是,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并没有什么不一样)。
4. 移动单元格
使用ws.move_range()
方法来移动单元格。
ws.move_range("D4:F10", rows=-1, cols=2)
会将单元格D4-F10
,向上移动1行,想右移动两行。参数ows和cols
用来控制单元格的移动方向。如果目标单元格有内容,会被覆盖。
5. 拆分/合并单元格
使用ws.merge_cells()和ws.unmerge_cell()
l来和合并,拆分单元格。
>>> ws.merge_cells('A2:D2') # 值为ws['A2']的值>>> ws["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)
6. 插入图片
想要用openpyxl
向工作表中插入图片,需要安装Pillow
库:
from openpyxl.drawing.image import Imageimg = Image('logo.jpg') ws.add_image(img, 'A21')wb.save("img.xlsx")
7. 折叠
ws1 = wb.create_sheet() # 新建一张表Sheetws1.column_dimensions.group('A','D', hidden=True) # 列折叠,A-D列ws1.row_dimensions.group(1,10, hidden=True) # 行折叠 1-10行wb.save('group.xlsx')
8. 只读模式与只写模式
只读模式,仅用来读取文档内信息,不可写。
wb = load_workbook(filename="example.xlsx", read_only=True)wb.create_sheet("test.xlsx") # 会报错Traceback (most recent call last): File "", line 1, in 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) # hasattr(ws,"value") # falsehasattr(ws,"title") # True
即是说,ws已经不是worksheet对象,而是WriteOnlyWorksheet对象,也没有value属性,不可以读取单元格的值。这样做是为了让Python处理只有写入大量数据的情况,更快。
9.数字格式
可以使用Cell
对象的nember_format
属性来查看单元格的数字样式。
wb = load_workbook("example.xlsx")ws = wb.activews['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
10. 复习下今天内容
今天的内容主要是及第一篇文章之后,继续讲如何使用Python操作单元格和工作表。
插入/删除行或列,访问单元格的方法
移动单元格,合并/拆分单元格
插入图像、使用公式折叠行/列
使用数字格式,只读和只写模式
好了,今天的内容就到这里了。我们下次见。
如果您对本文或者本公众号感兴趣,欢迎关注我的公众号,留言您想看的内容,在这里,我们一起成长!
"不止于编程"