Python辦公自動化-Excel處理

最近和同學聊天,有聊到工作中經(jīng)常會處理一些產(chǎn)品的檢測數(shù)據(jù),經(jīng)常都是從一張或者多張Excel表中摘取需要的數(shù)據(jù)然后放到一張新表中,但是每次都是重復性的工作。如圖1要獲取數(shù)據(jù)后處理成圖2

  • 圖1.png
  • 圖2.png

可不可以寫一個程序處理這些工作呢?當然是可以的,Python就可以處理。Python中處理Excel表的庫有很多。比如:xlrd,openpyxl,xlwings等如圖3。

  • image.png

這次我們就選用openpyxl庫來處理
首先我們新建工程建原始數(shù)據(jù)導入工程

  • 圖3.png

我們的原始數(shù)據(jù)文件就是“analyzedata.xlsx”
新建一個.py文件,“analyze.py”
然后導入庫

from openpyxl import Workbook  //主要是用來新建文件
from openpyxl import load_workbook  //加載文件

首先我們在原來的Excel上新建一個sheet,并且命名為“Result”,代碼如下:

# 新建一個新表用于存放結(jié)果數(shù)據(jù)
def new_sheet():
    # 加載Excel文件
    workbook = load_workbook(filename="analyzedata.xlsx")
    # 定義一個新表名
    new_sheetname = "Result"
    # 判斷Excel中是否已經(jīng)存在“Result”名稱的這樣一個表
    if new_sheetname not in workbook.sheetnames:
        # 如果不存在我們就新建一個
        workbook.create_sheet(new_sheetname)
        # print(workbook.sheetnames)
        workbook.save(filename="analyzedata.xlsx")
    # 如果已經(jīng)存在,我們就把sheet里的數(shù)據(jù)刪除
    else:
        sheet = workbook[new_sheetname]
        # 打印出表格有數(shù)據(jù)的范圍,觀察看看
        # print(sheet.dimensions) # A1:E27
        # 或有數(shù)據(jù)的每一行,然后執(zhí)行刪除
        for row in sheet.iter_rows():
            # print(row)
            sheet.delete_rows(idx=1)
            workbook.save(filename="analyzedata.xlsx")

注意每次我們退Excel表進行了表的刪減,對數(shù)據(jù)進行了更改,都需要對文件使用“.save()”函數(shù)保存。如下

workbook.save(filename="analyzedata.xlsx")

注意:我們對于已經(jīng)存在的表,最好進行一次數(shù)據(jù)的清空再加入新數(shù)據(jù),防止有其他無用的數(shù)據(jù)混入。
比如我做的是刪除每一行的操作。這樣也可以做到在加入新數(shù)據(jù)前清空所有數(shù)據(jù)。

  sheet = workbook[new_sheetname]
  # 打印出表格有數(shù)據(jù)的范圍,觀察看看
  # print(sheet.dimensions) # A1:E27
  # 或有數(shù)據(jù)的每一行,然后執(zhí)行刪除
  for row in sheet.iter_rows():
     # print(row)
      sheet.delete_rows(idx=1)
      workbook.save(filename="analyzedata.xlsx")

通過上面new_sheet()函數(shù)我們就新建了一個sheet表。接下來我們獲取需要的數(shù)據(jù)。如下定義一個新函數(shù):

# 到源數(shù)據(jù)表中找到目標數(shù)據(jù)
def find_result():
    data_cell_list = []
    workbookT = load_workbook(filename="analyzedata.xlsx")
    # sheetT = workbook.active
    sheetT = workbookT["SourceData"]
    # 獲取工作表大小
    sheet_size = sheetT.dimensions
    #  獲取工作表內(nèi)容
    cells = sheetT[sheet_size]
    # print(cells)
    # 定義是三個空列表
    data_cps_h31 = []
    data_cps_h32 = []
    data_poi_tp1 = []

    # cell_row_tuple是每一行為1個元組
    for cell_row_tuple in cells:
        # cell是每一行元組中的每一個小格子
        for cell in cell_row_tuple:
            # print(cell.value)
            if cell.value == "CPS_H31":
                print(cell.row, cell.column)
                cell_Y = sheetT.cell(row=(cell.row + 2), column=(cell.column + 3))
                cell_Z = sheetT.cell(row=(cell.row + 3), column=(cell.column + 3))
                cell_Len = sheetT.cell(row=(cell.row + 4), column=(cell.column + 3))
                cell_WID = sheetT.cell(row=(cell.row + 5), column=(cell.column + 3))
                cell_len_tem = sheetT.cell(row=(cell.row + 4), column=cell.column + 1)
                cell_wid_tem = sheetT.cell(row=(cell.row + 5), column=cell.column + 1)
                data_cps_h31 = [
                    ["Y", cell_Y.value],
                    ["Z", cell_Z.value],
                    [cell_len_tem.value, cell_Len.value],
                    [cell_wid_tem.value, cell_WID.value],
                ]

            if cell.value == "CPS_H32":
                print(cell.row, cell.column)
                cell_Y = sheetT.cell(row=(cell.row + 2), column=(cell.column + 3))
                cell_Z = sheetT.cell(row=(cell.row + 3), column=(cell.column + 3))
                cell_Len = sheetT.cell(row=(cell.row + 4), column=(cell.column + 3))
                cell_WID = sheetT.cell(row=(cell.row + 5), column=(cell.column + 3))
                cell_len_tem = sheetT.cell(row=(cell.row + 4), column=cell.column + 1)
                cell_wid_tem = sheetT.cell(row=(cell.row + 5), column=cell.column + 1)
                data_cps_h32 = [
                    ["Y", cell_Y.value],
                    ["Z", cell_Z.value],
                    [cell_len_tem.value, cell_Len.value],
                    [cell_wid_tem.value, cell_WID.value],
                ]

            if cell.value == "POI_TP1":
                print(cell.row, cell.column)
                cell_X = sheetT.cell(row=(cell.row + 2), column=(cell.column + 2))
                data_poi_tp1 = [
                    ["X", cell_X.value]
                ]

    data_re = [data_cps_h31, data_cps_h32, data_poi_tp1]
    return data_re

思路就是獲取到表格中所有內(nèi)容,也就是獲取到所有有數(shù)據(jù)格子中的數(shù)據(jù),然后通過if判斷找到所需要的數(shù)據(jù)。
如下:

    sheet_size = sheetT.dimensions
    #  獲取工作表內(nèi)容
    cells = sheetT[sheet_size]

   # cell_row_tuple是每一行為1個元組
    for cell_row_tuple in cells:
        # cell是每一行元組中的每一個小格子
        for cell in cell_row_tuple:
            # print(cell.value)
            if cell.value == "CPS_H31":
             .......

通過這個函數(shù)就可以獲得所有需要的數(shù)據(jù)了。有了數(shù)據(jù)就可以往新表中添加數(shù)據(jù)了。添加數(shù)據(jù)函數(shù)如下。

def append_rows(data_result):
    workbook = load_workbook(filename="analyzedata.xlsx")
    sheet = workbook["Result"]
    for row in data_result:
        sheet.append(row)

    workbook.save(filename="analyzedata.xlsx")

這個比較簡單就不多說了。對于基礎(chǔ)有疑問的可以訪問我的簡書基礎(chǔ)部分。運行代碼如下:

  • 圖4.png

這些數(shù)據(jù)已經(jīng)很接近我們結(jié)果了,通過分析,我們可以通過插入一列后添加數(shù)據(jù)達到我們結(jié)果。代碼如下:

def insert_cols_data():
    workbook = load_workbook(filename="analyzedata.xlsx")
    sheet = workbook["Result"]
    sheet.insert_cols(idx=1)
    cellOne = sheet["A1"]
    cellOne.value = "H31"
    cellTwo = sheet["A5"]
    cellTwo.value = "H32"
    cellThree = sheet["A9"]
    cellThree.value = "H31"
    workbook.save(filename="analyzedata.xlsx")

調(diào)用這些函數(shù),然后運行,得到結(jié)果:

-
圖5.png

注意一個很多人可能遇到的bug,如下圖

  • 圖6.png

這個bug是由于我們ExcelB表格被打開了,沒有關(guān)閉導致的。如下圖

  • 圖7.png

把表格關(guān)閉,運行代碼就恢復正常了。本次分享已經(jīng)完成。

源碼地址:關(guān)注微信公眾號“碼農(nóng)不頭禿”后回復“Excel表格處理”將會有源碼地址發(fā)給您。
對Python感興趣的朋友可以關(guān)注我的簡書和公眾號。需要Python或者爬蟲電子書的朋友們關(guān)注微信公眾號后臺回復“python電子書”。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容