python2 excel读取内容并查找替换字符串,保留原样式
脚本功能:批量替换excel文件里字符串内容,并保留原有样式。
运行环境:Linux Python
注意:1.只支持xls(excel 97、2003) 但不支持xlsx(excel 2010+)
2.脚本中的注释,在实际使用时可以删除,在某些环境下可能会有奇怪问题。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 | #!/usr/bin/python # -*- coding: utf-8 -*- # Date: 2022/01/08 # testing System version: CentOS Linux release 7.8.2003 (Core) # Python version : 2.7.5 (default, Apr 2 2020, 13:16:51) # xlrd module version : 2.0.1 # xlwt module version : 1.3.0 # xlutils module version :2.0.0 # 注意:1.只支持xls(excel 97/2003)文件,不支持xlsx(excel 2007/2010+) # 2.脚本中注释在实际使用时删掉,否则可能会在某些环境下有奇怪问题 import os,sys import xlrd,xlwt from xlutils.copy import copy ## 旧的字符串 old_str = [ 'pkgname' , 'username' , 'dbinfo' , 'dbname' ] ## 替换的新字符串,新旧列表中位置要对应 new_str = [ 'PKGNAME' , 'USERNAME' , 'DBINFO' , 'DBNAME' ] ## 新旧字符串列表长度 len_old_str = len (old_str) len_new_str = len (new_str) ## 检查新旧字符串列表数量是否相等,不相等退出 if len_old_str ! = len_new_str: print "\n[ Error ] 'old_str =" ,len_old_str, "' not eq 'new_str =" ,len_new_str, "'\n" sys.exit(); ## 小写转大写 def str_to_STR( xls_list ): ## 读取Excle文件 wb = xlrd.open_workbook( xls_list ) ## 将uncode编码汉字显示成可读 reload (sys) sys.setdefaultencoding( "utf-8" ) ## 读取第1个索引的sheet页,索引0开始 sheet = wb.sheet_by_index( 1 ) ## 读取excle里第一个sheet页,第10列(J列)内容,索引0开始 col = sheet.col_values( 9 ) print "\n[ OK ] 共读取 %s 行。" % len (col) new_col = [] new_col_tmp = [] ## 循环替换小写到大写;for循环两个参数时用zip包含 for f_old_str,f_new_str in zip (old_str,new_str): print "[ Info ] 正在查找 '%s' 并替换成 '%s'" % (f_old_str,f_new_str) if not new_col_tmp : ## 首次循环列表空,复制列表 new_col_tmp = col for col_list in new_col_tmp: new_col.append(col_list.replace(f_old_str,f_new_str)) ## 交换列表值,防止多次循环重复添加 ## 清空列表 new_col_tmp = [] ## 复制列表 new_col_tmp = new_col ## 清空列表 new_col = [] print "[ OK ] 共修改 %s 行。" % len (new_col_tmp) ## save date to EXCLE row = 0 #行 column = 9 # 列 ## 新建文件 #workbook1 = xlwt.Workbook() ## 打开文件追加(覆盖)原内容,formatting_info=True保留文件原来格式 #workbook1 = xlrd.open_workbook(r'/media/win-share-c/test.xls') workbook1 = xlrd.open_workbook( xls_list, formatting_info = True ) #print workbook ## 新文件中添加,名字为"Style"的sheet页,内容cell_overwrite_ok覆盖 #sheet_wt = workbook.add_sheet('Style',cell_overwrite_ok=True) ## 将xlrd的对象转化为xlwt的对象 workbook = copy(workbook1) ## 获取要操作的第0个sheet页 sheet_wt = workbook.get_sheet( 1 ) ## 循环追加写入内容 for i in range ( len (new_col_tmp)): sheet_wt.write(row,column,new_col_tmp[i]) ## 到下一行 row = row + 1 ## 捕获保存文件异常 try : workbook.save( xls_list ) except IOError: print "\n[ Error ] 写入错误,请关闭文件!\n" else : def_xls_file_name = os.path.basename(xls_list) print "\n[ OK ] 文件: %(def_xls_file_name)s 第%(column)s列,小写转大写完成,保存到文件完成!\n" % locals (); return ## function Main def main(): ## 查找.xls后缀文件 xls_file_lists = [] ## 循环查找py文件同目录及子目录下的xls文件 for filepath,dirnames,filenames in os.walk(os.getcwd()): for filename in filenames: ## 文件后缀为.xls,则添加到列表中 if os.path.splitext(filename)[ 1 ] = = '.xls' : ## sep自动识别系统路径分割,用'/'或'\' #xls_file_lists.append(os.path.join(filepath,filename)) xls_file_lists.append(os.sep.join([filepath,filename])) len_xls_file_lists = len (xls_file_lists) print "\n共找到 %s 个xls后缀文件:" % len_xls_file_lists ## 列出找到的xls后缀文件 for list in xls_file_lists: print list ## 开始读取数据并替换 for xls_list in xls_file_lists: print "\n开始读取: %s" % xls_list str_to_STR( xls_list ) if ( __name__ = = '__main__' ) or ( __name__ = = 'main' ): main(); |
效果:
__EOF__
分类:
Python & Jython
标签:
python
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!