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")

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

  • 圖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)系作者
  • 序言:七十年代末紫皇,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子腋寨,更是在濱河造成了極大的恐慌,老刑警劉巖化焕,帶你破解...
    沈念sama閱讀 206,214評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件萄窜,死亡現(xiàn)場離奇詭異,居然都是意外死亡撒桨,警方通過查閱死者的電腦和手機查刻,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來凤类,“玉大人穗泵,你說我怎么就攤上這事∶瞻蹋” “怎么了佃延?”我有些...
    開封第一講書人閱讀 152,543評論 0 341
  • 文/不壞的土叔 我叫張陵,是天一觀的道長夷磕。 經(jīng)常有香客問我履肃,道長,這世上最難降的妖魔是什么坐桩? 我笑而不...
    開封第一講書人閱讀 55,221評論 1 279
  • 正文 為了忘掉前任尺棋,我火速辦了婚禮,結(jié)果婚禮上绵跷,老公的妹妹穿的比我還像新娘膘螟。我一直安慰自己成福,他們只是感情好,可當我...
    茶點故事閱讀 64,224評論 5 371
  • 文/花漫 我一把揭開白布荆残。 她就那樣靜靜地躺著闷叉,像睡著了一般。 火紅的嫁衣襯著肌膚如雪脊阴。 梳的紋絲不亂的頭發(fā)上握侧,一...
    開封第一講書人閱讀 49,007評論 1 284
  • 那天,我揣著相機與錄音嘿期,去河邊找鬼品擎。 笑死,一個胖子當著我的面吹牛备徐,可吹牛的內(nèi)容都是我干的萄传。 我是一名探鬼主播,決...
    沈念sama閱讀 38,313評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼蜜猾,長吁一口氣:“原來是場噩夢啊……” “哼秀菱!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起蹭睡,我...
    開封第一講書人閱讀 36,956評論 0 259
  • 序言:老撾萬榮一對情侶失蹤衍菱,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后肩豁,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體脊串,經(jīng)...
    沈念sama閱讀 43,441評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,925評論 2 323
  • 正文 我和宋清朗相戀三年清钥,在試婚紗的時候發(fā)現(xiàn)自己被綠了琼锋。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,018評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡祟昭,死狀恐怖缕坎,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情篡悟,我是刑警寧澤谜叹,帶...
    沈念sama閱讀 33,685評論 4 322
  • 正文 年R本政府宣布,位于F島的核電站恰力,受9級特大地震影響叉谜,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜踩萎,卻給世界環(huán)境...
    茶點故事閱讀 39,234評論 3 307
  • 文/蒙蒙 一停局、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦董栽、人聲如沸码倦。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽袁稽。三九已至,卻和暖如春擒抛,著一層夾襖步出監(jiān)牢的瞬間推汽,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評論 1 261
  • 我被黑心中介騙來泰國打工歧沪, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留歹撒,地道東北人。 一個月前我還...
    沈念sama閱讀 45,467評論 2 352
  • 正文 我出身青樓诊胞,卻偏偏與公主長得像暖夭,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子撵孤,可洞房花燭夜當晚...
    茶點故事閱讀 42,762評論 2 345

推薦閱讀更多精彩內(nèi)容