工具分享:使用python腳本自動將舊Excel數據更新到新表,提高效率

工具分享:使用python腳本自動將舊Excel數據更新到新表,提高效率


目的:使用python腳本自動將舊Excel數據更新到新表,提高效率,避免人爲遺漏,環境安裝好之後,可直接使用

背景

代碼缺陷掃描

公司爲了提高軟件質量,引入了許多工具如pclint對代碼進行檢查,主要檢查編碼缺陷,如內存泄漏、不合理的指針強轉、內存越界、以及公司的編碼規範等,保證代碼正式上線之前提前攔截不必要風險,代碼檢查工具每天都會掃描出一些代碼缺陷,每個缺陷都會有唯一的checkid跟蹤,缺陷需要修改

缺陷修改中的無奈

如下是連續兩天的掃描結果

2019-03-29掃描結果
2019-03-30掃描結果
- 掃描出來的缺陷會導出到一個excel中,每天的導出的ecxel都會更新 - 第二天excel中的數據包含第一天的數據,且沒有規律,人工對比,效率很低且容易漏掉 ## 使用python自動同步前一天的處理結果
腳本同步完29號表格後的30號表格數據

如上圖是用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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章