工具分享:使用python腳本自動將舊Excel數據更新到新表,提高效率
目的:使用python腳本自動將舊Excel數據更新到新表,提高效率,避免人爲遺漏,環境安裝好之後,可直接使用
背景
代碼缺陷掃描
公司爲了提高軟件質量,引入了許多工具如pclint對代碼進行檢查,主要檢查編碼缺陷,如內存泄漏、不合理的指針強轉、內存越界、以及公司的編碼規範等,保證代碼正式上線之前提前攔截不必要風險,代碼檢查工具每天都會掃描出一些代碼缺陷,每個缺陷都會有唯一的checkid跟蹤,缺陷需要修改
缺陷修改中的無奈
如下是連續兩天的掃描結果
如上圖是用0329的數據更新0330的數據,0330新表中只需要處理30號新增的和29號遺留未處理的,腳本既提高了效率,也避免了遺漏
python代碼實現
# -*- coding: utf-8 -*-
# import xdrlib ,sys
# Author:walkersOnWay
# Time:2019-03-14
# Environment:python2.7
import xlrd #讀取excel數據
import xlwt #創建表格並寫入數據
from xlutils.copy import copy #更新已存在的表格數據
class ExcelHelper:
def __init__(self, excelFile, excelSheet):
self.excelFile = excelFile
self.excelSheet = excelSheet
self.nrows = 0
self.ncols = 0
self.__data = self.openExcel(excelFile)
#print "file:sheet = %s, %s; nrows, ncols = %d, %d", self.excelFile, self.excelSheet, self.nrows, self.ncols
#打開文件
def openExcel(self, excelFile):
try:
data = xlrd.open_workbook(excelFile)
return data
except Exception, e:
print str(e)
#根據sheet名讀取sheet數據
def getSheetDataByName(self):
listRows = []
table = self.__data.sheet_by_name(self.excelSheet)
self.nrows = table.nrows #行數
self.ncols = table.ncols #列數
for idx in range(0, self.nrows):
listRows.append(table.row_values(idx))
return listRows
#獲取單元格數據
def getCellData(self, row, col):
table = self.__data.sheet_by_name(self.excelSheet)
#print "[%d, %d] = " % (row, col), table.cell(row, col).__class__ #此處耗費時間很長,1、在於沒返回值 2、返回值的類型不對
print "table.cell(row, col).value", table.cell(row, col).value
return table.cell(row, col).value
#更新單元格數據
def updataCellData(self, row, col, newData):
newDataObj = copy(self.__data) # 類型爲worksheet 無nrows 方法
newSheet = newDataObj.get_sheet(1)
newSheet.write(row, col, newData)
newDataObj.save(self.excelFile) #此處需要保存成xls的格式,保存成xlsx會損壞數據,導致打開失敗
#獲取列數據
def getCol(self, col):
table = self.__data.sheet_by_name(self.excelSheet)
colList = table.col_values(col)
return colList
#打印整張表格數據
def showSheetListRows(self, listRows):
print "file:sheet = %s, %s; nrows, ncols = %d, %d", self.excelFile, self.excelSheet, self.nrows, self.ncols
for tmpList in listRows:
for k in range(0, self.ncols):
print " ", tmpList[k],
print "\n"
class ExcelHandler:
#def __init__(self, oldExcel, newExcel)
def __init__(self, oldExcel, newExcel, handleColIdxList): #改進
self.oldExcel = oldExcel #舊文件
self.newExcel = newExcel #新文件
self.handleColIdxList = handleColIdxList #改進:要處理的列
#用舊錶更新新表
def flushSheet(self, oldSheet, newSheet):
oldExcelHelper = ExcelHelper(self.oldExcel, oldSheet)
oldColList = oldExcelHelper.getCol(3)
newExcelHelper = ExcelHelper(self.newExcel, newSheet)
newColList = newExcelHelper.getCol(3)
oldCurRow = 0
newCurRow = 0
for oldVal in oldColList:
newCurRow = 0
for newVal in newColList:
if 0 == oldCurRow or 0 == newCurRow:
newCurRow += 1
continue
if(oldVal == newVal):
#for idx in range(4, 8): #ok
for idx in self.handleColIdxList: #改進,自定義要處理的列
oldExcelHelper = ExcelHelper(self.oldExcel, oldSheet)
newExcelHelper = ExcelHelper(self.newExcel, newSheet)
newExcelHelper.updataCellData(newCurRow, idx, oldExcelHelper.getCellData(oldCurRow, idx))
oldExcelHelper = ExcelHelper(self.oldExcel, oldSheet)
newExcelHelper = ExcelHelper(self.newExcel, newSheet)
newExcelHelper.updataCellData(newCurRow, 10, "old")
newCurRow += 1
oldCurRow += 1
#test
#讀取並打印Excel中Sheet數據
#excelHelper1 = ExcelHelper("data/file1.xls", "0329")
#print "3 list is \n", excelHelper1.getCol(3)
#excelHelper1.showSheetListRows(excelHelper1.getSheetDataByName())
#excelHelper2 = ExcelHelper("data/file.xlsx", "0330")
#excelHelper2.showSheetListRows(excelHelper2.getSheetDataByName())
#讀寫單元格
#excelHelper1.getCellData(2, 3)
#excelHelper1.updataCellData(1, 0, "BIT_OPERATION_ERROR_NEW111222")
#同步兩張sheet表格數據
handleColIdxList = [4, 6, 7] #改進:自定義需要更新的列索引
mExcelHandler = ExcelHandler("data/file1.xls", "data/file1.xls", handleColIdxList) #改進
#mExcelHandler = ExcelHandler("data/file1.xls", "data/file1.xls")
mExcelHandler.flushSheet("0329", "0330")
腳本中class ExcelHelper可實現指定sheet數據打印,列數據讀取,單元數據讀寫等操作,Excel讀寫操作可借鑑此類
說明
- 需安裝PyCharm環境,下載地址:https://www.jetbrains.com/pycharm/
- Excel操作需要依賴xlrd、xlwt和xlutils包,需要提前安裝,如安裝xlutils執行pip install xlutils,其餘安裝方法類似
- 更新數據後,save時文件名後綴需使用fileName.xls,使用fileName.xlsx會報錯
- 測試代碼及數據:鏈接:https://pan.baidu.com/s/1f9xf1StfWGHUA1hE0Ja86A
提取碼:5axh