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导入txt数据到mysql的方法
Apr 08 Python
基于python实现名片管理系统
Nov 30 Python
Python3按一定数据位数格式处理bin文件的方法
Jan 24 Python
Python Excel处理库openpyxl使用详解
May 09 Python
详解python中的time和datetime的常用方法
Jul 08 Python
Python列表元素常见操作简单示例
Oct 25 Python
Python数据可视化:箱线图多种库画法
Nov 06 Python
python有序查找算法 二分法实例解析
Feb 18 Python
Pycharm激活码激活两种快速方式(附最新激活码和插件)
Mar 12 Python
python 连续不等式语法糖实例
Apr 15 Python
python实现测试工具(二)——简单的ui测试工具
Oct 19 Python
pytorch学习教程之自定义数据集
Nov 10 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
用Apache反向代理设置对外的WWW和文件服务器
2006/10/09 PHP
PHP函数preg_match_all正则表达式的基本使用详细解析
2013/08/31 PHP
Laravel模板引擎Blade中section的一些标签的区别介绍
2015/02/10 PHP
php简单实现sql防注入的方法
2016/04/22 PHP
阿里对象存储OSS在laravel框架中的使用方法
2019/10/13 PHP
在phpstudy集成环境下的nginx服务器下配置url重写
2019/12/02 PHP
PHP实现简单注册登录系统
2020/12/28 PHP
用JavaScrpt实现文件夹简单轻松加密的实现方法图文
2008/09/08 Javascript
jquery 之 $().hover(func1, funct2)使用方法
2012/06/14 Javascript
事件冒泡是什么如何用jquery阻止事件冒泡
2013/03/20 Javascript
javaScript array(数组)使用字符串作为数组下标的方法
2013/11/19 Javascript
js中function()使用方法
2013/12/24 Javascript
JS字符串拼接在ie中都报错的解决方法
2014/03/27 Javascript
JQuery中的html()、text()、val()区别示例介绍
2014/09/01 Javascript
jquery中val()方法是从最后一个选项往前读取的
2015/09/06 Javascript
javascript常用函数(2)
2015/11/05 Javascript
js实现选中页面文字将其分享到新浪微博
2015/11/05 Javascript
Jquery轮播效果实现过程解析
2016/03/30 Javascript
Javascript基础回顾之(三) js面向对象
2017/01/31 Javascript
webpack入门+react环境配置
2017/02/08 Javascript
浅析vue.js数组的变异方法
2018/06/30 Javascript
vue结合el-upload实现腾讯云视频上传功能
2020/07/01 Javascript
微信小程序自定义胶囊样式
2020/12/27 Javascript
python中反射用法实例
2015/03/27 Python
Python编程中的异常处理教程
2015/08/21 Python
使用Python编写一个最基础的代码解释器的要点解析
2016/07/12 Python
Python生成随机密码的方法
2017/06/16 Python
Python运行不显示DOS窗口的解决方法
2018/10/22 Python
如何给Python代码进行加密
2020/01/10 Python
python opencv根据颜色进行目标检测的方法示例
2020/01/15 Python
乐高西班牙官方商店:LEGO Shop ES
2019/12/01 全球购物
护理自荐信
2013/10/22 职场文书
播音主持专业个人自我评价
2014/01/09 职场文书
自我介绍演讲稿范文
2014/08/21 职场文书
群众路线教育实践活动学习笔记
2014/11/05 职场文书
2015年妇幼保健工作总结
2015/05/19 职场文书