赞
踩
目录
openpyxl:不需要 打开Excel 进程,仅支持xlsx、xlsm文件进行读、写操作
xlwings:需要安装并打开 Excel 进程,支持 xls 和 xlsx 格式;可以调用 Excel 文件中 VBA 写好的程序;和 matplotlib
以及 pandas
的兼容性强
xlrd:可以对xlsx、xls、xlsm文件进行读操作且效率高
xlwt:主要对xls文件进行写操作且效率高,但是不能执行xlsx文件
注意: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["表名字"]
- # 插入到最后
- ws1 = wb.create_sheet('工作簿1')
- # 插入到最开始的位置 create_sheet(表名,位置)
- ws2 = wb.create_sheet('新工作表',0)
- # 当前活动的工作表
- 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")
返回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)
![](https://csdnimg.cn/release/blogv2/dist/pc/img/newCodeMoreWhite.png)
- # 方法一
- 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('字符未找到')
![](https://csdnimg.cn/release/blogv2/dist/pc/img/newCodeMoreWhite.png)
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})"
可指定单元格范围设置样式,需循环两次(第一次迭代,第二次单元格)
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
评论区自取文件
将人员以各部门进行区分(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')
![](https://csdnimg.cn/release/blogv2/dist/pc/img/newCodeMoreWhite.png)
将工作证(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')
![](https://csdnimg.cn/release/blogv2/dist/pc/img/newCodeMoreWhite.png)
多层级查找包含杨幂字符串的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() # 必须关闭
![](https://csdnimg.cn/release/blogv2/dist/pc/img/newCodeMoreWhite.png)
汇总表仅有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()
![](https://csdnimg.cn/release/blogv2/dist/pc/img/newCodeMoreWhite.png)
pip install xlwings
使用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() # 关闭程序
- 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索引从0开始,仅读取,不可写入。
新版本只支持xls文件,版本降级支持(xlsx和xls):pip install xlrd==1.2.0
pip install Xlrd # 安装
- 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)) # 第一列的值
在单元格中找含有杨幂的字符串
- # 同层级,遍历所有表格内的所有表的所有单元格包含字符串的返回路径和该行单元格值
- 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}")
![](https://csdnimg.cn/release/blogv2/dist/pc/img/newCodeMoreWhite.png)
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 即可。
使用glob的recursive=True实现多层级查找
- import glob
- import xlrd
- path = r"D:\demo\层级"
- for file in glob.glob(path + "/**",recursive=True):
- # 获取文件后缀
- file_suffix = file.split(".")[-1]
- '''
- 同层级相同步骤
- '''
类似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()
![](https://csdnimg.cn/release/blogv2/dist/pc/img/newCodeMoreWhite.png)
- 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(路径)
![](https://csdnimg.cn/release/blogv2/dist/pc/img/newCodeMoreWhite.png)
- 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")
- 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()通配符搜索
持续更新中
部分来源:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。