Python+Xlwings 删除Excel的行和列


Posted in Python onDecember 19, 2020

一、需求:

某公司管理的多个资管计划每天生成A表,业务人员需手工打开每个A表,将某些行、列删除后方可打印上报。

现拟采用程序代替手工操作。

二、分析:

1、应在原始文件的副本上操作,因此需拷贝文件夹内所有Excel至目标目录;

解答:使用shutil.copy()

2、需打开excel并删除指定的行和列;

解答:openpyxl不支持xls格式,xlwt无法删除行和列,最终选择xlwings;

三、代码实现:

#!/usr/bin/env python
# _*_ coding:utf-8 _*_
 
"""
 
@Time    : 2019-12-27 17:16
@Author  : Peanut_C
@FileName: excel_converter.py
 
"""
 
 
import os
import shutil
import xlwings as xw
 
current_dir = os.getcwd()
src_dir = os.path.join(current_dir, 'src_dir')
dst_dir = os.path.join(current_dir, 'dst_dir')
exist_list = ['YYYY', 'XXXX']  # 要保留行的A列关键字
 
 
def file_copy(source_dir, destination_dir):
    os.chdir(source_dir)
    for file in os.listdir(source_dir):
        shutil.copy(file, destination_dir)
    print('INFO ===>>> 文件拷贝完成!')
 
 
def excel_modifier(wk_dir):
    os.chdir(wk_dir)
    for file in os.listdir(wk_dir):
        # 检查文件格式是否为xls
        # print(type(os.path.splitext(file)[1]))
        if os.path.splitext(file)[1] != '.xls':
            print(file, '===>>>文件格式不正确,请检查!')
        else:
            print('开始处理===>>>', file)
            # 创建app,打开工作表
            app = xw.App(visible=False, add_book=False)
            app.screen_updating = False
            app.display_alerts = False
            load_wb = app.books.open(file)
            load_ws = load_wb.sheets.active
            print('\t已打开工作表……')
 
            # 获取总行数(列数固定不需要获取)
            rows = load_ws.api.UsedRange.Rows.count
            # cols = load_ws.api.UsedRange.Columns.count
 
            # 获取需要处理的A列范围
            a_range = load_ws.range('A1:A'+str(rows-4))  # 得到range对象
 
            # 将range中每行对象存放到列表中并倒序
            print('\t开始获取标志列……')
            cell_list = []
            for cell in a_range:
                cell_list.append(cell)
            cell_list.reverse()
            # print(cell_list)
 
            # 将表头拆分、重新合并,为插入的值腾地方
            print('\t开始调整合并单元格……')
            load_ws.range('H3:J3').api.unmerge()  # 拆分单元格
            load_ws.range('H3:I3').api.merge()  # 合并单元格
            load_ws.range('J3').value = 'xxx'  # 插入值
 
            # 设定将A列每个值与要保留列表比对,比对不上则删除整行
            print('\t开始调整行和列……')
            for cell in cell_list:
                if cell.value is not None:  # 单元格不为空则开始比对
                    find_flag = 0  # 匹配标志
                    for exist_value in exist_list:
                        if cell.value.find(exist_value) != -1:
                            find_flag = 1  # 匹配则将标志置为1
                            break  # 一个单元格只要匹配就不再比对保留列表剩下的值
                        else:
                            continue  # 匹配不上则继续
                    if find_flag == 0:  # 没匹配上的删除整行
                        cell_to_del = cell.address
                        # print(cell_to_del)
                        load_ws.range(cell_to_del).api.EntireRow.Delete()
                else:  # 单元格为空直接删除
                    cell_to_del = cell.address
                    # print(cell_to_del)
                    load_ws.range(cell_to_del).api.EntireRow.Delete()
 
            # 处理列,将指定列从大到小删除(避免先删除小列导致后续列号变动)
            load_ws.api.columns('K').delete
            load_ws.api.columns('G').delete
            load_ws.api.columns('B').delete
            # 美化处理后的Excel
            print('\t开始美化表格……')
            load_ws.range('A1:H24').columns.autofit()
            # 处理完毕,保存、关闭、退出Excel
            load_wb.save()
            load_wb.close()
            app.quit()
            print('处理完毕===>>>', file, '\n\n')
 
 
if __name__ == '__main__':
    file_copy(src_dir, dst_dir)
    excel_modifier(dst_dir)
    print('任务结束,请至dst_dir目录查看文件!\n\n')
    os.system('pause')

四、运行情况:

脚本测试完毕后,使用pyinstaller -F excel_converter.py -i icon.ico打包成为exe文件。

将可执行程序拷贝至业务人员电脑可直接执行,原始文件拖入src_dir,处理后文件输出至dst_dir。

经测试excel2013使用正常,excel2007无法连接。

Python+Xlwings 删除Excel的行和列

以上就是Python+Xlwings 删除Excel的行和列的详细内容,更多关于python 删除Excel的行和列的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
Python代码调试的几种方法总结
Apr 15 Python
Python爬虫利用cookie实现模拟登陆实例详解
Jan 12 Python
浅谈python装饰器探究与参数的领取
Dec 01 Python
用Python删除本地目录下某一时间点之前创建的所有文件的实例
Dec 14 Python
详细解读tornado协程(coroutine)原理
Jan 15 Python
python多线程之事件Event的使用详解
Apr 27 Python
基于windows下pip安装python模块时报错总结
Jun 12 Python
谈谈Python中的while循环语句
Mar 10 Python
Python qqbot 实现qq机器人的示例代码
Jul 11 Python
Python实现的爬取豆瓣电影信息功能案例
Sep 15 Python
Python中包的用法及安装
Feb 11 Python
Django与数据库交互的实现
Jun 03 Python
python Zmail模块简介与使用示例
Dec 19 #Python
python中实现栈的三种方法
Dec 19 #Python
python中实现词云图的示例
Dec 19 #Python
python 实现图片批量压缩的示例
Dec 18 #Python
python 基于opencv实现高斯平滑
Dec 18 #Python
python爬取代理ip的示例
Dec 18 #Python
用Python 执行cmd命令
Dec 18 #Python
You might like
SONY ICF-SW7600的电路分析
2021/03/02 无线电
8个出色的WordPress SEO插件收集
2011/02/26 PHP
php正则取img标记中任意属性(正则替换去掉或改变图片img标记中的任意属性)
2013/08/13 PHP
超详细的php用户注册页面填写信息完整实例(附源码)
2015/11/17 PHP
yii2 resetful 授权验证详解
2017/05/18 PHP
浅谈php调用python文件
2019/03/29 PHP
javascript 函数调用规则
2009/08/26 Javascript
jquery ajax提交表单数据的两种方式
2009/11/24 Javascript
简单的两种Extjs formpanel加载数据的方式
2013/11/09 Javascript
用js来刷新当前页面保留参数的具体实现
2013/12/23 Javascript
jquery checkbox 勾选的bug问题解决方案与分析
2014/11/13 Javascript
使用json来定义函数,在里面可以定义多个函数的实现方法
2016/10/28 Javascript
JS设置CSS样式的方式汇总
2017/01/21 Javascript
提高JavaScript执行效率的23个实用技巧
2017/03/01 Javascript
Angularjs 事件指令详细整理
2017/07/27 Javascript
vue.js 获取select中的value实例
2018/03/01 Javascript
jQuery事件模型默认行为执行顺序及trigger()与 triggerHandler()比较实例分析
2020/04/30 jQuery
vue实践---vue不依赖外部资源实现简单多语操作
2020/09/21 Javascript
简单介绍Python中的decode()方法的使用
2015/05/18 Python
Python如何实现文本转语音
2016/08/08 Python
python生成带有表格的图片实例
2019/02/03 Python
python 处理微信对账单数据的实例代码
2019/07/19 Python
PyTorch中Tensor的拼接与拆分的实现
2019/08/18 Python
Python标准库itertools的使用方法
2020/01/17 Python
美国在线购买和出售礼品卡网站:EJ Gift Cards
2019/06/09 全球购物
美国浴缸、水槽和水龙头购物网站:Vintage Tub & Bath
2019/11/05 全球购物
毕业生的自我鉴定
2013/10/29 职场文书
电脑教师的教学自我评价
2013/11/26 职场文书
进口业务员岗位职责
2014/04/06 职场文书
文秘求职信范文
2014/04/10 职场文书
优秀团干部个人事迹
2014/05/29 职场文书
地球上的星星观后感
2015/06/02 职场文书
无犯罪记录证明样本
2015/06/16 职场文书
高中团支书竞选稿
2015/11/21 职场文书
《打电话》教学反思
2016/02/22 职场文书
OpenCV实现普通阈值
2021/11/17 Java/Android