【python自动化办公(7)】python操作Exce文件,插入数据、公式、插入和删除行列、冻结窗格、复制表单、创建新表单、添加筛选模式(挑选满足条件数据并转移)

修改表格内容

向某个格子写入数据并保存

sheet[‘A1’] = ‘你好啊’

import os
os.chdir('D:\\python_major\\auto_office7')
from openpyxl import load_workbook

workbook = load_workbook(filename= '这是一个表格.xlsx')
sheet = workbook.active
sheet['A1'] = '你好呀'
workbook.save(filename='这是一个表格.xlsx')

向某个cell实例写入内容并保存

cell.value = ‘你好呀’

workbook = load_workbook(filename= '这是一个表格.xlsx')
sheet = workbook.active
cell = sheet['A1'] 
cell.value = '你好呀'
workbook.save(filename='这是一个表格.xlsx')

用Python列表插入行数据

sheet.append(Python列表) 插入的数据会接在表格内已有数据后面

workbook = load_workbook(filename= '这是一个表格.xlsx')
sheet = workbook.active
data = [
    ['张三',1],
    ['李四',2],
    ['王五',3],
    ['赵六',4],
]

for row in data:
    sheet.append(row)

workbook.save(filename='这是一个表格.xlsx')

–> 输出结果为:
【python自动化办公(7)】python操作Exce文件,插入数据、公式、插入和删除行列、冻结窗格、复制表单、创建新表单、添加筛选模式(挑选满足条件数据并转移)_第1张图片

插入公式

直接赋值公式字符串

workbook = load_workbook(filename= '阿里云天池电商婴儿用户数据.xlsx')
sheet = workbook.active
sheet['F1002'] = '=AVERAGE(F2:F1001)'
workbook.save(filename='阿里云天池电商婴儿用户数据.xlsx')

【python自动化办公(7)】python操作Exce文件,插入数据、公式、插入和删除行列、冻结窗格、复制表单、创建新表单、添加筛选模式(挑选满足条件数据并转移)_第2张图片

查看openpyxl支持的公式

from openpyxl.utils import FORMULAE 
print(FORMULAE)

–> 输出结果为:
【python自动化办公(7)】python操作Exce文件,插入数据、公式、插入和删除行列、冻结窗格、复制表单、创建新表单、添加筛选模式(挑选满足条件数据并转移)_第3张图片

插入多列

.insert_cols(idx = 数字编号,amount = 要插入的列数) 在idx数字编号的列左边插入几列

workbook = load_workbook(filename= '这是一个表格.xlsx')
sheet = workbook.active
sheet.insert_cols(idx = 2,amount =3)
workbook.save(filename='这是一个表格.xlsx')

插入多行

.insert_rows(idx = 数字编号,amount = 要插入的列数) 在idx数字编号的行上边插入几行

workbook = load_workbook(filename= '这是一个表格.xlsx')
sheet = workbook.active
sheet.insert_rows(idx = 2,amount =3)
workbook.save(filename='这是一个表格.xlsx')

删除列

.delete_cols(idx = 数字编号,amount = 要插入的列数) 从idx这一行开始,包括idx这一行

workbook = load_workbook(filename= '这是一个表格.xlsx')
sheet = workbook.active
sheet.delete_rows(idx = 2,amount =3)
workbook.save(filename='这是一个表格.xlsx')

删除行

.delete_rows(idx = 数字编号,amount = 要插入的列数) 从idx这一列开始,包括idx这一列

workbook = load_workbook(filename= '这是一个表格.xlsx')
sheet = workbook.active
sheet.delete_cols(idx = 2,amount =3)
workbook.save(filename='这是一个表格.xlsx')

移动格子

.move_range(‘C1:D4’,rows=2,cols=-2) 正整数 为向下或者向右,负整数为向左或向上

workbook = load_workbook(filename= '这是一个表格.xlsx')
sheet = workbook.active
sheet.move_range('C1:D4', rows =2, cols=-2)
workbook.save(filename='这是一个表格.xlsx')

修改前:
【python自动化办公(7)】python操作Exce文件,插入数据、公式、插入和删除行列、冻结窗格、复制表单、创建新表单、添加筛选模式(挑选满足条件数据并转移)_第4张图片
修改后:
【python自动化办公(7)】python操作Exce文件,插入数据、公式、插入和删除行列、冻结窗格、复制表单、创建新表单、添加筛选模式(挑选满足条件数据并转移)_第5张图片

创建新的sheet

workbook.create_sheet(sheet名称)

workbook = load_workbook(filename= '这是一个表格.xlsx')
print(workbook.sheetnames)
workbook.create_sheet('表格2')
print(workbook.sheetnames)
workbook.save(filename='这是一个表格.xlsx')

–> 输出结果为:

[‘Sheet1’]

[‘Sheet1’, ‘表格2’]

删除一个sheet

workbook.remove(sheet实例)

workbook = load_workbook(filename= '这是一个表格.xlsx')
print(workbook.sheetnames)
sheet = workbook['表格2'] #sheet实例
workbook.remove(sheet)
print(workbook.sheetnames)
workbook.save(filename='这是一个表格.xlsx')

–> 输出结果为:

[‘Sheet1’, ‘表格2’]

[‘Sheet1’]

复制一个sheet

workbook.copy_worksheet(sheet实例)

workbook = load_workbook(filename= '这是一个表格.xlsx')
print(workbook.sheetnames)
sheet = workbook['Sheet1'] #sheet实例
workbook.copy_worksheet(sheet)
print(workbook.sheetnames)
workbook.save(filename='这是一个表格.xlsx')

–> 输出结果为:

[‘Sheet1’]

[‘Sheet1’, ‘Sheet1 Copy’]

创建新的Excel表格文件

sheet.title 修改表格的名称

from openpyxl import Workbook

workbook = Workbook()
sheet = workbook.active
sheet.title = '表格1'
workbook.save(filename='这是一个新表格.xlsx')

特别注意,这里从openpyxl模块引入的不再是load_workbook方法,而是Workbook方法,上述代码运行后会创建一个名为’这是一个新表格.xlsx’的Excel文件

冻结窗格

sheet.freeze_panes = ‘G2’

workbook = load_workbook(filename = '阿里云天池电商婴儿用户数据.xlsx')
sheet = workbook.active
sheet.freeze_panes = 'G2'
workbook.save(filename='阿里云天池电商婴儿用户数据.xlsx')

冻结的结果是,在这个窗格的左上都是不动的,当移动滑块时,变化的只有窗格的右下方数据。也就是当运行此程序代码后,Excel表格里面会在G2窗格(左上方)处出现’十字’坐标线,在第二象限的数据没有办法移动,改变的只有其它象限的数据

添加筛选

sheet.auto_filter.ref = sheet.dimensions

workbook = load_workbook(filename = '阿里云天池电商婴儿用户数据.xlsx')
sheet = workbook.active
sheet.auto_filter.ref = sheet.dimensions
workbook.save(filename='阿里云天池电商婴儿用户数据.xlsx')

此段程序运行之后,就是实现在Excel中全选数据后,按住Ctrl + T,进入数据的筛选模式。
在这里插入图片描述

综合应用

编写一个Python程序,要求:

(1)打开文件阿里云天池电商婴儿用户数据.xlsx

(2)找到buy_mount这一列

(3)找到buy_mount中大于5的数据

(4)将这些数据所在行复制到一个新的Excel文件中

参考代码如下:

第一步:前期准备工作

import os
os.chdir('D:\\python_major\\auto_office7')
from openpyxl import Workbook
from openpyxl import load_workbook

workbook = load_workbook(filename = '阿里云天池电商婴儿用户数据.xlsx')
sheet = workbook.active
workbook_1 = Workbook()
sheet_1 = workbook_1.active

这一步完成的工作是:导入库、设置程序运行路径,打开目标文件,创建新文件对象并实例化sheet/sheet_1对象,前期准备工作完成

第二步:提取原文件sheet中满足要求的行数

cells = sheet['F']
data_ls = []
for cell in cells:
    if isinstance(cell.value,int) and cell.value >5:
        data_ls.append(cell.row)
print('输出满足条件的数据所在行数的列表:\n{}\n'.format(data_ls)) 

该部分完成的工作是:确定了’buy_mount’所在列(通过打开Excel文件,查看得到的,如果这个字段在海量数据之中,而没有办法短时间内通过人眼找到该怎么办呢?),遍历F列,对立面的数据类型进行判断,如果是整型(还存在着字符串类型和None型数据)并且数值大于5,就提取该数值所在的行,并添加到列表

第三步:将原文件sheet里面的目标数据转移到新建文件的sheet_1中

j = 1
for row in data_ls:
	for col in range(ord('A'),ord('G')+1):
		sheet_1[chr(col)+str(j)] = sheet[chr(col)+str(row)].value
	print('正在写入第{}行数据'.format(j),end = ' ')
	j += 1

该部分完成的工作是:实现sheet中目标数据的遍历,并依次转移到sheet_1中,为了保证数据的美观性(避免原位置转移),按照行数大小顺序依次进行数据的录入(变量j存在的意义)

全部代码及运行结果

Sublime上编写的全部代码及输出结果
【python自动化办公(7)】python操作Exce文件,插入数据、公式、插入和删除行列、冻结窗格、复制表单、创建新表单、添加筛选模式(挑选满足条件数据并转移)_第6张图片
新建Excel中的数据显示
【python自动化办公(7)】python操作Exce文件,插入数据、公式、插入和删除行列、冻结窗格、复制表单、创建新表单、添加筛选模式(挑选满足条件数据并转移)_第7张图片

拓展延伸

在综合应用中,关于要求(二)找到buy_mount这一列,之前的代码是直接使用cell = sheet[‘F’]的方法,通过查看Excel文件的方式获得所在的列数固然简单,但是如果字段在海量数据之中,甚至多条字段呢,这时候该怎么办呢?
因此实现要求二的代码可以进行拓展,通过创建一个封装函数来实现目标字段的选择,并输出对应的行和列。代码如下
def return_col_or_row(content):
	'''函数功能:根据输入的content,
	筛选出窗格中含有这个content的所有的col(列)和row(行)
	返回两个的列表,第一个是所在列的数据,第二个是所在行的数据
	'''
	data_size = sheet.dimensions
	size_ls = data_size.split(":")
	col_min,row_min,col_max,row_max = size_ls[0][0],size_ls[0][1],size_ls[1][0],size_ls[1][1:]
	row_ls = []
	col_ls = []
	for col in range(ord(col_min),ord(col_max)+1):
	    for row in range(int(row_min), int(row_max)+1):
	        if sheet[chr(col)+str(row)].value == content:
	            col_content = chr(col)
	            row_content = str(row)
	            col_ls.append(col_content)
	            row_ls.append(row_content)
	return(col_ls,row_ls)
所以要求二的代码就可以优化为:
col = return_col_or_row('buy_mount')[0][0]
#第一个索引[0]是获取所在列的数据列表,第二个索引[0]是获得列表中第一个数据(也就是目标列)
cells = sheet[col]
优化后的全部代码如下:
import os
os.chdir('D:\\python_major\\auto_office7')
from openpyxl import Workbook
from openpyxl import load_workbook

workbook = load_workbook(filename = '阿里云天池电商婴儿用户数据.xlsx')
sheet = workbook.active
workbook_1 = Workbook()
sheet_1 = workbook_1.active


def return_col_or_row(content):
	'''函数功能:根据输入的content,
	筛选出窗格中含有这个content的所有的col(列)和row(行)
	返回两个的列表,第一个是所在列的数据,第二个是所在行的数据
	'''
	data_size = sheet.dimensions
	size_ls = data_size.split(":")
	col_min,row_min,col_max,row_max = size_ls[0][0],size_ls[0][1],size_ls[1][0],size_ls[1][1:]
	row_ls = []
	col_ls = []
	for col in range(ord(col_min),ord(col_max)+1):
	    for row in range(int(row_min), int(row_max)+1):
	        if sheet[chr(col)+str(row)].value == content:
	            col_content = chr(col)
	            row_content = str(row)
	            col_ls.append(col_content)
	            row_ls.append(row_content)
	return(col_ls,row_ls)


col = return_col_or_row('buy_mount')[0][0]
#第一个索引[0]是获取所在列的数据列表,第二个索引[0]是获得列表中第一个数据(也就是目标列)
cells = sheet[col]
data_ls = []
for cell in cells:
    if isinstance(cell.value,int) and cell.value >5:
    	#选取窗格数据为数值的而且要大于5的
        data_ls.append(cell.row)
print('输出满足条件的数据所在行数的列表:\n{}\n'.format(data_ls))   


j = 1
for row in data_ls:
	for col in range(ord('A'),ord('G')+1):
		#print(sheet[chr(col)+str(row)].value)
		sheet_1[chr(col)+str(j)] = sheet[chr(col)+str(row)].value
	print('正在写入第{}行数据'.format(j),end = ' ')
	j += 1

print('\n\n数据已全部导入新Excel文件!')
workbook_1.save(filename='筛选数据后的表格.xlsx')
print('\ncompleted!')

你可能感兴趣的:(python办公自动化)