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的web框架中编写创建日志的程序的教程
Apr 30 Python
用Python操作字符串之rindex()方法的使用
May 19 Python
Python中List.count()方法的使用教程
May 20 Python
Python实现的redis分布式锁功能示例
May 29 Python
selenium+python自动化测试之环境搭建
Jan 23 Python
浅谈PySpark SQL 相关知识介绍
Jun 14 Python
python使用yield压平嵌套字典的超简单方法
Nov 02 Python
pytorch中的transforms模块实例详解
Dec 31 Python
logging level级别介绍
Feb 21 Python
小白教你PyCharm从下载到安装再到科学使用PyCharm2020最新激活码
Sep 25 Python
python 自动化偷懒的四个实用操作
Apr 11 Python
详细介绍python操作RabbitMq
Apr 12 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
PHP乱码问题,UTF-8乱码常见问题小结
2012/04/09 PHP
编写安全 PHP应用程序的七个习惯深入分析
2013/06/08 PHP
thinkPHP模板算术运算相关函数用法分析
2016/07/12 PHP
php 可变函数使用小结
2018/06/12 PHP
PHP count_chars()函数讲解
2019/02/14 PHP
jquery实现的让超出显示范围外的导航自动固定屏幕最顶上
2011/09/22 Javascript
jquery事件机制扩展插件 jquery鼠标右键事件
2011/12/21 Javascript
Google Map V3 绑定气泡窗口(infowindow)Dom事件实现代码
2013/04/26 Javascript
JS 两日期相减,获得天数的小例子(兼容IE,FF)
2013/07/01 Javascript
javascript中var的重要性分析
2015/02/11 Javascript
巧用jQuery选择器提高写表单效率的方法
2016/08/19 Javascript
浅谈javascript中的事件冒泡和事件捕获
2016/12/28 Javascript
微信小程序 蓝牙的实现实例代码
2017/06/27 Javascript
JavaScript面向对象精要(上部)
2017/09/12 Javascript
在vue中获取微信支付code及code被占用问题的解决方法
2019/04/16 Javascript
layui table去掉右侧滑动条的实现方法
2019/09/05 Javascript
vue2路由方式--嵌套路由实现方法分析
2020/03/06 Javascript
[48:30]LGD vs infamous Supermajor小组赛D组 BO3 第一场 6.3
2018/06/04 DOTA
python函数局部变量用法实例分析
2015/08/04 Python
Django使用paginator插件实现翻页功能的实例
2018/10/24 Python
Python 调用 Outlook 发送邮件过程解析
2019/08/08 Python
Pytorch加载部分预训练模型的参数实例
2019/08/18 Python
python 实现在无序数组中找到中位数方法
2020/03/03 Python
Python 日期时间datetime 加一天,减一天,加减一小时一分钟,加减一年
2020/04/16 Python
PyTorch安装与基本使用详解
2020/08/31 Python
学生党员思想汇报范文
2014/01/09 职场文书
双十佳事迹材料
2014/01/29 职场文书
寄语十八大感言
2014/02/07 职场文书
周年庆促销方案
2014/03/15 职场文书
新品发布会主持词
2014/04/02 职场文书
党员群众路线对照检查材料
2014/08/31 职场文书
受伤赔偿协议书
2014/09/24 职场文书
2014年会计人员工作总结
2014/12/10 职场文书
村级干部党员公开承诺事项
2015/05/04 职场文书
获奖感言一句话
2015/07/31 职场文书
2019七夕节祝福语36句,快来收藏吧
2019/08/06 职场文书