自動處理excel數據,用什麼語言合適?

工作每天有三個小時都要從公司系統中導出最新一天的數據(excel),然後進行簡單處理(刪減列、對不完成數據處理、多個表格vlookup合併需要的列,做成透視表),根據這些數據填固定的日報周報(基本都是vlookup粘過去)。

目的:數據量比較大,有時一個操作等待的時間就兩分鐘……表格和數據的樣式都是固定的,所以想寫一個自動的程序來處理這些事,先是自動刪減不要的列,慢慢一點一點的增加功能這樣,特別是跨表格vlookup的粘貼功能。

問題:該用什麼語言來實現?VBA?python?像刪列這樣的簡單處理,我知道VBA可以做,但是不知道後面功能複雜的話會不會實現不了,這樣再換方式有點繞彎路……對程序語言有自學能力,希望有大神指導下方向就好,先謝:)

-----------------15.6.9更新-------------------

今天下午跟著新師傅接觸了一個新的表,圖上的數據是6-8月一季度的,每天都會增加,每天都需要重新導出處理……全面考慮放棄excel操作……【一下午都在弄這個表各種等我的內心幾乎是崩潰的】


用power query最簡單,Excel的插件。


使用何種工具的關鍵在於簡便。

VBA的主要用途就是操作Excel文件。

打個比方,對象是麵條,用筷子、叉子都可以,善於使用湯匙的大神可能會推薦湯匙。

基本思路:

1.歸納操作的特徵,文件的路徑有哪些特徵,文件名有哪些特徵,哪種條件下進行哪種操作等等。

2.製作流程圖,好處在於可以明確思路,避免設計缺陷。

3.將流程圖轉譯成VBA語句,對象屬性方法具體內容可以逐一在網上查詢到。

4.在模擬數據中運行,沒有問題開始實際運行。


用vba吧,雖然沒法和大神提的其他語言比,但是好在學習簡單,估計你連錄宏加baidu三天就弄出來了。其他大神提到的語言除了對解決你問題不大好用的vbs沒一個好學的。


Excel標配不就是VBA。

如果編程起點不高的話,就錄macro然後在macro代碼的基礎上改VBA。

但是這個方法特別慢,看數據的大小了。

不過數據太大Excel慢得很,為什麼不試試Access?


可以換一個思路,先把數據導出操作excel,那為什麼不在在導出數據的時候做手腳呢,按照你想要的格式導啊。


為什麼不使用sqlserver的reporting service?非要在客戶端跑小程序來干這些事情。


既然格式是一定的,那麼可以用.net的庫將數據轉換到SQL server中去,然後寫SQL語句,用http://ADO.net執行SQL語句或Linq調用存儲過程來分析操作資料庫每一行數據,數據比較複雜的話用C#來處理好了。處理好之後將資料庫中的數據導出為Excel的文件。

可以用winform來寫一個動態查詢分析器來做哦。

前提是對SQL語句要熟。


有語言基礎的話用VBA,沒有的話用ACEESS。


千萬別學VBA,麻痹坑太多了。

要處理數據,用資料庫最好。或者用C# + EF + MSSQL處理更方便。

至於出圖,顯然使用各種第三方控制項啊,比Excel強太多。

不過,這些都是針對超大數據量。

如果數據只有不到100條,我寧願用Excel手工處理,比寫程序更快。


不知道樓主是否解決了。

這種東西 如果會編程的話,花個一天或者幾天時間做一個自動的程序,會輕鬆很多。

至於什麼語言,應該都可以。

可以先百度一下小例子,看用哪種方便。


1、如果不會編寫 VBA 的命令,可以嘗試宏錄製功能,然後對錄製下來的腳本編輯修改,就可以改成自己想要的腳本。我之前不會 Solidworks 中的 VBA,後來錄製了操作一下,編輯成了讀取一個文件夾中的某個格式的模型文件,全部轉換為另一種格式的模型,並保存一份截圖。這樣就不用每一個模型都單獨打開,查看模型的樣子了。

2、用程序實現的話可以一勞永逸,個人喜歡用程序對付重複性的工作。當然另外需要處理一些異常情況了。

3、另外有一個想法,如果不是很涉密的能夠上傳到 Google Sheets,用雲資源幫你計算也是不錯,這樣和你的手機或者筆記本的處理能力都無關了,看 Google 給你分配多少雲計算能力了

感覺 VBA 宏應該是集成了改軟體的大部分功能,首先用代碼完成所有功能,然後再 GUI 上就是各種按鈕,宏上就封裝成了各種 VBA 腳本,畢竟可以通過宏錄製記錄很多操作。所以我覺得想要實現的功能都可以通過 VBA 腳本實現,不存在題主所說的後面複雜的操作實現不了。


對於這種問題,經常替老婆處理了,通常就是c#寫一個小的winform程序,反正邏輯在你手裡,而且又有一定的數據。

需求都已經明確了,應該可以編寫代碼了。

對喲,不會程序的話,找一個程序員男友就可以了,反正知乎一大把。逃:)


有個東西叫做ssis。。。。


以我個人的工作經驗,用R比較合適。

你每天處理Excel的時間才三個小時,我幾乎要七八個小時,奮起而用R!!尤其是處理Vlookup函數的時候,你會發現R有setdiff,intersect,union這幾個函數,頓時就不想砸電腦了……


我也有類似小項目,用php做的。思路:數據輸出csv導入mysql,在mysql里進行運算與整理,php讀取mysql進行二次處理並用phpexcel導出成Excel文件,並發送郵件至郵箱,並利用Crontab實現定時全自動化處理。


嗯以前在公司給隔壁組做過好多次類似的東西,看起來你的需求並不複雜,我當時是用python + win32的庫寫的。但實際上用這個的話和直接用VBA來寫區別不大,不過python在後續處理圖片,發送郵件訪問伺服器什麼的方面好用一些,不知道你有沒有這方面的需求。

具體用哪一個來寫就看題主你的需求了,如果對編程沒有基礎,可以嘗試一下excel的宏命令,可以幫你省去操作excel那部分的代碼(我自己用的時候覺得有點小問題,後來就拋棄了),到時候直接用vb或者python調用錄製好的宏,然後再處理接下來的東西就好了。這樣子需要學習的東西應該是最少的了。


本人也是從事數據統計工作,長期和各種表打交道。至今學會了一些小技巧,分享給大家,希望能有所幫助。

1,根據你處理的數量大小。如果很大,比如要操作10w條以上的記錄,而且需要用到其他各種表,建議使用資料庫。什麼資料庫都行,oracle,mysql,mssql,在一般的增刪改查操作,都差不多。你可以寫函數和存儲過程,簡化工作量,這是大幅提高效率的辦法。

2,如果pv少,且操作重複較多時。建議使用函數公式和宏。一般情況下,稍作修改的宏配合函數公式可以完成複雜且重複的工作。基本可以不使用vba,你也不用專門去學vba。當然會vba最好,如果不會這是需要學習成本的。

3,如果你想寫的工具大家都可以用的話,建議還是學習下vba。

4,假設你建了資料庫,用python操作數據也是不錯的辦法。也可簡化工作量。


說起來,我也曾不止一次地想享受前人的成果,"如果誰能把常用的數據查詢語法做個對比就好了 "。無奈發現網上的文章側重不同且深淺不一,還涉及到一些Pandas新老版本的問題,於是決定自己動手。我是豈安科技業務風險分析師大毛,以下,GO~


一、舉例的數據

假設我有個六列的dataframe,一列是銷售員,一列是所屬團隊,其它四列分別是四個季度的銷售額。

新增列-基於原有列的全年銷售額

首先df["Total "]確保了你在該df內新增了一個column,然後累加便可。

df["Total"] = df["Q1"]+df["Q2"]+df["Q3"]+df["Q4"]

你可能想使用諸如sum()的函數進行這步,很可惜,sum()方法只能對列進行求和,幸好它可以幫我們求出某季度的總銷售額。

df["Q1"].sum(),你就能得到一個Q1的總銷售額,除此之外,其他的聚合函數,max,min,mean都是可行的。

分組統計 - 團隊競賽

那麼按團隊進行統計呢?

在mysql里是group by,Pandas里也不例外,你只需要df.groupby("Team").sum()就能看到期望的答案了。

排序 - 誰是銷售冠軍

如果你關心誰的全年銷售額最多,那麼就要求助於sort_values方法了,在excel內是右鍵篩選,SQL內是一個orderby。

默認是順序排列的,所以要人為設定為False,如果你只想看第一名,只需要在該語句末尾添加.head(1)

切片-只給我看我關心的行

接下來就是涉及一些條件值的問題,例如我只關心Team為A的數據,在Excel里是篩選框操作,在SQL里寫個where就能搞定,在Pandas里需要做切片。

查看Pandas文檔時,你可能已經見過各種切片的函數了,有loc,iloc,ix,iy,這裡不會像教科書一樣所有都講一通讓讀者搞混。

這種根據列值選取行數據的查詢操作,推薦使用loc方法。

df.loc[df["Team"]== "A",["Salesman", "Team","Year"]],這裡用SQL語法理解更方便,loc內部逗號前面可以理解為where,逗號後可以理解為select的欄位。

如果想全選出,那麼只需將逗號連帶後面的東西刪除作為預設,即可達到select *的效果。

切片 - 多條件篩選

在Pandas中多條件切片的寫法會有些繁瑣,df.loc[ (df["Team"]== "A" ) (df["Total"] &> 15000 ) ],添加括弧與條件符。

這裡有一個有意思的小應用,如果你想給符合某些條件的員工打上優秀的標籤,你就可以結合上述新增列和切片兩點,進行條件賦值操作。

df.loc[ (df["Team"]== "A" ) (df["Total"] &> 15000 ) , "Tag"] = "Good"

刪除列 - 和查詢無關,但是很有用

當然這裡只是個舉例,這時候我想刪除Tag列,可以del df["Tag"],又回到了之前。

二、連接

接下來要講join了,現在有每小時銷售員的職位對應表pos,分為Junior和Senior,要將他們按對應關係查到df中。

這裡需要認識一下新朋友,merge方法,將兩張表作為前兩個輸入,再定義連接方式和對應鍵。對應到Excel中是Vlookup,SQL中就是join。在pandas里的連接十分簡單。

df = pd.merge(df, pos, how="inner", on="Salesman")

注意,這個時候其實我們是得到了新的df,如果不想覆蓋掉原有的df,你可以在等號左邊對結果重新命名。

這時候有了兩組標籤列(對應數值列),就可以進行多重groupby了。

當然這樣的結果並不能公平地反應出哪一組更好,因為每組的組員人數不同,可能有平均數的參與會顯得更合理,並且我們只想依據全年綜合來評價。

這裡的數據是捏造的,不過也一目了然了。

三、合併操作

最後以最簡單的一個合併操作收尾。

如果我又有一批數據df2,需要將兩部分數據合併。只需要使用concat方法,然後傳一個列表作為參數即可。不過前提是必須要保證他們具有相同類型的列,即使他們結構可能不同(df2的Team列在末尾,也不會影響concat結果,因為pandas具有自動對齊的功能)

pd.concat([df,df2])

尾聲

以上就是一些基礎的Pandas數據查詢操作了。作為Pandas初學者,如果能善用類比遷移的方法進行學習並進行總結是大有裨益的。如果看完本文還沒有能了解到你關心的查詢方法,可以留言聯繫,或許還可以有續集。


補充一下!又看了下題主的要求,其中一項是幾個sheet不同列合併成一張新的sheet,感覺這一步用access來做很方便——access導入excel分分秒秒的事情,反過來導出也是分分秒秒的事情,而access可視化查詢是很office化的,不懂select語句,也可搞定,就算想學sql查詢語句,也比學vba簡單太多太多了......對普通人來說,綜合利用excel與access,能完成excel比較複雜操作才能完成的事情噢......

..........分割線.........

如果原表是固定格式,你採用固定操作步驟,例如刪除一些固定的列,用宏就可以了,沒必要編程。

如果要編程,學起來不是一天兩天的。建議使用Python,與Pandas擴展庫。Pandas

基本思路很象Excel,猶如一個命令行加強版的Excel。學會了Python,還能做其他很多事情,比VBA適應面廣多了。。。

PS:大牛們,是不理解普通人只會使用公司應用本身提供的導出功能,來導出Excel數據,以做進一步分析——懂直接操作資料庫的,就不會問這個問題了。。。所以,普通人不適合在知乎提問滴。。。


如果打算把整個數據處理部分交給外部程序,可以用如下組合:

任何.NET語言(C#或是F#)腳本,加上黑科技Excel-DNA(Introduction,基本可以認為是.NET到Excel插件的介面)。庫比VBA多,運行速度是.NET的速度。

=========================================================

又仔細看了一下題主的問題,在我看來需要做以下的事:

1. 首先問問上游的公司系統能不能把數據清洗乾淨,在上游處理NA,還有各種lookup和aggregation。

2. 如果上游解決不了問題,就把數據處理交給Excel腳本。如果數據量不大(保存成文件不超過幾百兆),用VBA也沒問題(切記,運行腳本的時候要關掉屏幕更新和自動表格計算,詳見下面的代碼)。如果數據量大(幾個G)的話,可以用我上面說的.NET+ExcelDNA。

Application.Calculation = xlCalculationManual

Application.ScreenUpdating = False

『 Do your thing.

Application.Calculation = xlCalculationAutomatic

Application.ScreenUpdating = True

3. 用數據填固定的日報周報,如果這個日報周報的格式是在Excel內部的話,也少不了要用VBA來自動化,因為VBA是結合Excel GUI最好的,也是最簡單的。

4. 吐槽下,如果你需要處理很多數據的話,為什麼計算機才4個核啊?換個雙CPU的機器吧。

5. 從截圖上看,其實不過16萬行數據嗎,如果慢到能看見計算完成度百分比在慢慢走的話,說明很有可能現有的公式設計不合理,重複計算太多(尤其是lookup),或是經常需要recalculate。應該給公司內經常與大spreadsheet打交道的前輩檢查一下。


推薦閱讀:

python 3.4 下載了PIL第三方模塊,whl格式,如何安裝?
計算機研二女生 幾乎沒什麼整個項目經驗,編程也馬馬虎虎,現在想要自學python找工作 難嗎?
自學php或python到什麼程度才能找到工作?
職業PHP開發,想再學一門語言。GO or Python ,以備後面轉。那個更適合?
Python 中列表和元組有哪些區別?

TAG:程序員 | Python | MicrosoftExcel | VBA | R編程語言 |