腳本功能:批量替換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__
