<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,幫朋友寫了一個(gè)“制作工資條”的自動(dòng)化程序!

          共 3705字,需瀏覽 8分鐘

           ·

          2020-08-30 08:11

          點(diǎn)擊上方“Python爬蟲與數(shù)據(jù)挖掘”,進(jìn)行關(guān)注

          回復(fù)“書籍”即可獲贈(zèng)Python從入門到進(jìn)階共10本電子書

          白頭宮女在,閑坐說玄宗。

          本文說明

          周末和一個(gè)朋友吃飯,她說我經(jīng)常使用Excel制作工資條,但是每個(gè)月都要做一遍。你能不能用python寫一個(gè)代碼,能夠自動(dòng)化完成這個(gè)工作,這當(dāng)然可以啦,就是這么牛逼!

          我們先來看看原始數(shù)據(jù)是什么樣子的。

          那么最后做成的效果是什么樣子的呢?

          這就很方便了,不管你公司有多少人,只要你把原始數(shù)據(jù)丟給我,我都可以秒出一個(gè)工資條,省得每次都需要使用Excel操作一遍,并且數(shù)據(jù)多了Excel還會(huì)卡頓。

          代碼邏輯剖析

          那么這樣一個(gè)程序,是怎么寫的呢?

          其實(shí)只要是邏輯想清楚了,剩下的就是寫代碼的事兒了。下面我就帶著大家梳理一下,這段代碼的邏輯。

          首先,我們應(yīng)該是讀取Excel表格。然后需要拷貝其中一個(gè)sheet表到另外一張sheet表,并給sheet命名。這樣做的目的:為了存放制作好工資條的那張sheet表。

          import?re
          import?openpyxl
          from?copy?import?copy

          wb?=?openpyxl.load_workbook('工資條.xlsx')
          # copy_worksheet():拷貝sheet表?
          wb.copy_worksheet(wb['工資條'])
          # worksheets:以列表的形式返回所有的Worksheet(表格)
          ws?=?wb.worksheets[-1]
          ws.title?=?'final_工資條'

          可能這樣說,大家還是不知道上述代碼到底是什么意思?我下面截一張圖給大家,其實(shí)就可以很好的說明上述函數(shù)的含義了。

          接著,就需要給每一行數(shù)據(jù)前面添加一個(gè)表頭。由于后面每一行表頭的樣式,都與第一行完全一模一樣的,因此我們需要復(fù)制第一行表頭中的樣式。

          def?cell_style(cell):
          ????alignment?=?copy(cell.alignment)????#?對(duì)齊樣式
          ????border?=?copy(cell.border)??????????#?邊框樣式
          ????fill?=?copy(cell.fill)??????????????#?填充樣式
          ????font?=?copy(cell.font)??????????????#?字體樣式
          ????return?alignment,?border,?fill,?font
          ????
          #?獲取標(biāo)題行中,每個(gè)單元格中的各種樣式
          alignment,?border,?fill,?font?=?cell_style(cell=cells_rows[0][0])

          從上面的代碼中可以看到:我定義了一個(gè)函數(shù),使用copy庫(kù)中的copy()方法,直接拷貝單元格的4大樣式。因?yàn)樵淼谝恍兄忻總€(gè)單元格的4大樣式,都是完全一致的,因此我們直接獲取第一個(gè)單元格的樣式即可

          最后這一part是整個(gè)代碼中最精彩的部分,不太好敘述,大家仔細(xì)研究一下下方的注釋。

          for?i,?_?in?enumerate(cells_rows[1:]):
          ????if?i?>?0:
          ????????index?=?i*3
          ????????#?每循環(huán)一次,就在對(duì)應(yīng)位置下方插入2行。1行是空行,1行是表頭行。
          ????????ws.insert_rows(idx=index,?amount=2)
          ????????#?因?yàn)槊看尾迦?行,所以需要在表頭行那里,將表頭及其樣式寫入。
          ????????for?j,?v?in?enumerate(header):
          ????????????r,?c?=?index+1,?j+1
          ????????????cell?=?ws.cell(row=r,?column=c)
          ????????????cell.value?=?v
          ????????????cell.alignment?=?alignment
          ????????????cell.font?=?font
          ????????????cell.border?=?border
          ????????????cell.fill?=?fill
          ????????????#?更新后面的公式
          ????????????if?cell.coordinate[:1]?in?('H',?'J'):
          ????????????????cell?=?ws.cell(row=r+1,?column=c)
          ????????????????cell.value?=?re.sub('\d+',?str(r+1),?cell.value)

          這里需要特別說明一點(diǎn)的就是更新公式。就拿第一次循環(huán)來說,我們?cè)诘?行的位置,插入了2個(gè)空白行。那么原本第3行的數(shù)據(jù),此時(shí)就被擠到了第5行。

          注意:它是被迫擠到第5行的,因此這一整行是原封不動(dòng)搬到第5行的,包括它原來的公式。原來在第3行的時(shí)候,如果公式是SUM(E3:G3),被擠到到了第5行后,應(yīng)該是SUM(E5:G5),但是它仍然是SUM(E3:G3)因?yàn)樗潜黄鹊?/strong>,所以需要我們修改公式,上述代碼中正是使用正則將這個(gè)數(shù)字3改為了5。

          完整代碼

          import?re
          import?openpyxl
          from?copy?import?copy

          def?cell_style(cell):
          ????alignment?=?copy(cell.alignment)????#?對(duì)齊樣式
          ????border?=?copy(cell.border)??????????#?邊框樣式
          ????fill?=?copy(cell.fill)??????????????#?填充樣式
          ????font?=?copy(cell.font)??????????????#?字體樣式
          ????return?alignment,?border,?fill,?font

          wb?=?openpyxl.load_workbook('工資條.xlsx')?
          wb.copy_worksheet(wb['工資條'])
          ws?=?wb.worksheets[-1]
          ws.title?=?'final_工資條'

          #?獲取每一列的值,拼接在一個(gè)列表中
          cells_rows?=?[[cell?for?cell?in?row]?for?row?in?ws.rows]

          #?獲取標(biāo)題
          header?=?[cell.value?for?cell?in?cells_rows[0]]

          #?獲取標(biāo)題行中,每個(gè)單元格中的各種樣式
          alignment,?border,?fill,?font?=?cell_style(cell=cells_rows[0][0])

          for?i,?_?in?enumerate(cells_rows[1:]):
          ????if?i?>?0:
          ????????index?=?i*3
          ????????#?每讀取一行,就在下方插入兩行
          ????????ws.insert_rows(idx=index,?amount=2)
          ????????#?寫表頭
          ????????for?j,?v?in?enumerate(header):
          ????????????r,?c?=?index+1,?j+1
          ????????????cell?=?ws.cell(row=r,?column=c)
          ????????????cell.value?=?v
          ????????????cell.alignment?=?alignment
          ????????????cell.font?=?font
          ????????????cell.border?=?border
          ????????????cell.fill?=?fill
          ????????????#?更新后面的公式
          ????????????if?cell.coordinate[:1]?in?('H',?'J'):
          ????????????????cell?=?ws.cell(row=r+1,?column=c)
          ????????????????cell.value?=?re.sub('\d+',?str(r+1),?cell.value)
          #?整個(gè)代碼寫完后,一定要記得保存???????????????
          wb.save('工資條.xlsx')????


          -------------------?End?-------------------

          往期精彩文章推薦:

          歡迎大家點(diǎn)贊,留言,轉(zhuǎn)發(fā),轉(zhuǎn)載,感謝大家的相伴與支持

          想加入Python學(xué)習(xí)群請(qǐng)?jiān)诤笈_(tái)回復(fù)【入群

          萬水千山總是情,點(diǎn)個(gè)【在看】行不行

          /今日留言主題/

          隨便說一兩句吧~~

          瀏覽 58
          點(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>
                  国产精品一区二区黑人巨大 | 黄色电影网页 | 午夜操骚逼 | 欧美成人在线无码 | 麻豆成人91精品二区三区 |