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中os和sys模块的区别与常用方法总结
Nov 14 Python
Python自定义函数定义,参数,调用代码解析
Dec 27 Python
python之django母板页面的使用
Jul 03 Python
Python解决走迷宫问题算法示例
Jul 27 Python
Python后台开发Django会话控制的实现
Apr 15 Python
Python批量查询关键词微信指数实例方法
Jun 27 Python
pytorch 加载(.pth)格式的模型实例
Aug 20 Python
Python 实现的 Google 批量翻译功能
Aug 26 Python
django 实现简单的插入视频
Apr 07 Python
linux centos 7.x 安装 python3.x 替换 python2.x的过程解析
Dec 14 Python
python中time tzset()函数实例用法
Feb 18 Python
python实现简单反弹球游戏
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(6) 面向对象
2010/02/16 PHP
PHP排序算法之直接插入排序(Straight Insertion Sort)实例分析
2018/04/20 PHP
PHP合并两个或多个数组的方法
2019/01/20 PHP
PHP的PDO事务与自动提交
2019/01/24 PHP
PHP中“=>
2019/03/01 PHP
分析 JavaScript 中令人困惑的变量赋值
2007/08/13 Javascript
javascript中的array数组使用技巧
2010/01/31 Javascript
关于JavaScript的with 语句的使用方法
2011/05/09 Javascript
JS 实现获取打开一个界面中输入的值
2013/03/19 Javascript
JS实现超精简的链接列表在固定区域内滚动效果代码
2015/11/04 Javascript
jquery+css3实现会动的小圆圈效果
2016/01/27 Javascript
Bootstrap中定制LESS-颜色及导航条(推荐)
2016/11/21 Javascript
jQuery中的siblings()是什么意思(推荐)
2016/12/29 Javascript
JS中setTimeout和setInterval的最大延时值详解
2017/02/13 Javascript
微信小程序 点击控件后选中其它反选实例详解
2017/02/21 Javascript
浅谈js for循环输出i为同一值的问题
2017/03/01 Javascript
详解vue渲染从后台获取的json数据
2017/07/06 Javascript
ES6新增的math,Number方法
2017/08/06 Javascript
Vuex 进阶之模块化组织详解
2018/01/12 Javascript
vue组件编写之todolist组件实例详解
2018/01/22 Javascript
常用的 JS 排序算法 整理版
2018/04/05 Javascript
Vue.js 实现数据展示全部和收起功能
2018/09/05 Javascript
angular 数据绑定之[]和{{}}的区别
2018/09/25 Javascript
详解Vue项目部署遇到的问题及解决方案
2019/01/11 Javascript
详解python中的json和字典dict
2018/06/22 Python
英国豪华真皮和布艺沙发销售网站:Darlings of Chelsea
2018/01/05 全球购物
香港现代设计家具品牌:Ziinlife Furniture
2018/11/13 全球购物
应用心理学个人求职信范文
2013/12/11 职场文书
节能环保标语
2014/06/12 职场文书
推普周国旗下讲话稿
2014/09/21 职场文书
建议书格式
2015/02/04 职场文书
免职通知
2015/04/23 职场文书
酒桌上的开场白
2015/06/01 职场文书
有关朝花夕拾的读书笔记
2015/06/29 职场文书
2016党性教育学习心得体会
2016/01/21 职场文书
2019年七夕情人节浪漫祝福语大全!
2019/08/08 职场文书