Excel自動更新代碼靜態檢查處理結果
背景
代碼缺陷掃描
公司爲了提高軟件質量,引入了許多工具如pclint對代碼進行檢查,主要檢查編碼缺陷,如內存泄漏、不合理的指針強轉、內存越界、以及公司的編碼規範等,保證代碼正式上線之前提前攔截不必要風險,代碼檢查工具每天都會掃描出一些代碼缺陷,沒個缺陷都會有唯一的checkid跟蹤
缺陷修改中的無奈
如下是連續兩天的掃描結果
2019-03-29掃描結果
2019-03-30掃描結果
- 掃描出來的缺陷會導出到一個excel中,每天的導出的ecxel都會更新
- 第二天excel中的數據包含第一天的數據,且沒有規律,人工對比,效率很低且容易漏掉
使用python自動同步前一天的處理結果
如上圖是用0329的數據更新0330的數據,0330新表中只需要處理30號新增的和29號遺留爲處理的,腳本既提高了效率,也避免了遺漏
python代碼實現
# -*- coding: utf-8 -*-
#Author:walkersOnWay
#import xdrlib ,sys
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):
self.oldExcel = oldExcel #舊文件
self.newExcel = newExcel #新文件
#用舊錶更新新表
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):
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表格數據
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
原創轉載請註明出處https://blog.csdn.net/zhanghao864442969/article/details/88550608