<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          Python辦公自動(dòng)化,批量提取Excel數(shù)據(jù)

          共 3553字,需瀏覽 8分鐘

           ·

          2020-07-31 16:08

          點(diǎn)擊關(guān)注上方“SQL數(shù)據(jù)庫(kù)開(kāi)發(fā)”,

          設(shè)為“置頂或星標(biāo)”,第一時(shí)間送達(dá)干貨

          大家好,又到了Python辦公自動(dòng)化系列。


          今天我們來(lái)講解一個(gè)比較簡(jiǎn)單的案例,使用openpyxl從Excel中提取指定的數(shù)據(jù)并生成新的文件,之后進(jìn)一步批量自動(dòng)化實(shí)現(xiàn)這個(gè)功能,通過(guò)本例可以學(xué)到的知識(shí)點(diǎn):

          • openpyxl模塊的運(yùn)用

          • glob模塊建立批處理

          數(shù)據(jù)源:阿里云天池的電商嬰兒數(shù)據(jù)(可自行搜索并下載,如果要完成進(jìn)階難度可直接將該數(shù)據(jù)Excel拷貝999次即可,當(dāng)然這個(gè)拷貝可以交給代碼來(lái)實(shí)現(xiàn))


          需求說(shuō)明


          初級(jí)難度:提取電商嬰兒數(shù)據(jù).xlsx中購(gòu)買數(shù)buy_mount超過(guò)50的記錄建立新的Excel表

          最后形成如下的表格:


          進(jìn)階難度:同一個(gè)文件夾下有1000電商嬰兒數(shù)據(jù)的Excel表格(命名為電商嬰兒數(shù)據(jù)1.xlsx電商嬰兒數(shù)據(jù)2.xlsx電商嬰兒數(shù)據(jù)1000.xlsx),需要提取所有表格中購(gòu)買數(shù)buy_mount超過(guò)50的記錄并匯總至一個(gè)新的Excel表

          Python實(shí)現(xiàn)


          讓我們先完成初級(jí)難度的需求挑戰(zhàn),首先導(dǎo)入所需模塊并打開(kāi)數(shù)據(jù)表,注意

          打開(kāi)已經(jīng)存在的Excel用load_workbook,創(chuàng)建新的Excel用Workbook
          from?openpyxl?import?load_workbook,?Workbook

          #?數(shù)據(jù)所在的文件夾目錄
          path?=?'C:/Users/xxxxxx'

          #?打開(kāi)電商嬰兒數(shù)據(jù)工作簿
          workbook?=?load_workbook(path?+?'/'?+?'電商嬰兒數(shù)據(jù).xlsx')
          #?打開(kāi)工作表
          sheet?=?workbook.active

          接下來(lái)篩選符合條件的行

          buy_mount?=?sheet['F']
          row_lst?=?[]
          for?cell?in?buy_mount:
          ????if?isinstance(cell.value,?int)?and?cell.value?>?50:
          ????????print(cell.row)
          ????????row_lst.append(cell.row)

          這一步本質(zhì)上就是對(duì)購(gòu)買數(shù)的各個(gè)單元格進(jìn)行判斷,如果數(shù)值超過(guò)50就將其行號(hào)放入一個(gè)空列表中,間接完成了篩出符合條件的行。注意這一列有可能有的單元格cell的值value不是數(shù)值類型,因此需要用isinstance()進(jìn)行判斷,當(dāng)然也可以將單元格的值先用int()轉(zhuǎn)為整型再判斷。


          篩選出符合條件的行號(hào)就可以提取行并且放入新的Excel中了,因此需要先創(chuàng)建新的工作簿,現(xiàn)在創(chuàng)建新的工作簿寫入符合條件的行,思路是根據(jù)行號(hào)獲取到指定行后,遍歷所有單元格的值組裝成一個(gè)列表,用sheet.append()寫入新表

          new_workbook?=?Workbook()
          new_sheet?=?new_workbook.active

          #?創(chuàng)建和?電商嬰兒數(shù)據(jù)?一樣的表頭(第一行)
          header?=?sheet[1]
          header_lst?=?[]
          for?cell?in?header:
          ????header_lst.append(cell.value)
          new_sheet.append(header_lst)

          #?從舊表中根據(jù)行號(hào)提取符合條件的行,并遍歷單元格獲取值,以列表形式寫入新表
          for?row?in?row_lst:
          ????data_lst?=?[]
          ????for?cell?in?sheet[row]:
          ????????data_lst.append(cell.value)
          ????new_sheet.append(data_lst)

          #?最后切記保存
          new_workbook.save(path?+?'/'?+?'符合篩選條件的新表.xlsx')

          初級(jí)難度的需求已經(jīng)成功完成,至此我們已經(jīng)學(xué)會(huì)從單個(gè)表中提取需要的行并且放到新的表格里。有的人可能會(huì)說(shuō)了:一個(gè)表格的篩選可以直接用Excel中的 篩選 來(lái)完成,不需要用代碼寫這么復(fù)雜,還難以理解。因此就有了進(jìn)階需求。現(xiàn)在需要完成的工作變成,獲取1000個(gè)表格中所有符合條件的行并匯總成一個(gè)新表。如果是手動(dòng)操作的行,需要打開(kāi)每個(gè)表格,然后一通篩選操作后,將所有滿足條件的行都復(fù)制到新表,并且執(zhí)行上述操作1000次!


          這顯然不現(xiàn)實(shí),而如果你已經(jīng)理解初級(jí)需求的思路,那么只需要加上幾行代碼,就可以完成進(jìn)階需求。所需要的模塊是glob。批處理的大概代碼框架如下:

          import?glob

          #?1000份數(shù)據(jù)所在的文件夾目錄
          path?=?'C:/Users/xxxxxx'

          for?file?in?glob.glob(path?+?'/*'):
          ????pass

          如果需要遍歷特定類型的文件可以限定后綴,以xlsx后綴的Excel文件為例

          for?file?in?glob.glob(path?+?'/*.xlsx'):
          ????pass

          最后只需要將上面寫好的針對(duì)單個(gè)文件的代碼放到循環(huán)體內(nèi)部,且load_workbook的路徑變成循環(huán)出的每一個(gè)xlsx文件的絕對(duì)路徑。當(dāng)然,還需要想清楚有些代碼不能在循環(huán)體里重復(fù)被執(zhí)行,如創(chuàng)建新表和給新表添加表頭,創(chuàng)建新表放在循環(huán)體外就可以,添加表頭可以用一個(gè)單獨(dú)的變量來(lái)判斷這個(gè)操作是否已經(jīng)被執(zhí)行。完整代碼如下:

          from?openpyxl?import?load_workbook,?Workbook
          import?glob

          path?=?'C:/Users/xxxxxx'
          new_workbook?=?Workbook()
          new_sheet?=?new_workbook.active

          #?用flag變量明確新表是否已經(jīng)添加了表頭,只要添加過(guò)一次就無(wú)須重復(fù)再添加
          flag?=?0

          for?file?in?glob.glob(path?+?'/*.xlsx'):
          ????workbook?=?load_workbook(file)
          ????sheet?=?workbook.active
          ????
          ????buy_mount?=?sheet['F']
          ????row_lst?=?[]
          ????for?cell?in?buy_mount:
          ????????if?isinstance(cell.value,?int)?and?cell.value?>?50:
          ????????????print(cell.row)
          ????????????row_lst.append(cell.row)
          ????
          ????if?not?flag:
          ????????header?=?sheet[1]
          ????????header_lst?=?[]
          ????????for?cell?in?header:
          ????????????header_lst.append(cell.value)
          ????????new_sheet.append(header_lst)
          ????????flag?=?1
          ????
          ????for?row?in?row_lst:
          ????????data_lst?=?[]
          ????????for?cell?in?sheet[row]:
          ????????????data_lst.append(cell.value)
          ????????new_sheet.append(data_lst)

          new_workbook.save(path?+?'/'?+?'符合篩選條件的新表.xlsx')


          小結(jié)


          以上就是使用Python實(shí)現(xiàn)批量從Excel中提取指定數(shù)據(jù)的全部過(guò)程和代碼,如果你也有相關(guān)需求,稍作修改即可使用。其實(shí)如果你仔細(xì)思考會(huì)發(fā)現(xiàn)這個(gè)需求使用pandas會(huì)以更簡(jiǎn)潔的代碼實(shí)現(xiàn),但是由于我們之后的Python辦公自動(dòng)化案例中會(huì)頻繁使用openpyxl,并且在操作Excel時(shí)有更多的功能,因此在之后我們將主要講解如何使用這個(gè)openpyxl實(shí)現(xiàn)。最后還是希望大家能夠理解Python辦公自動(dòng)化的一個(gè)核心就是批量操作-解放雙手,讓復(fù)雜的工作自動(dòng)化!


          ——End——

          后臺(tái)回復(fù)關(guān)鍵字:1024,獲取一份精心整理的技術(shù)干貨
          后臺(tái)回復(fù)關(guān)鍵字:進(jìn)群,帶你進(jìn)入高手如云的交流群。
          推薦閱讀

          這是一個(gè)能學(xué)到技術(shù)的公眾號(hào),歡迎關(guān)注
          點(diǎn)擊「閱讀原文」了解SQL訓(xùn)練營(yíng)

          瀏覽 24
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  欧美日韩在线一级黄色电影 | 国产精品嫩草AV城中村 | 九九九九九国产 | 国产一卡在线 | 黄色污污污网站 |