99999久久久久久亚洲,欧美人与禽猛交狂配,高清日韩av在线影院,一个人在线高清免费观看,啦啦啦在线视频免费观看www

熱線電話:13121318867

登錄
首頁(yè)大數(shù)據(jù)時(shí)代老板讓我從幾百個(gè)Excel中查找數(shù)據(jù),我用python一分鐘搞定!
老板讓我從幾百個(gè)Excel中查找數(shù)據(jù),我用python一分鐘搞定!
2020-08-04
收藏

相信大家最近都快被python煩死了,朋友圈,公眾號(hào)推文,小視頻上都是關(guān)于python的廣告,什么面試錄取會(huì)用python的人,剛來(lái)的同事因?yàn)闀?huì)用python升職加薪啦等等。但是小編覺(jué)得,python就是一款工具,最大的特點(diǎn)是它能幫我們解決那些重復(fù)性工作,解放我們雙手。下面,小編給大家分享的這篇文章就是關(guān)于python辦公自動(dòng)化的,希望能對(duì)大家有所幫助。

以下文章來(lái)源: 早起Python

作者:陳熹

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

今天分享一個(gè)真實(shí)的辦公自動(dòng)化需求,大家一定要仔細(xì)閱讀需求說(shuō)明,在理解需求之后即可體會(huì)Python的強(qiáng)大!

一、需求說(shuō)明

首先我們來(lái)看下今天的需求,有一份檔案記錄總表的Excel工作簿, 每天會(huì)根據(jù)當(dāng)天日期建立新表,每天的表格內(nèi)包含所有檔案信息,同時(shí)也有可能會(huì)添加新的檔案名。同個(gè)年度的總表在年末可能會(huì)有兩、三百個(gè)工作表,同時(shí)每個(gè)表中可能也存在千余份檔案信息。表格形式如下(為了直觀呈現(xiàn)本例以7個(gè)工作表和十余份檔案的形式呈現(xiàn))

需要完成的操作:為了方便審查特定檔案信息,需要給出檔案名后生成一份新表,該表包含指定檔案在所有日期(即所有工作表)中的記錄。最終結(jié)果如下(以檔案x003為例):

也就是老板說(shuō):給我把這幾百個(gè)表格中所有包含檔案x003的相關(guān)數(shù)據(jù)全部找到并整理個(gè)新的表格給我

二、步驟分析

正式寫(xiě)代碼前可以把需求分析清楚,將復(fù)雜問(wèn)題簡(jiǎn)單化。

說(shuō)白了,這個(gè)需求要求把所有日期工作表中的特定行都提取出來(lái)整合成一個(gè)新表。那么我們可以遍歷每一張表,然后遍歷第一列(名稱(chēng)列,也可以看作A列)每一個(gè)有數(shù)據(jù)的單元格,如果單元格中的文字為我們需要的檔案名,就把這一行提取出來(lái)放到新的表格中,進(jìn)一步梳理步驟為

建立一個(gè)新的EXCEL工作簿

新表的表頭和檔案記錄Excel中的一樣,也是名稱(chēng)、配置、提交日期等

遍歷檔案記錄Excel的每一張工作表sheet,再遍歷第一列每一個(gè)有數(shù)據(jù)的單元格,對(duì)內(nèi)容進(jìn)行判斷

找到符合條件的單元格后獲取行號(hào),根據(jù)行號(hào)將當(dāng)前表中的特定行提取出來(lái),并將行追加新創(chuàng)建的表中

分析清楚就可以著手寫(xiě)代碼了

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

首先導(dǎo)入需要的庫(kù)本例中涉及舊表的打開(kāi)和新表的創(chuàng)建,因此需要從openpyxl導(dǎo)入load_workbook和Workbook(如果是ppt和word用到的模塊就更智能了,一個(gè)方法就能搞定)

from openpyxl import load_workbook, Workbook

接著導(dǎo)入舊表及創(chuàng)建新表

# 從桌面上獲取總表
filepath = r'C:\Users\chenx\Desktop\臺(tái)賬.xlsm' # 根據(jù)實(shí)際情況進(jìn)行修改
workbook = load_workbook(filepath)
# 創(chuàng)建新的Excel工作簿獲取到工作表
new_workbook = Workbook()
new_sheet = new_workbook.active

# 給新表寫(xiě)入表頭
new_headers = ['名稱(chēng)', '配置', '提交日期', '受限操作', '操作時(shí)間', '狀態(tài)', '存儲(chǔ)位置']
new_sheet.append(new_headers)

現(xiàn)在是核心步驟:多次遍歷,可以用workbook.sheetnames獲取工作簿所有工作表名稱(chēng)的列表,然后遍歷即可

for i in workbook.sheetnames:
    sheet = workbook[i]
    # 獲取檔案名稱(chēng)所在列
    names = sheet['A']

按照前面的分析,需要遍歷名稱(chēng)列,判斷每一個(gè)單元格的值是不是需要的檔案名。這里應(yīng)注意,如果已經(jīng)循環(huán)到需要的單元格,就可以停止循環(huán)了,但一定要把符合單元格的行號(hào)傳遞給一個(gè)變量做記錄,不然一旦break出循環(huán)就沒(méi)有記憶了

flag = 0
for cell in names:
if cell.value == keyword: # 這里的keyword就是檔案名,可以以 檔案x003 為例
    flag = cell.row
    break

獲得到符合條件的行號(hào)后用sheet[flag]就可以拿到符合行了。openpyxl不支持舊表的一整行寫(xiě)入新表,因此應(yīng)對(duì)策略就是將這一行的所有單元格具體值組裝成一個(gè)列表,用sheet.append(列表)的方法寫(xiě)入新表,遍歷部分的完整代碼如下:

    for i in workbook.sheetnames:
        sheet = workbook[i]
        names = sheet['A']
        flag = 0
        for cell in names:
            if cell.value == keyword:
                flag = cell.row
                break
        if flag:   # 如果flag沒(méi)有被修改則不需要順序進(jìn)行下列代碼
            data_lst = []
            for cell in sheet[flag]:
                # 這里加上一個(gè)對(duì)內(nèi)容的判斷,是讓無(wú)內(nèi)容的行直接放空,而不是寫(xiě)入一個(gè) none
                if cell.value:  
                    data_lst.append(str(cell.value))
                else:
                    data_lst.append(' ')
            new_sheet.append(data_lst)

最后記得保存

new_workbook.save(r'C:\Users\chenx\Desktop\臺(tái)賬查詢(xún).xlsx')

小結(jié)

這是經(jīng)過(guò)一定改編的真實(shí)案例,可見(jiàn)Python自動(dòng)化辦公確實(shí)能夠幫助我們解放自己的雙手,不過(guò)在寫(xiě)自動(dòng)化腳本之前也要先拆分任務(wù),明確思路再進(jìn)行,如果對(duì)本文的代碼和數(shù)據(jù)感興趣可以在后臺(tái)回復(fù)自動(dòng)化獲取。最后還是希望大家能夠理解Python辦公自動(dòng)化的一個(gè)核心就是批量操作-解放雙手,讓復(fù)雜的工作自動(dòng)化!

數(shù)據(jù)分析咨詢(xún)請(qǐng)掃描二維碼

若不方便掃碼,搜微信號(hào):CDAshujufenxi

數(shù)據(jù)分析師資訊
更多

OK
客服在線
立即咨詢(xún)
客服在線
立即咨詢(xún)
') } function initGt() { var handler = function (captchaObj) { captchaObj.appendTo('#captcha'); captchaObj.onReady(function () { $("#wait").hide(); }).onSuccess(function(){ $('.getcheckcode').removeClass('dis'); $('.getcheckcode').trigger('click'); }); window.captchaObj = captchaObj; }; $('#captcha').show(); $.ajax({ url: "/login/gtstart?t=" + (new Date()).getTime(), // 加隨機(jī)數(shù)防止緩存 type: "get", dataType: "json", success: function (data) { $('#text').hide(); $('#wait').show(); // 調(diào)用 initGeetest 進(jìn)行初始化 // 參數(shù)1:配置參數(shù) // 參數(shù)2:回調(diào),回調(diào)的第一個(gè)參數(shù)驗(yàn)證碼對(duì)象,之后可以使用它調(diào)用相應(yīng)的接口 initGeetest({ // 以下 4 個(gè)配置參數(shù)為必須,不能缺少 gt: data.gt, challenge: data.challenge, offline: !data.success, // 表示用戶(hù)后臺(tái)檢測(cè)極驗(yàn)服務(wù)器是否宕機(jī) new_captcha: data.new_captcha, // 用于宕機(jī)時(shí)表示是新驗(yàn)證碼的宕機(jī) product: "float", // 產(chǎn)品形式,包括:float,popup width: "280px", https: true // 更多配置參數(shù)說(shuō)明請(qǐng)參見(jiàn):http://docs.geetest.com/install/client/web-front/ }, handler); } }); } function codeCutdown() { if(_wait == 0){ //倒計(jì)時(shí)完成 $(".getcheckcode").removeClass('dis').html("重新獲取"); }else{ $(".getcheckcode").addClass('dis').html("重新獲取("+_wait+"s)"); _wait--; setTimeout(function () { codeCutdown(); },1000); } } function inputValidate(ele,telInput) { var oInput = ele; var inputVal = oInput.val(); var oType = ele.attr('data-type'); var oEtag = $('#etag').val(); var oErr = oInput.closest('.form_box').next('.err_txt'); var empTxt = '請(qǐng)輸入'+oInput.attr('placeholder')+'!'; var errTxt = '請(qǐng)輸入正確的'+oInput.attr('placeholder')+'!'; var pattern; if(inputVal==""){ if(!telInput){ errFun(oErr,empTxt); } return false; }else { switch (oType){ case 'login_mobile': pattern = /^1[3456789]\d{9}$/; if(inputVal.length==11) { $.ajax({ url: '/login/checkmobile', type: "post", dataType: "json", data: { mobile: inputVal, etag: oEtag, page_ur: window.location.href, page_referer: document.referrer }, success: function (data) { } }); } break; case 'login_yzm': pattern = /^\d{6}$/; break; } if(oType=='login_mobile'){ } if(!!validateFun(pattern,inputVal)){ errFun(oErr,'') if(telInput){ $('.getcheckcode').removeClass('dis'); } }else { if(!telInput) { errFun(oErr, errTxt); }else { $('.getcheckcode').addClass('dis'); } return false; } } return true; } function errFun(obj,msg) { obj.html(msg); if(msg==''){ $('.login_submit').removeClass('dis'); }else { $('.login_submit').addClass('dis'); } } function validateFun(pat,val) { return pat.test(val); }