目录

一、 精确调整多个工作簿的行高和列宽

1、精确调整多个工作簿的行高和列宽

2、精确调整一个工作簿中所有工作表的行高和列宽

二、批量更改多个工作簿的数据格式

1、批量更改多个工作簿的数据格式

2、批量更改多个工作簿的外观格式

三、 批量替换多个工作簿的行数据

1、批量替换多个工作簿的行数据

2、批量替换多个工作簿中的单元格数据

3、批量修改多个工作簿中指定工作表的列数据

四、 批量提取一个工作簿中所有工作表的特定数据

1、批量提取一个工作簿中所有工作表的特定数据

2、批量提取一个工作簿中所有工作表的列数据

3、在多个工作簿的指定工作表中批量追加行数据

五、批量拆分多个工作簿中指定工作表的列数据

1、对多个工作簿中指定工作表的数据进行分列

2、批量合并多个工作簿中指定工作表的列数据

3、将多个工作簿中指定工作表的列数据拆分为多行

六、批量提取一个工作簿中所有工作表的唯一值

1、批量提取一个工作簿中所有工作表的唯一值

2、批量提取一个工作簿中所有工作表的唯一值并汇总


练习数据下载链接: https://download.csdn.net/download/weixin_44940488/19270592

一、 精确调整多个工作簿的行高和列宽

1、精确调整多个工作簿的行高和列宽

import os
import xlwings as xw

file_path='e:\\table\\销售表'         # 给出工作簿所在的文件夹路径
file_list = os.listdir(file_path)    # 列出文件夹下所有文件和子文件夹的名称
# print(file_list)
app = xw.App(visible = False, add_book = False)    # 启动Excel程序

for i in file_list:        # 遍历文件夹路径下的所有文件名
    if i.startswith('~$'):
        continue
    file_paths = os.path.join(file_path, i)   # 将文件夹路径和文件名拼接成工作簿的完整路径
    workbook = app.books.open(file_paths)     # 打开要调整行高和列宽的工作簿

    for j in workbook.sheets:                 # 遍历当前工作簿中的工作表
        value = j.range('A1').expand('table')  # 在工作表中选择要调整行高和列宽的单元格区域
        value.column_width = 12     # 将列宽调整为可容纳12个字符的宽度
        value.row_height = 20       # 将行高调整为20磅
    workbook.save()
    workbook.close()
app.quit()

2、精确调整一个工作簿中所有工作表的行高和列宽

import xlwings as xw

app = xw.App(visible = False, add_book = False)
workbook = app.books.open('e:\\table\\采购表.xlsx')

for i in workbook.sheets:
    value = i.range('A1').expand('table')
    value.column_width = 12
    value.row_height = 20
workbook.save()
app.quit()

二、批量更改多个工作簿的数据格式

1、批量更改多个工作簿的数据格式

import os
import xlwings as xw
file_path = '采购表'
file_list = os.listdir(file_path)
app = xw.App(visible = False, add_book = False)

for i in file_list:
    if i.startswith('~$'):
        continue

    file_paths = os.path.join(file_path, i)
    workbook = app.books.open(file_paths)    # 打开要设置数据格式的工作簿

    # 更改工作簿的数据格式
    for j in workbook.sheets: 
        row_num = j['A1'].current_region.last_cell.row             # 获取工作表中数据区域最后一行的行号
        j['A2:A{}'.format(row_num)].number_format = 'm/d'          # 更改为日期数字格式
        j['D2:D{}'.format(row_num)].number_format = '¥#,##0.00'   # 更改为货币数字格式

    workbook.save()
    workbook.close()
app.quit()

2、批量更改多个工作簿的外观格式

import os
import xlwings as xw
file_path = '销售表'
file_list = os.listdir(file_path)
app = xw.App(visible = False, add_book = False)

for i in file_list:
    if i.startswith('~$'):
        continue

    file_paths = os.path.join(file_path, i)
    workbook = app.books.open(file_paths)

    # 设置工作簿的外观格式
    for j in workbook.sheets: 
        j['A1:H1'].api.Font.Name = '宋体'  
        j['A1:H1'].api.Font.Size = 10  
        j['A1:H1'].api.Font.Bold = True		   # 加粗工作表标题行
        j['A1:H1'].api.Font.Color = xw.utils.rgb_to_int((255,255,255))    # 设置工作表标题行的字体颜色为“白色”
        j['A1:H1'].color = xw.utils.rgb_to_int((0,0,0))                   # 设置工作表标题行的单元格填充颜色为“黑色”
        j['A1:H1'].api.HorizontalAlignment = xw.constants.HAlign.xlHAlignCenter     # 设置工作表标题行的水平对齐方式为“居中”
        j['A1:H1'].api.VerticalAlignment = xw.constants.VAlign.xlVAlignCenter       # 设置工作表标题行的垂直对齐方式为“居中”

        j['A2'].expand('table').api.Font.Name = '宋体'     # 设置工作表的正文字体为“宋体”
        j['A2'].expand('table').api.Font.Size = 10        # 设置工作表的正文字体的字号为“10”磅
        j['A2'].expand('table').api.HorizontalAlignment = xw.constants.HAlign.xlHAlignLeft     # 设置工作表正文的水平对齐方式为“靠左”
        j['A2'].expand('table').api.VerticalAlignment = xw.constants.VAlign.xlVAlignCenter     # 设置工作表正文的垂直对齐方式为“居中”

        for cell in j['A1'].expand('table'):       # 从单元格A1开始为工作表添加合适粗细的边框
            for b in range(7,12): 
                cell.api.Borders(b).LineStyle = 1      # 设置单元格的边框线型
                cell.api.Borders(b).Weight = 2         # 设置单元格的边框粗细

    workbook.save()
    workbook.close()
app.quit()

三、 批量替换多个工作簿的行数据

1、批量替换多个工作簿的行数据

import os
import xlwings as xw

file_path = '分部信息'
file_list = os.listdir(file_path)
app = xw.App(visible = False, add_book = False)

for i in file_list:
    if i.startswith('~$'):
        continue
    file_paths = os.path.join(file_path, i)
    workbook = app.books.open(file_paths)

    for j in workbook.sheets:            # 遍历工作簿的工作表
        value = j['A2'].expand('table').value   # 读取工作表数据
        for index, val in enumerate(value):     # 按行遍历工作表数据
            if val == ['背包', 16, 65]:         # 判断行数据是否为“背包”
                value[index] = ['双肩包', 36, 79]    # 如果是,则将该行数据替换为新的数据
        j['A2'].expand('table').value = value   # 将完成替换的数据写入工作表

    workbook.save()
    workbook.close()
app.quit()

2、批量替换多个工作簿中的单元格数据

import os
import xlwings as xw
file_path = '分部信息'
file_list = os.listdir(file_path)
app = xw.App(visible = False, add_book = False)

for i in file_list:
    if i.startswith('~$'):
        continue
    file_paths = os.path.join(file_path, i)
    workbook = app.books.open(file_paths)

    for j in workbook.sheets: 
        value = j['A2'].expand('table').value    # 读取工作表数据
        for index, val in enumerate(value):      # 按行遍历工作表数据
            if val[0] == '背包': 
                val[0] = '双肩包' 
                value[index] = val     # 替换整行数据
        j['A2'].expand('table').value = value    # 将完成替换的数据写入工作表

    workbook.save()
    workbook.close()
app.quit()

3、批量修改多个工作簿中指定工作表的列数据

import os
import xlwings as xw
file_path = '分部信息'
file_list = os.listdir(file_path)
app = xw.App(visible = False, add_book = False)

for i in file_list:
    if i.startswith('~$'):
        continue
        
    file_paths = os.path.join(file_path, i)
    workbook = app.books.open(file_paths)
    worksheet = workbook.sheets['产品分类表']   # 指定要修改的工作表
    value = worksheet['A2'].expand('table').value 
    
    for index, val in enumerate(value): 
        val[2] = val[2] * (1 + 0.05)    # 修改第3个单元格的数据,这里将销售价上调5%
        value[index] = val    # 替换整行数据
    worksheet['A2'].expand('table').value = value   # 将完成替换的数据写入工作表
    
    workbook.save()
    workbook.close()
app.quit()

四、 批量提取一个工作簿中所有工作表的特定数据

1、批量提取一个工作簿中所有工作表的特定数据

import xlwings as xw
import pandas as pd
app = xw.App(visible = False, add_book = False) 
workbook = app.books.open('采购表.xlsx')  
worksheet = workbook.sheets   # 打开工作簿中的所有工作表

# 创建一个空列表用于存放数据
data = []

for i in worksheet:   # 遍历工作簿中的工作表
    values = i.range('A1').expand().options(pd.DataFrame).value   # 读取当前工作表的所有数据
    filtered = values[values['采购物品'] == '复印纸']     # 提取“采购物品”为“复印纸”的行数据
    if not filtered.empty:        # 判断提取出的行数据是否为空
        data.append(filtered)     # 将提取出的行数据追加到列表之中

new_workbook = xw.books.add()    # 新建工作簿
new_worksheet = new_workbook.sheets.add('复印纸')    # 在新工作簿中新增一个名为“复印纸”的工作表
new_worksheet.range('A1').value = pd.concat(data, ignore_index = False)    # 将提取出的行数据写入工作表“复印纸”中
new_workbook.save('复印纸.xlsx')   # 保存新工作簿并命名为“复印纸.xlsx”

workbook.close()
app.quit()

2、批量提取一个工作簿中所有工作表的列数据

import xlwings as xw
import pandas as pd
app = xw.App(visible = False, add_book = False) 
workbook = app.books.open('采购表.xlsx')
worksheet = workbook.sheets 

column = ['采购日期', '采购金额']   # 指定要提取的列的列标题
data = []

for i in worksheet:
    values = i.range('A1').expand().options(pd.DataFrame, index = False).value
    filtered = values[column]     # 根据前面指定的列标题提取数据
    data.append(filtered)
    
new_workbook = xw.books.add()       # 新建工作簿
new_worksheet = new_workbook.sheets.add('提取数据') 
new_worksheet.range('A1').value = pd.concat(data, ignore_index = False).set_index(column[0])
new_workbook.save('提取表.xlsx') 
workbook.close()
app.quit()

3、在多个工作簿的指定工作表中批量追加行数据

import os
import xlwings as xw

newContent = [['双肩包', '64', '110'], ['腰包', '23', '58']]   # 给出要追加的行数据
app = xw.apps.add()
file_path = '分部信息'  
file_list = os.listdir(file_path)  

for i in file_list:  
    if os.path.splitext(i)[1] == '.xlsx':  
        workbook = app.books.open(file_path + '\\' + i)  
        worksheet = workbook.sheets['产品分类表']     # 指定要追加行数据的工作表
        values = worksheet.range('A1').expand()      # 读取原有数据
        number = values.shape[0]                     # 获取原有数据的行数
        worksheet.range(number + 1, 1).value = newContent     # 将前面指定的行数据追加到原有数据的下方
        
        workbook.save()
        workbook.close()
app.quit()

五、批量拆分多个工作簿中指定工作表的列数据

1、对多个工作簿中指定工作表的数据进行分列

import os
import xlwings as xw
import pandas as pd

file_path = '产品记录表'
file_list = os.listdir(file_path)
app = xw.App(visible = False, add_book = False)

for i in file_list:
    if i.startswith('~$'):
        continue

    file_paths = os.path.join(file_path, i)   # 将文件夹路径和文件名拼接成工作簿的完整路径
    workbook = app.books.open(file_paths)     # 打开工作簿
    worksheet = workbook.sheets['规格表']     # 指定要处理的工作表
    values = worksheet.range('A1').options(pd.DataFrame, header = 1, index = False, expand = 'table').value   # 读取指定工作表中的数据
    
    new_values = values['规格'].str.split('*', expand = True)    # 根据*号拆分规格列
    values['长(mm)'] = new_values[0] 
    values['宽(mm)'] = new_values[1] 
    values['高(mm)'] = new_values[2] 
    values.drop(columns =['规格'], inplace = True)   # 删除规格列

    worksheet['A1'].options(index = False).value = values     # 用分列后的数据替换工作表中的原有数据
    worksheet.autofit()      # 根据数据内容自动调整工作表的行高和列宽
    workbook.save()
    workbook.close()
app.quit()

2、批量合并多个工作簿中指定工作表的列数据

import os
import xlwings as xw
import pandas as pd
file_path = '产品记录表'
file_list = os.listdir(file_path)
app = xw.App(visible = False, add_book = False)

for i in file_list:
    if i.startswith('~$'):
        continue   
    file_paths = os.path.join(file_path, i)
    workbook = app.books.open(file_paths)
    worksheet = workbook.sheets['规格表'] 
    values = worksheet.range('A1').options(pd.DataFrame, header = 1, index = False, expand = 'table').value 
    
    # 合并列数据
    values['规格'] =  values['长(mm)'].astype('str') + '*' + values['宽(mm)'].astype('str') + '*' + values['高(mm)'].astype('str') 
    values.drop(columns = ['长(mm)'], inplace = True) 
    values.drop(columns = ['宽(mm)'], inplace = True) 
    values.drop(columns = ['高(mm)'], inplace = True) 
    worksheet.clear()    # 清除工作表“规格表”中原有的数据
    worksheet['A1'].options(index = False).value = values    # 将处理好的数据写入工作表
    
    worksheet.autofit() 
    workbook.save()
    workbook.close()
app.quit()

3、将多个工作簿中指定工作表的列数据拆分为多行

import os
import xlwings as xw
import pandas as pd
file_path = '产品记录表'
file_list = os.listdir(file_path)
app = xw.App(visible = False, add_book = False)

for i in file_list:
    if i.startswith('~$'):
        continue
        
    file_paths = os.path.join(file_path, i)
    workbook = app.books.open(file_paths)
    worksheet = workbook.sheets['规格表'] 
    values = worksheet.range('A1').options(pd.DataFrame, header = 1, index = False, expand = 'table').value 
    new_values = values['规格'].str.split('*', expand=True) 
    values['长(mm)'] = new_values[0] 
    values['宽(mm)'] = new_values[1] 
    values['高(mm)'] = new_values[2] 
    values.drop(columns =['规格'], inplace = True) 
    
    values = values.T   # 转换数据的行列
    values.columns = values.iloc[0] 
    values.index.name = values.iloc[0].index.name 
    values.drop(values.iloc[0].index.name, inplace = True) 
    worksheet.clear()
    worksheet['A1'].value = values 
    
    worksheet.autofit() 
    workbook.save() 
    workbook.close() 
app.quit()

六、批量提取一个工作簿中所有工作表的唯一值

1、批量提取一个工作簿中所有工作表的唯一值

import xlwings as xw
app = xw.App(visible = True, add_book = False)
workbook = app.books.open('上半年销售统计表.xlsx')    # 打开指定工作簿

data = []    # 创建一个空列表用于存放书名数据

for i, worksheet in enumerate(workbook.sheets):    # 遍历工作簿的工作表
    values = worksheet['A2'].expand('down').value   # 提取当前工作表汇总的书名数据
    data = data + values    # 将提取出是书名数据添加到前面创建的列表中

data = list(set(data))           # 对列表中的书名进行去重操作
data.insert(0, '书名')           # 对去重后的书名数据前添加列标题“书名”
new_workbook = xw.books.add()    # 新建工作簿
new_worksheet = new_workbook.sheets.add('书名')   # 在新建的工作簿中新增一个名为“书名”的工作表
new_worksheet['A1'].options(transpose = True).value = data    # 将处理好的书名数据写入新工作表

new_worksheet.autofit()    # 根据数据内容自动调整新工作表的行高与列宽
new_workbook.save('书名.xlsx')
workbook.close()
app.quit()

2、批量提取一个工作簿中所有工作表的唯一值并汇总

import os
import xlwings as xw
app = xw.App(visible = True, add_book = False)
wb = app.books.open('上半年销售统计表.xlsx')

data = list()     # 创建一个空列表用于存放书名和销售的汇总数据
for i, sht in enumerate(wb.sheets):
    values = sht['A2'].expand('table').value
    data = data + values
    
sales = dict()               # 创建一个空字典用于存放书名和销售的汇总数据
for i in range(len(data)):   # 按行遍历书名和销售的明细数据
    name = data[i][0]        # 获取当前书名 
    sale = data[i][1]        # 获取当前销量
    if name not in sales:    # 判断字典中是否不存在当前书名
        sales[name] = sale   # 如果不存在,则在字典中添加此书名的销量记录
    else:
        sales[name] += sale   # 如果已存在,则计算此书名的累计销量
dictlist = list()

for key, value in sales.items():
    temp = [key, value]        # 列出书名和对应的累计销量
    dictlist.append(temp)
dictlist.insert(0, ['书名', '销量'])   # 在获取的数据前添加列标题“书名”和“销量”

new_workbook = xw.books.add()
new_worksheet = new_workbook.sheets.add('销售统计')
new_worksheet['A1'].value = dictlist
new_worksheet.autofit()
new_workbook.save('销售统计.xlsx')
wb.close()
app.quit()

参考书目:《超简单  用python让Excel飞起来》

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐