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 相关文章推荐
简介Django框架中可使用的各类缓存
Jul 23 Python
Python中Threading用法详解
Dec 27 Python
Python+tkinter使用80行代码实现一个计算器实例
Jan 16 Python
Python遍历numpy数组的实例
Apr 04 Python
Opencv-Python图像透视变换cv2.warpPerspective的示例
Apr 11 Python
python抓取需要扫微信登陆页面
Apr 29 Python
python实现将range()函数生成的数字存储在一个列表中
Apr 02 Python
浅谈tensorflow 中的图片读取和裁剪方式
Jun 30 Python
django教程如何自学
Jul 31 Python
python 如何快速复制序列
Sep 07 Python
如何用python开发Zeroc Ice应用
Jan 29 Python
python geopandas读取、创建shapefile文件的方法
Jun 29 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 面向对象实现代码
2009/11/11 PHP
php设计模式 Facade(外观模式)
2011/06/26 PHP
PHPstorm快捷键(分享)
2017/07/17 PHP
Laravel利用gulp如何构建前端资源详解
2018/06/03 PHP
Yii框架getter与setter方法功能与用法分析
2019/10/22 PHP
在线游戏大家来找茬II
2006/09/30 Javascript
Hutia 的 JS 代码集
2006/10/24 Javascript
js 针对html DOM元素操作等经验累积
2014/03/11 Javascript
使用AngularJS实现表单向导的方法
2015/06/19 Javascript
JS实现样式清新的横排下拉菜单效果
2015/10/09 Javascript
微信小程序 less文件编译成wxss文件实现办法
2016/12/05 Javascript
nodejs redis 发布订阅机制封装实现方法及实例代码
2016/12/15 NodeJs
关于angular js_$watch监控属性和对象详解
2017/04/24 Javascript
基于AngularJS实现的工资计算器实例
2017/06/16 Javascript
vue按需引入element Transfer 穿梭框
2017/09/30 Javascript
微信小程序App生命周期详解
2018/01/31 Javascript
JavaScript常见事件处理程序实例总结
2019/01/05 Javascript
js 计数排序的实现示例(升级版)
2020/01/12 Javascript
vue使用map代替Aarry数组循环遍历的方法
2020/04/30 Javascript
javascript如何使用函数random来实现课堂随机点名方法详解
2020/07/28 Javascript
使用Python的urllib和urllib2模块制作爬虫的实例教程
2016/01/20 Python
Python实现拷贝多个文件到同一目录的方法
2016/09/19 Python
Python Flask框架模板操作实例分析
2019/05/03 Python
浅析Python数字类型和字符串类型的内置方法
2019/12/22 Python
Python猜数字算法题详解
2020/03/01 Python
pycharm sciview的图片另存为操作
2020/06/01 Python
Django自带用户认证系统使用方法解析
2020/11/12 Python
重构Python代码的六个实例
2020/11/25 Python
CSS3常用的几种颜色渐变模式总结
2016/11/18 HTML / CSS
美体小铺加拿大官方网站:The Body Shop加拿大
2016/10/30 全球购物
澳大利亚香水在线商店:City Perfume
2020/09/02 全球购物
地球鞋加拿大官网:Earth Shoes Canada
2020/11/17 全球购物
2014学校庆三八妇女节活动总结
2014/03/01 职场文书
2014年仓库管理员工作总结
2014/11/18 职场文书
大学生求职简历自我评价
2015/03/02 职场文书
公务员廉洁从政心得体会
2016/01/19 职场文书