python 操作Excel入门到进阶

目录

openpyxl操作Excel

读取工作簿(公式)

保存工作簿

写入内容

表(sheet)

创建表

选择表(sheet)

查看表名

删除工作表

修改表名称

复制工作表

单元格(cell)

获取表格尺寸大小

单元格访问

多单元格访问

写入单元格

append写入一行或多行数据

写入一列

插入一行或多行

插入一列或多列

删除多行/列

移动范围数据

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

获取最大行/列号

合并和拆分单元格

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

写入图片

获取整行数据

单元格写入公式

openpyxl样式调整

设置字体样式

设置对齐样式

设置边框样式

设置单元格填充样式

设置行高和列宽

设置格式(常规,文本,自定义,日期)

设置日期格式

没啥用的方法

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

openpyxl案例:

1、拆分表格

2、提取信息

3、查找字符串

4、汇总

xlwings操作Excel

打开Excel程序

保存、退出、关闭

新建Excel文件

获取表

读取内容

写入数据

获取数据范围

输出并修改行高列宽

获取及设置公式

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

xlrd读取Excel

打开Excel文件

查看工作簿中所有工作表

指定工作表三种方式

获取表格最大行数和列数

获取整行或整列的值

循环读取所有行

表操作(待试验)

获取单元格的值

xlrd案例

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

2、多层级文件夹中查找

 3、匹配数据

4、汇总多个excel

xls转xlsx


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

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

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

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

openpyxl操作Excel

注意:openpyxl索引从1开始

读取工作簿(公式)

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

# 读取的是公式(data_only默认为False,可不写):
wb = openpyxl.load_workbook(filename, data_only=False)

#data_only=True读取的是公式计算值:
wb = openpyxl.load_workbook(filename, data_only=True)

保存工作簿

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)
# 打印指定表名
print(wb.sheetnames[0])
# 遍历所有表
for sheet in wb:
    print(sheet.title)

# 查看当前工作簿名
ws.title

查看

删除工作表

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

修改表名称(重命名)

sh2.title="new_sheet_name"

复制工作表

Workbook.copy_worksheet(表名) 方法:复制整个表作为副本,包含单元格(包括值、样式、超链接和注释)和某些工作表属性(包括尺寸、格式和属性)。不复制所有其他工作簿/工作表属性-例如图像、图表。

wb = openpyxl.load_workbook("原文件.xlsx")
ws = wb.active
target = wb.copy_worksheet(ws)  # 复制整个工作簿 + 1(ws)
wb.save("新文件.xlsx")

单元格(cell)

获取表格尺寸大小

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

sh.dimensions   # 返回A1:G10

单元格访问

cell = sh["A1"]   # 返回<Cell '新工作表'.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)  # 返回 (<Cell 'Sheet1'.A1>, <Cell 'Sheet1'.B1>)
    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)

# 简写获取矩阵值
r = ws["B2:N18"]
values = [[cell.value for cell in row] for row in r]

# 读取所有的行
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)'  #  将公式写入单元格

根据特定文本查找行列号

from openpyxl import load_workbook
 
def find_row_by_char(file_path,sheet_name,char):
    # 加载工作簿和工作表
    workbook = load_workbook(file_path)
    sheet = workbook[sheet_name]

    # 遍历工作表中的所有行
    for row in sheet.iter_rows():
        for cell in row:
            if char in cell.value:
                return cell.row   # cell.column返回列号
    return None  # 如果没有找到字符,返回None

# # 使用示例
file_path = 'example.xlsx'  # Excel文件路径
sheet_name = 'Sheet1'  # 工作表名称
char_to_find = '撤销原因'  # 要查找的字符
row_number = find_row_by_char(ds_低保,char_to_find)
if row_number:
    print(f'字符找到在第{row_number}行')
else:
    print('字符未找到')

append写入一行或多行数据

1、append是按行向Excel中追加数据,从当前行的下一行开始追加,默认从第一行开始

2、append的数据类型必须是list,tuple,dict

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

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

 批量写入需循环

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

指定位置插入:表._current_row=行数

ws._current_row=20 # 将当前行指定在20行
ws.append([1,2,3])  # 1,2,3将插入21行的A,B,C列

append的数据类型(list,tuple,dict)

如果数据是dict,那keys所对应的value只能是一个str/number,不能是list/tuple/dict

x = [1,2,3,4,5]
y = (6,7,8,9,10)
z = {'A':11,'B':12,'C':13,'F':"aaa"}
m = {'A':['a','b','c'],'B':['c','d','e'],'C':['f','g','h']}  # 无效操作
ws.append(x)
ws.append(y)
ws.append(z)
# ws.append(m)  # 此处报错

指定行列插入,利用dict(作用不大相当于ws.cell(行,列).value=)

ws._current_row = 2
z = {'A':11,'C':12,'E':13,'G':"aaa"}
ws.append(z)

Python 处理数据(Excel)—— openpyxl 之append - 知乎

写入一列

将列表写入excel第一列

l = ['张三', '李四', '王五', '赵六']
for each in l:
    print(l.index(each))
    # 通过row关键字指定行,colunm关键字指定列,均从1开始
    # 列表从0开始,单元格从1开始
    ws.cell(row=l.index(each) + 1, column=1, value=each)

插入一行或多行

在idx行上面插入一行

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

在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)

    #  公式引用F3:F最大行号
    ws.cell(max_row+1,6).value = f"=SUM(F{3}:F{i})"

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)   # 倾斜可删text_rotation
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.styles import numbers

# 设置为”常规“格式
ws.cell(1, 4).number_format = 'General'
# 设置为“文本”格式
ws.cell(1, 4).number_format = '@'
# 设置为“自定义”格式中的“0.00”   比如:100 转换为100.00
ws.cell(1, 4).number_format = '0.00'
# 设置为“自定义”格式中的“0”
ws.cell(1, 4).number_format = '0'
# 一列设置“日期”格式
for cell in ws["A"]:
    cell.number_format = 'yyyy-mm-dd'

具体可参考:openpyxl.styles.numbers — openpyxl 3.1.2 documentation

设置日期格式

from openpyxl.styles import numbers

ws['A1'] = datetime.date(2021, 2, 13)
ws['A1'].number_format = 'yyyy/m/d'   

# 设置一列
for cell in ws["A"]:
    cell.number_format = numbers.FORMAT_DATE_YYYYMMDD2

# 在B列写入并设置日期格式
dates = ["2023-11-29","2023-11-30","2023-12-01"]
for i,date_str in enumerate(dates,start=1):
    ws.cell(row=i,column=2,value=datetime.strptime(date_str,"%Y-%m-%d"))

没啥用的方法

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

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() # 必须关闭

4、汇总

汇总表仅有5行标题,多表数据写入汇总表

import openpyxl
wb = openpyxl.load_workbook('汇总数据.xlsx')

for sheet in wb:
    sh=wb[sheet.title]
    max_row_B = max((b.row for b in sh['B'] if b.value))
    for i in range(5,max_row_B+1):
        l = [] # 存储行数据
        if sh.cell(i,2).value is None and sh.cell(i,3).value is None:
            continue
        else:
            for j in range(1,23):
                data = sh.cell(i,j).value
                l.append(str(data))
        wb['汇总'].append(l)

wb.save('text.xlsx')
wb.close()

xlwings操作Excel

pip install xlwings

打开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文件,版本降级支持(xlsx和xls):pip install xlrd==1.2.0

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))  # 返回整行

表操作(待试验)

ds.row_values(0,6,10)      #取第一行,第6-9列
ds.col_values(0,0,5)         #取第一列,第0-4行
ds.row_slice(2,0,2)           #获取单元格值类型和内容,同sheet1.row()
sheet1.row_types(1,0,2)   #获取单元格数据类型
 

table.row_values(0,6

获取单元格的值

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、同层级文件夹中查找字符串

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

# 同层级,遍历所有表格内的所有表的所有单元格包含字符串的返回路径和该行单元格值
import glob
import xlrd
path = r"D:\demo\一层级"
for file in (glob.glob(path+"/*/*"):
    # 获取文件后缀
    file_suffix = file.split(".")[-1]
    # 后缀名为xls
    if file_suffix == "xls" or file_suffix == "xlsx": # xlrd修改版本后可操作xlsx文件
        # 读取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和xls

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]
    '''
    同层级相同步骤
    '''

 3、匹配数据

类似VLOOKUP,但是查找整个文件夹的文件

import glob
import xlrd
import openpyxl
# openpyxl 从1开始,xlrd从0开始
path = r"查找的文件夹路径"
match_path = r"待匹配的数据表.xlsx"
data = openpyxl.load_workbook(match_path)
match_table = data['Sheet1']
Match_max_row = match_table.max_row #待匹配表的最大行号
# for m in range(2, Match_max_row + 1) 如果待匹配的表格数量小放在此处
for file in glob.glob(path+"/*"):
    # 获取文件后缀
    file_suffix = file.split(".")[-1]
    # 后缀名为xls
    if file_suffix == "xls" or file_suffix == "xlsx":
        # 读取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(1,max_row+1):
                try:
                    # 循环某表每行的值
                    for h in table.row_values(i):
                        # 循环待匹配表的每行
                        for m in range(2, Match_max_row + 1):
                        # for m in range(2, Match_max_row + 1)如果待匹配的表数量大放在此处
                            # 判断是否存在
                            if str(match_table.cell(m, 7).value) in str(h):
                                # 存在写入表名
                                match_table.cell(m, 8).value = sheet
                                continue
                except:
                    continue
data.save(r'待匹配的数据表(副本).xlsx')
data.close()

4、汇总多个excel

import os
import openpyxl
import datetime
import xlrd
date = datetime.datetime.now().date()
Year = date.year
Month = date.month
# 待汇总的表
wb = openpyxl.load_workbook(路径)
ws = wb['汇总']

path = r"C:\Users\HP\Desktop\Text"
# 多层级搜索
for file in os.scandir(path):
    # 是文件夹
    if file.is_dir():
        # 读取文件夹
        for f in os.scandir(file.path):
            # 如果文件名包含“ xxx.xlsx”
            if "text.xlsx" in f.name:
                # 打开excel文件(文件路径+文件名)
                sheets = xlrd.open_workbook(file.path + "/" + f.name)
                # sheets.sheet_by_index(0) 根据索引获取表
                # 指定读取excel工作表
                sheet = sheets.sheet_by_name("汇总")
                # 获取最大的行号
                rows = sheet.nrows
                # 获取最大的列号
                cols = sheet.ncols
                # 除去表头,开始汇总的行数
                startrow = 1   # 从第二行开始
                for row in range(startrow,rows):
                    l = sheet.row_values(row)
                    ws.append(l)
    wb.save(路径)

5、复制工作簿

import xlrd
import openpyxl
wb = xlrd.open_workbook("原表.xlsx")
ws = wb.sheet_by_name("2024")  # 待复制的工作表
maxrow = ws.nrows

df = openpyxl.load_workbook(r"新表.xlsx")
ds = df.create_sheet("2024年-copy",0)  # 创建表名
for i in range(0,maxrow):
    ds.append(ws.row_values(i))  # ws.row_values(i)整行 ,整行数据追加到新表

df.save("新表.xlsx")

xls转xlsx

import win32com.client as win32

fname = r"C:\Users\HP\Desktop\text.xlsx"
excel = win32.gencache.EnsureDispatch('Excel.Application')
wb = excel.Workbooks.Open(fname)

## 转换为xls
# xls_f = fname.split('.')[0]+"xls"
# wb.SaveAs(xls_f, FileFormat=56)

wb.SaveAs(fname + "x", FileFormat=51)    #FileFormat = 51 is for .xlsx extension
wb.Close()                               #FileFormat = 56 is for .xls extension
excel.Application.Quit()

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

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

持续更新中

部分来源:

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

  • 0
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值