5 其他操作
5.1 合并单元格
有些Excel表格存在合并多个单元格的情况,此时可以使用工作表的merge_cells函数,例如合并第1~2行和1~2列:
import openpyxl
from openpyxl.comments import Comment
wb = openpyxl.load_workbook('./test.xlsx')
ws = wb.active
# merge cells
ws.merge_cells('A1:B2')
wb.save('./test.xlsx')
wb.close()
运行效果如下:
通常建议是合并以后,再向合并的单元格中填写内容,如果合并的多个单元格,每个里面都有内容,则执行合并操作后,以合并前左上角的单元格的内容作为合并后的内容,其他单元格的内容都会消失。
另外,如果合并单元格以后需要访问和修改该合并单元格的内容,则也应该使用合并前左上角单元格的位置索引,而其他单元格中的值不能被修改:
import openpyxl
from openpyxl.comments import Comment
wb = openpyxl.load_workbook('./test.xlsx')
ws = wb.active
# merge cells
ws['A1'].value='A1'
ws['B1'].value='B1'
ws['A2'].value='A2'
ws['B2'].value='B2'
ws.merge_cells('A1:B2')
ws['A1'].value='MC_A1'
print(ws['A2'].value) # print 'None'
# the line below will raise Exception
# ws['B2'].value='MC_B2'
wb.save('./test.xlsx')
wb.close()
运行效果如下:
另外,已经被其他单元格合并的单元格,不应该参与到其他的合并单元格操作,这种操作在openpyxl中运行没问题,但是当Excel尝试打开时会报错,以下是测试代码:
import openpyxl
wb = openpyxl.load_workbook('./test.xlsx')
ws = wb.active
ws.merge_cells('A1:B2')
ws.merge_cells('B2:C4')
wb.save('./test.xlsx')
wb.close()
显然B2这个单元格参与了两此单元格合并,程序运行正常,没有报错,但是尝试打开Excel文档时,会出现如下提示:
因此在合并单元格时需要格外小心。
5.2. 拆分单元格
有合并单元格,自然也有拆分单元格,函数名称也是对应的,即merge_cells函数,用于拆分已经合并的单元格,例如前面已经合并了A1~B2四个单元格的表格,拆分脚本如下:
import openpyxl
wb = openpyxl.load_workbook('./test.xlsx')
ws = wb.active
ws.unmerge_cells('A1:B2')
wb.save('./test.xlsx')
wb.close()
运行效果如下:
被拆分的单元格会分解为单个的单元格,拆分前的单元格中,如果有值的话,会保留在左上角的单元格中。
另外,如果一个单元格并不是可拆分的,则会产生错误:
ValueError: Cell range A1:B2 is not merged
5.3 插入图片
向工作表中插入图片,可以使用add_image函数,例如,图片和文件分别是image.png和test.xlsx,插入图片的脚本如下:
import openpyxl
from openpyxl.drawing.image import Image
wb = openpyxl.load_workbook('./test.xlsx')
ws = wb.active
img=Image('image.png')
ws.add_image(img, 'C2')
wb.save('./test.xlsx')
wb.close()
其中第一个参数是一个Image对象,而第二个参数是所插入的锚点,图像的左上角将和这个单元格的左上角对齐。上述脚本运行效果如下: