python 操作Excel入门到进阶

目录

openpyxl操作Excel

读取工作簿

保存工作簿

写入内容

表(sheet)

创建表

选择表(sheet)

查看表名

删除工作表

修改表名称

单元格(cell)

获取表格尺寸大小

单元格访问

多单元格访问

写入单元格

写入一行或多行数据

插入一行或多行

插入一列或多列

删除多行/列

移动范围数据

获取单元格的行数、列数、坐标

获取最大行/列号

合并和拆分单元格

指定删除单元格(行/列)

写入图片

获取整行数据

单元格写入公式

openpyxl样式调整

设置字体样式

设置对齐样式

设置边框样式

设置单元格填充样式

设置行高和列宽

没啥用的方法

根据数据得到字母,根据字母得到数字

openpyxl案例:

1、拆分表格

2、提取信息

3、查找字符串

xlwings操作Excel

打开Excel程序

保存、退出、关闭

新建Excel文件

获取表

读取内容

写入数据

获取数据范围

输出并修改行高列宽

获取及设置公式

获取、设置及清除颜色格式

xlrd读取Excel

打开Excel文件

查看工作簿中所有工作表

指定工作表三种方式

获取表格最大行数和列数

获取整行或整列的值

循环读取所有行

获取单元格的值

xlrd案例

1、同层级文件夹中查找字符串

2、多层级文件夹中查找字符串


openpyxl:不需要 打开Excel 进程,仅支持xlsx、xlsm文件进行读、写操作

xlwings:需要安装并打开 Excel 进程,支持 xls 和 xlsx 格式;可以调用 Excel 文件中 VBA 写好的程序;和 matplotlib 以及 pandas 的兼容性强

xlrd:可以对xlsx、xls、xlsm文件进行读操作且效率高

xlwt:主要对xls文件进行写操作且效率高,但是不能执行xlsx文件

openpyxl操作Excel

读取工作簿

import openpyxl
# 实例化,此步可忽略
wb = openpyxl.Workbook()
# 读取指定文件
wb = openpyxl.load_workbook('新工作簿.xlsx')

保存工作簿

wb.save('新工作簿.xlsx')

写入内容

from  openpyxl  import  load_workbook
wb=load_workbook(r"D:\data\新工作簿.xlsx")
ws=wb.active
ws.cell(1,2).value="写入内容"
wb.save("新工作簿.xlsx")

#ws=wb["表名字"]

表(sheet)

创建表

# 插入到最后
ws1 = wb.create_sheet('工作簿1')
# 插入到最开始的位置 create_sheet(表名,位置)
ws2 = wb.create_sheet('新工作表',0)

选择表(sheet)

# 当前活动的工作表
sh1 = wb.active
sh2 = wb['新工作表']
sh3 = wb.get_sheet_by_name("新工作表")

查看表名

# 显示所有表名
print(wb.sheetnames)
# 遍历所有表
for sheet in wb:
    print(sheet.title)

删除工作表

# 方法一
sh.remove(sheet)
# 方法二
del sh['新工作表']

修改表名称

sh2.title="new_sheet_name"

单元格(cell)

获取表格尺寸大小

返回excel表格中数据有几行几列

sh.dimensions   # 返回A1:G10

单元格访问

cell = sh["A1"]   # 返回

# 获取单元格的数据
sh["A1"].value
sh.cell(row=1,column=1).value

多单元格访问

# 指定坐标范围的值
r1 = sh["A1:C3"]

# 指定列的值
c1 = sh['B']
c2 = sh['A:C']

# 指定行的值
r2 = sh[10]
r3 = sh[1:10]

# 输出每个单元格的值
for cell in r1:
    print(cell.value)

# 通过指定范围
# 方法一:(获取A1:B2的值)
for row in sh.iter_rows(min_row=1,max_row=2,min_col=1,max_col=2):
    print(row)  # 返回 (, )
    for cell in row:
        print(cell.value)  
# 方法二:(获取A2:A~的值)
for row in range(2,sh.max_row+1):
    for col in range(1,2):
        cell = sh.cell(row=row,column=col)
        print(cell.value)

# 读取所有的行
for row in sh.rows:
    print(row)  # 返回迭代器

# sh.rows/sh.columns 所有行/列的迭代器,可通过循环获取
# 读取所有的行的值
for row in sh.rows:
    print(row)  # 返回迭代器
    for cell in row:
        print(cell.value) # 返回单元格的值
# 读取所有的列的值
for column in sh.columns:
    for cell in column:
        print(cell.value)

写入单元格

# 方法一
sh.cell(row, colum).value = 新的值  # 修改单元格的数据

# 方法二:row 行;column 列 value 值
sh.cell(row=2,column=3,value=10)

sh['B10'] = '=SUM(B1:B9)'  #  将公式写入单元格

写入一行或多行数据

sheet.append(列表) :追加写入

sh = wb['sheet']
data1 = ['王俊凯',23,'歌手']  # 一行写入
sh.append(data1)

 批量写入需循环

sh = wb['sheet']
data1 = [['王俊凯',23,'歌手'],
         ['杨幂',33,'演员'],
         ['杨紫',29,'演员']]
for i in data1:
    sh.append(i)

插入一行或多行

在idx行上面插入一行

sh = wb['sheet']
sh.insert_rows(idx=2)

python 操作Excel入门到进阶_第1张图片

在idx行上面插入多行(amount=4插入4行)

import openpyxl
wb = openpyxl.load_workbook(r'E:\测试表.xlsx')
sh = wb['sheet']
sh.insert_rows(idx=2,amount=4)
wb.save(r'E:\测试表.xlsx')

插入一列或多列

在idx列左边插入多列(amount=3插入3列)

import openpyxl
wb = openpyxl.load_workbook(r'E:\测试表.xlsx')
sh = wb['sheet']
sh.insert_cols(idx=2)
sh.insert_cols(idx=4,amount=3)
wb.save(r'E:\测试表.xlsx')

删除多行/列

sh = wb['sheet']
sh.delete_rows(idx=2)
sh.delete_rows(idx=2,amount=2) # 删除两行
sh.delete_cols(idx=2,amount=3) # 删除三列

移动范围数据

向下移动两行,向左移动两列

sh = wb['sheet']
sh.move_range('C1:D1',rows=2,cols=-2)

获取单元格的行数、列数、坐标

# 获取A1单元格的行、列、坐标
cell = sh['A1']
print(cell.row, cell.column, cell.coordinate) #返回 1 1 A1

获取最大行/列号

max_row = ws.max_row #行数
max_col = ws.max_column#列数

# 求A列最大行数
max_row_A = max((a.row for a in day_book['A'] if a.value))

合并和拆分单元格

sh.merge_cells("A1:C3")  #合并一个矩形区域中的单元格
sheet.merge_cells(start_row=1, start_column=3, 
                  end_row=2, end_column=4)  # 合并c1:d2

sh.unmerge_cells("A1:C3")  # 拆分单元格
sheet.unmerge_cells(start_row=1, start_column=3, 
                    end_row=2, end_column=4)

指定删除单元格(行/列)

sh.delete_cols(3,5)  # 删除从3~5列的内容
sh.delete_rows(2,7)  # 删除从2~7行的内容

写入图片

from openpyxl.drawing.image import Image
# 实例化图片对象 Image(接收图片)
img = Image('图片1.jpg')
# 指定单元格添加图片
sh.add_image(img,"B3")
wb.save('新工作簿.xlsx')

获取整行数据

values获取该表所有值,通过行索引获取整行

# 获取所有表
for sh in wb.sheetnames:
    max_row = wb[sh].max_row # 最大行数
    max_col = wb[sh].max_column # 最大列数
# 方法一
    values = list(wb[sh].values) # 获取该表所有值
# 方法二
    # 循环每行
    for i in range(2,max_row+1):
        for j in range(1,max_col+1):
            # 获取单元格的值
            value = wb[sh].cell(i, j).value
            # 符合条件整行添加到新表中 
            if value == filename:
                wb1['查找'].append(values[i-1])

单元格写入公式

大部分公式可直接复制

# 获取B列最大的行号
max_row_B = max((b.row for b in ws['B'] if b.value))
# 循环写入公式
for i in range(3,max_row_B+1):
    # 售
    sum_formula = f"=SUM(J{i}:AN{i})"
    #sum_formula2 = f"=SUM(D{i}:I{i},-AO{i})"
    ws.cell(row=i,column=41,value=sum_formula)

openpyxl样式调整

可指定单元格范围设置样式,需循环两次(第一次迭代,第二次单元格)

设置字体样式

Font(name字体名称,size大小,bold粗体,italic斜体,color颜色)

import openpyxl
from openpyxl.styles import Font
wb = openpyxl.load_workbook(r'E:\测试表.xlsx')
sh = wb['sheet']
cell = sh['B1']
font = Font(name='微软雅黑',size=12,bold=True,italic=True,color='FF0000')
cell.font = font
wb.save(r'E:\测试表.xlsx')

设置对齐样式

Alignment(horizontal水平对齐,vertical垂直对齐,text_rotation字体倾斜度,wrap_text自动换行)

import openpyxl
from openpyxl.styles import Alignment
wb = openpyxl.load_workbook(r'E:\测试表.xlsx')
sh = wb['sheet']
cell = sh['B1']
alignment = Alignment(horizontal='center',vertical='center',
                      text_rotation=45,wrap_text=True)
cell.alignment = alignment
wb.save(r'E:\测试表.xlsx')
  • 水平对齐:distributed, justify, center, left, fill, centerContinuous, right, general

  • 垂直对齐:bottom, distributed, justify, center, top

设置边框样式

import openpyxl
from openpyxl.styles import Side,Border
wb = openpyxl.load_workbook(r'E:\测试表.xlsx')
sh = wb['sheet']
cell = sh['A1:D4']
side = Side(style='thin',color='FF000000')
border = Border(left=side,right=side,top=side,bottom=side)
for i in cell:
    for j in i:
        j.border = border
wb.save(r'E:\测试表.xlsx')
  • 边线样式:double, mediumDashDotDot, slantDashDot, dashDotDot, dotted, hair, mediumDashed, dashed, dashDot, thin, mediumDashDot, medium, thick

设置单元格填充样式

import openpyxl
from openpyxl.styles import PatternFill,GradientFill
wb = openpyxl.load_workbook(r'E:\测试表.xlsx')
sh = wb['sheet']
cell1 = sh['A1']
cell2 = sh['B1']
# 单色填充
pattern_fill = PatternFill(fill_type='solid',fgColor="99ccff")
cell1.fill = pattern_fill
# 渐变填充
gradient_fill = GradientFill(stop=('FFFFFF',"99ccff","000000"))
cell2.fill = gradient_fill
wb.save(r'E:\测试表.xlsx')

设置行高和列宽

import openpyxl
from openpyxl.styles import PatternFill,GradientFill
wb = openpyxl.load_workbook(r'E:\测试表.xlsx')
sh = wb['sheet']
# 可循环
sh.row_dimensions[1].height = 30
sh.column_dimensions["C"].width = 20
wb.save(r'E:\测试表.xlsx')

没啥用的方法

根据数据得到字母,根据字母得到数字

from openpyxl.utils import get_column_letter,column_index_from_string
# 未知用处
# 根据列的数字返回字母
print(get_column_letter(2))  # B
# 根据字母返回列的数字
print(column_index_from_string("d"))  # 4

openpyxl案例:

 评论区自取文件

1、拆分表格

 将人员以各部门进行区分(J列)单独提取出来的信息(人员所有信息)插入新的sheet页

import openpyxl
wb = openpyxl.load_workbook(r'E:\课件\人员信息表待筛选.xlsx')
sheetnames = wb.sheetnames   # 返回列表

department_list = []
# 筛选部门
for sheetname in sheetnames:
    ws = wb[sheetname]
    max_row = ws.max_row # 最大行数
    # range不包含最后一位数
    for row in range(2,max_row+1):
        department = ws.cell(row,10).value
        if "[" in department:
            department = department.replace('[','_')
        if "]" in department:
            department = department.replace(']','')
        if department not in department_list:
            department_list.append(department)
# 获取标题
title = list(wb['Sheet1'].values)[0]

# 创建工作簿
wb2 = openpyxl.load_workbook(r'E:\课件\建表测试.xlsx')
for table in department_list:
    # 创建工作簿
    wb2.create_sheet(table)
    # 添加标题
    wb2[table].append(title)

# 拆分数据
for sheetname in sheetnames:
    ws = wb[sheetname]
    max_row = ws.max_row
    values = list(ws.values)
    for row in range(2,max_row+1):
        content = ws.cell(row,10).value
        if "[" in content:
            content = content.replace('[','_')
        if "]" in content:
            content = content.replace(']','')
        wb2[content].append(values[row-1])
wb2.save(r'E:\课件\建表测试.xlsx')

2、提取信息

将工作证(O列)包含字母的证件号人员信息单独提取插入新的sheet页

import string
import openpyxl
wb = openpyxl.load_workbook(r'D:\星越\办公自动化课件\人员信息表.xlsx')
# 当前工作簿中创建工作表
wb_card = wb.create_sheet("工作证")
# print(wb.sheetnames)
# 添加标题
wb_card.append(list(wb['Sheet1'].values)[0])
# 循环所有表
for sheetname in wb.sheetnames:
    # 该表所有值
    value = list(wb[sheetname].values)
    # 最大行号
    max_row = wb[sheetname].max_row
    # range不包含max_row得+1
    for row in range(2,max_row+1):
        cell = str(wb[sheetname].cell(row, 15).value)
        # 循环获得每一个字符
        for letter in cell:
            # 得到的字符判断是否包含英文,包含添加并跳出循环
            if letter in string.ascii_lowercase:
                # value为列表,当row为2时,需要取得是value的1,所以需减1
                wb_card.append(value[row-1])
                # 当循环遇到字母就跳出
                break
wb.save(r'D:\星越\办公自动化课件\人员信息表.xlsx')

3、查找字符串

多层级查找包含杨幂字符串的excel表格返回路径和单元格(openpyxl只支持xlsx,xlsm)

import glob
import openpyxl
path = r"C:\Users\Administrator\Desktop\办公自动化"
for file in glob.glob(path + "/**",recursive=True):
    suffix = file.split('.')[-1]
    if suffix == 'xlsx' or suffix == 'xlsm':
        wb = openpyxl.load_workbook(file)
        # 获取所有表
        for sh in wb.sheetnames:
            max_row = wb[sh].max_row # 最大行数
            max_col = wb[sh].max_column # 最大列数
            values = list(wb[sh].values) # 获取该表所有值,返回list
            # 方法一
            # if "杨幂" in str(values):
            #     print(file)
            # 方法二
            # 循环每行
            for i in range(1,max_row+1):
                for j in range(1,max_col+1):
                    # 获取单元格的值
                    value = wb[sh].cell(i, j).value
                    if "杨幂" in str(value):
                        print('{}.cell({},{});路径:{}'.format(sh,i,j,file))
        wb.close() # 必须关闭

xlwings操作Excel

pip install xlwings

python 操作Excel入门到进阶_第2张图片

打开Excel程序

使用app打开Excel进程

import xlwings as xw
app = xw.App(visible=True,add_book=False)  # 程序可见,只打开不新建工作簿
app.display_alerts = False # 警告关闭
app.screen_updating = False # 屏幕更新关闭

保存、退出、关闭

xlwings依赖于(app)Excel进程,结束需要关闭(app)

import xlwings as xw
app = xw.App()  
wb = app.books.open(r'E:\测试表.xlsx')
wb.save(r'E:\测试表.xlsx')  # 保存文件
wb.close()                 # 关闭文件
app.quit()                 # 关闭程序

新建Excel文件

wb = app.books.add()
wb.save((r'E:\新建工作簿.xlsx') 
wb.close() 
app.quit() 

获取表

for s in wb.sheets:
    print(wb.sheets[s])

读取内容

方法一

# 获取单个单元格的值
A1 = sh.range("A1").value
print(A1)
# 获取横向或纵向多个单元格的值,返回列表
A1_A3 = sh.range("A1:A3").value
print(A1_A3)
# 获取指定范围的值,返回嵌套列表,按行为列表
A1_B3 = sh.range("A1:B3").value
print(A1_B3)

方法二

# 获取单个单元格的值
A1 = sh["A1"].value
print(A1)
# 获取横向或纵向多个单元格的值,返回列表
A1_A3 = sh["A1:A3"].value
print(A1_A3)
# 获取指定范围的值,返回嵌套列表,按行为列表
A1_B3 = sh["A1:B3"].value
print(A1_B3)

方法三:

A1_B2 = sh[:2,:2].value
print(A1_B2)

写入数据

# 写入1个单元格
sh.range("A5").value = "杨迪"
# 横向写入A6:B6
sh.range('A6').value = ['杨洋',32]
# 纵向写入C2:C5
sh.range("C2").options(transpose=True).value = ['歌手','演员','演员','搞笑艺人']
# 写入范围内A7:C8
sh.range("A7").options(expand="table").value=[[1,2,3],[4,5,6]]

获取数据范围

shape = sh.used_range.shape
print(shape)
# 最大行数列数
max_row = wb.sheets[s].used_range.last_cell.row
max_col = wb.sheets[s].used_range.last_cell.column

输出并修改行高列宽

# 输出
print(sh.range("A1:A2").row_height)
print(sh.range("A1:A2").column_width)
# 修改
sh.range("A1:A2").row_height = 30
sh.range('A1:A2').column_width = 50

获取及设置公式

可以调用Excel公式

# 获取公式
print(sh.range("B7").formula_array)
# 写入公式
sh.range("F2").formula = "=VLOOKUP(E2,A:B,2,0)"

获取、设置及清除颜色格式

# 获取颜色
print(sh.range("A1:A7").color)
# 设置颜色
sh.range("C:C").color = (255,0,120)
# 清除颜色
sh.range("E2:F2").color = None

xlrd读取Excel

注意:xlrd索引从0开始,本人用新版本只支持xls文件,网络方法:pip install xlrd==1.2.0

xlrd降级后支持xlsx,大家可试试        

pip install Xlrd # 安装

打开Excel文件

import xlrd
file = r"D:\demo\A.xlsx"
df = xlrd.open_workbook(file)

查看工作簿中所有工作表

df.sheet_names()

指定工作表三种方式

table = df.sheets()[0]
table = df.sheet_by_index(0)
table = df.sheet_by_name("工作表1")

获取表格最大行数和列数

table.nrows
table.ncols

获取整行或整列的值

table.row_values(0)  # 获取第一行
table.col_values(0)  # 获取第一列

循环读取所有行

for i in range(table.nrows):
    print(table.row_values(i))  # 返回整行

获取单元格的值

print(table.cell_value(3,0))  # 第四行第一列的值
print(table.row_values(1,0))  # 第二行第一列的值
# col_values(self,colx,start_rowx,end_rowx)
print(table.col_values(0,0))  # 第一列的值

xlrd案例

1、同层级文件夹中查找字符串

在单元格中找含有杨幂的字符串

python 操作Excel入门到进阶_第3张图片

# 同层级,遍历所有表格内的所有表的所有单元格包含字符串的返回路径和该行单元格值
import glob
import xlrd
path = r"D:\demo\一层级"
for file in (glob.glob(path+"/*/*"):
    # 获取文件后缀
    file_suffix = file.split(".")[-1]
    # 后缀名为xls
    if file_suffix == "xls":
        # 读取Excel文件
        df = xlrd.open_workbook(file)
        # 获取表格内所有表名
        for sheet in df.sheet_names():
            # 表名
            table = df.sheet_by_name(sheet)
            # 最大行列数
            max_row = table.nrows
            max_col = table.ncols
            # xlrd索引从0开始
            for i in range(max_row):
                # 循环某表每行的值
                for h in table.row_values(i):
                    # 查找含有杨幂字符串的单元格
                    if "杨幂" in str(h):
                        print(f"路径:{file},{h}")

1、pip install xlrd==1.2.0   #此版本支持xlsx

2、如果报错:'ElementTree' object has no attribute 'getiterator' ,则需要进行如下更改:

3、先pip show xlrd根据Location找到并进入xlrd文件夹,打开xlsx.py

4、然后查询里面的 getiterator(),把里面两处getiterator替换为iter 即可。

2、多层级文件夹中查找字符串

使用glob的recursive=True实现多层级查找

import glob
import xlrd
path = r"D:\demo\层级"
for file in glob.glob(path + "/**",recursive=True):
    # 获取文件后缀
    file_suffix = file.split(".")[-1]
    '''
    同层级相同步骤
    '''

知识扩展:glog()通配符搜索

python glob通配符方式单层搜索文件/文件夹_Bianca427的博客-CSDN博客

持续更新中

部分来源:

精心整理了40个Python办公自动化真实案例,一口一个,高效办公!_刘早起的博客-CSDN博客

你可能感兴趣的:(python)