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字符串替换的2种方法
Nov 30 Python
玩转python爬虫之URLError异常处理
Feb 17 Python
Python实现计算最小编辑距离
Mar 17 Python
Python3安装Scrapy的方法步骤
Nov 23 Python
浅析Git版本控制器使用
Dec 10 Python
Python命令行解析模块详解
Feb 01 Python
python绘制立方体的方法
Jul 02 Python
django模板结构优化的方法
Feb 28 Python
Pandas之MultiIndex对象的示例详解
Jun 25 Python
django 框架实现的用户注册、登录、退出功能示例
Nov 28 Python
TensorFlow Saver:保存和读取模型参数.ckpt实例
Feb 10 Python
python 三种方法提取pdf中的图片
Feb 07 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+ajax 无刷新删除数据
2010/02/20 PHP
thinkPHP使用post方式查询时分页失效的解决方法
2015/12/09 PHP
浅谈php数组array_change_key_case() 函数和array_chunk()函数
2016/10/22 PHP
PHP用PDO如何封装简单易用的DB类详解
2017/07/30 PHP
实现PHP中session存储及删除变量
2018/10/15 PHP
Windows服务器中PHP如何安装redis扩展
2019/09/27 PHP
Javascript读取cookie函数代码
2010/10/16 Javascript
JQuery中对服务器控件 DropdownList, RadioButtonList, CheckboxList的操作总结
2011/06/28 Javascript
JS通过ajax动态读取xml文件内容的方法
2015/03/24 Javascript
Jquery+Ajax+PHP+MySQL实现分类列表管理(下)
2015/10/28 Javascript
详解JavaScript基于面向对象之创建对象(1)
2015/12/10 Javascript
js实现正则匹配中文标点符号的方法
2015/12/23 Javascript
jQuery实现点击某个div打开层,点击其他div关闭层实例分析(阻止冒泡)
2016/11/18 Javascript
JavaScript基本语法_动力节点Java学院整理
2017/06/26 Javascript
微信小程序首页的分类功能和搜索功能的实现思路及代码详解
2018/09/11 Javascript
vue实现双向绑定和依赖收集遇到的坑
2018/11/29 Javascript
JavaScript常用进制转换及位运算实例解析
2020/10/14 Javascript
js前端传json后台接收‘‘被转为quot的问题解决
2020/11/12 Javascript
详解vue修改elementUI的分页组件视图没更新问题
2020/11/13 Javascript
python通过opencv实现批量剪切图片
2017/11/13 Python
Tornado高并发处理方法实例代码
2018/01/15 Python
利用nohup来开启python文件的方法
2019/01/14 Python
Python 50行爬虫抓取并处理图灵书目过程详解
2019/09/20 Python
Django中FilePathField字段的用法
2020/05/21 Python
python三引号如何输入
2020/07/06 Python
如何通过python检查文件是否被占用
2020/12/18 Python
HTML5利用约束验证API来检查表单的输入数据的代码实例
2016/12/20 HTML / CSS
鞋子女王塔玛拉·梅隆同名奢侈品牌:Tamara Mellon
2017/11/22 全球购物
vue+django实现下载文件的示例
2021/03/24 Vue.js
村级环境卫生整治方案
2014/05/04 职场文书
金融专业求职信
2014/08/05 职场文书
新教师培训心得体会
2014/09/02 职场文书
自愿离婚协议书范本
2014/09/13 职场文书
技术股份合作协议书
2014/10/05 职场文书
法律意见书范文
2015/06/04 职场文书
2019年度行政文员工作计划范本!
2019/07/04 职场文书