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入门篇之条件、循环
Oct 17 Python
python基于itchat实现微信群消息同步机器人
Feb 27 Python
pandas DataFrame 根据多列的值做判断,生成新的列值实例
May 18 Python
使用django-guardian实现django-admin的行级权限控制的方法
Oct 30 Python
使用python根据端口号关闭进程的方法
Nov 06 Python
简单了解Python matplotlib线的属性
Jun 29 Python
python3.7 的新特性详解
Jul 25 Python
python中property属性的介绍及其应用详解
Aug 29 Python
基于Python爬取爱奇艺资源过程解析
Mar 02 Python
实现ECharts双Y轴左右刻度线一致的例子
May 16 Python
python 第三方库paramiko的常用方式
Feb 20 Python
Pytorch中TensorBoard及torchsummary的使用详解
May 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 第二节 数据类型之数值型
2012/04/28 PHP
Ajax+PHP快速上手及简单应用说明
2013/07/24 PHP
PHP加密解密实例分析
2015/12/25 PHP
PHP实现补齐关闭的HTML标签
2016/03/22 PHP
BOOM vs RR BO5 第一场 2.14
2021/03/10 DOTA
Highslide.js是一款基于js实现的网页中图片展示插件
2020/03/30 Javascript
JQuery+DIV自定义滚动条样式的具体实现
2013/06/25 Javascript
jquery实现metro效果示例代码
2013/09/06 Javascript
JavaScript获取元素尺寸和大小操作总结
2015/02/27 Javascript
JavaScript中日期的相关操作方法总结
2015/10/24 Javascript
谈谈AngularJs中的隐藏和显示
2015/12/09 Javascript
jQuery延迟执行的实现方法
2016/12/21 Javascript
原生js实现返回顶部缓冲效果
2017/01/18 Javascript
AngularJS路由切换实现方法分析
2017/03/17 Javascript
Angular2.0实现modal对话框的方法示例
2018/02/18 Javascript
JavaScript求一组数的最小公倍数和最大公约数常用算法详解【面向对象,回归迭代和循环】
2018/05/07 Javascript
微信小程序上传图片功能(附后端代码)
2020/06/19 Javascript
angular4强制刷新视图的方法
2018/10/09 Javascript
vue+VeeValidate 校验范围实例详解(部分校验,全部校验)
2018/10/19 Javascript
使用jquery Ajax实现上传附件功能
2018/10/23 jQuery
详解关于webpack多入口热加载很慢的原因
2019/04/24 Javascript
动态实现element ui的el-table某列数据不同样式的示例
2021/01/22 Javascript
[11:12]2018DOTA2国际邀请赛寻真——绿色长城OpTic
2018/08/10 DOTA
Python使用回溯法子集树模板解决迷宫问题示例
2017/09/01 Python
python生成ppt的方法
2018/06/07 Python
对Python 数组的切片操作详解
2018/07/02 Python
Python3 元组tuple入门基础
2020/02/09 Python
python使用列表的最佳方案
2020/08/12 Python
荷兰美妆护肤品海淘网站:Beautinow(中文)
2020/11/22 全球购物
介绍一下write命令
2012/09/24 面试题
mysql有关权限的表都有哪几个
2015/04/22 面试题
餐厅经理岗位职责和岗位目标
2014/02/13 职场文书
军训感想500字
2014/02/20 职场文书
2014年应急管理工作总结
2014/11/26 职场文书
关于拾金不昧的感谢信
2015/01/21 职场文书
入党团支部推荐意见
2015/06/02 职场文书