python2讀取內容並查詢替換字串,保留原樣式
阿新 • • 發佈:2022-01-10
指令碼功能:批量替換excel檔案裡字串內容,並保留原有樣式。
注意:只支援xls(excel 97、2003) 但不支援xlsx(excel 2010+)
#!/usr/bin/python # -*- coding: utf-8 -*- # Date: 2022/01/08 # Python version : 2.7.5 (default, Apr 2 2020, 13:16:51) 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 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 #print 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( xls_list, formatting_info=True) ## 新檔案中新增,名字為"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 ## 查詢.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': xls_file_lists.append(os.path.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 )