zoukankan      html  css  js  c++  java
  • python2 excel读取内容并查找替换字符串,保留原样式

    脚本功能:批量替换excel文件里字符串内容,并保留原有样式。

    运行环境:Linux Python 

    注意:1.只支持xls(excel 97、2003) 但不支持xlsx(excel 2010+)

       2.脚本中的注释,在实际使用时可以删除,在某些环境下可能会有奇怪问题。

    #!/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__

  • 相关阅读:
    ADO中的多层次数据集,类似于dataset
    工作流的设计
    Socket bind系统调用简要分析
    linux Network Address Translation NAT 转载 还需要整理
    生活20190602
    磁盘空间满的问题
    linux netfilter nat 实现 转载
    Socket 套接字的系统调用
    linux 网络编程 基础
    学习linux,不要找别人了,我有东西要发
  • 原文地址:https://www.cnblogs.com/wutou/p/15785960.html
Copyright © 2011-2022 走看看