Python操作Excel——openpyxl使用笔记(3)
3 单元格基本操作
3.1 访问单元格和读写其内容
在前面的例子中,已经简单演示过了向单元格中写入和读取数据。这里进一步提供访问单元格的一些方法。和前面一样,使用工作表的索引方式,可以快速定位一个单元格:
import openpyxl
wb = openpyxl.open('./test.xlsx')
ws=wb.active
cell0=ws['B2']
cell0.value="openpyxl"
wb.save('./test.xlsx')
wb.close()
运行后,在活动工作表的B2中会写入数据:
另外一种方式就是使用工作表的cell函数定位一个单元格,它接受行和列作为参数,返回对应位置的单元格,注意计数的基数是从1开始的,而不是0,测试代码如下:
import openpyxl
wb = openpyxl.open('./test.xlsx')
ws=wb.active
cell1=ws.cell(row=2,column=3)
cell1.value="new method"
wb.save('./test.xlsx')
wb.close()
显然cell1是第二行第三列,也就是C3,执行脚本后效果如下:
通过单元格的value属性,设置或者读取其中的值。
3.2 获取单元格的行数和列数
有时需要获取一张工作表中,包含了多少行和多少列有效数据,这个时候可以使用工作表的属性max_row和max_column,以及min_row和min_column,这四个值返回的都是整数,表示包含有效数据的最大、最小行或者列。
例如,一个工作表中有如下的内容:
则min_row返回4,min_column返回3,max_row返回10,max_column返回7,如下代码所示:
import openpyxl
wb = openpyxl.open('./test.xlsx')
ws=wb.active
print(f'Min Row: {ws.min_row}') # 4
print(f'Min Column: {ws.min_column}') # 3
print(f'Max Row: {ws.max_row}') # 10
print(f'Max Column: {ws.max_column}') # 7
wb.close()
3.3 范围单元格操作
可以按列或者行进行遍历某个范围内的所有单元格,以先列后行的方式:
import openpyxl
wb = openpyxl.load_workbook('./test.xlsx')
ws = wb.active
x=0
for col in ws.iter_cols(min_col=3, max_col=7, min_row=4, max_row=6):
for cell in col:
cell.value=x
x+=1
wb.save('./test.xlsx')
wb.close()
脚本运行后内容如下:
如果使用iter_rows,则是先遍历行,再遍历列:
import openpyxl
wb = openpyxl.load_workbook('./test.xlsx')
ws = wb.active
x=0
for row in ws.iter_rows(min_row=2, max_row=6, min_col=1, max_col=4):
for cell in row:
cell.value=x
x+=1
wb.save('./test.xlsx')
wb.close()
脚本运行后内容如下:
3.4 删除行或列
使用工作表的del_rows可以删除连续的1行或多行,对于列是使用函数del_columns,例如,打开一个空白的test.xlsx文件,填充10行,然后删除5~6行:
wb = openpyxl.load_workbook('./test.xlsx')
ws = wb.active
for i in range(1, 11):
ws.cell(row=i, column=1).value = i
ws.delete_rows(5, 2)
wb.save('./test.xlsx')
wb.close()
运行效果如下:
如果只删除一行,则第二个参数可以省略。对于列的删除操作,也是类似的,这里就不通过脚本演示了。
3.5 插入行或列
向工作表中插入行或者列,可以使用insert_rows或者insert_cols,这两个函数会在指定行前面插入一定数量的行或者列。例如,打开一个空白的test.xlsx文件,填充10行,然后在第3行前面插入2行:
import openpyxl
wb = openpyxl.load_workbook('./test.xlsx')
ws = wb.active
for i in range(1, 11):
ws.cell(row=i, column=1).value = i
ws.insert_rows(3, 2)
wb.save('./test.xlsx')
wb.close()
脚本运行效果如下:
可以看到在原来的第三行之前插入了两行,对于列也是类似的,此处从略。