python操作word的一些方法,前面寫了一些感悟,有點跑題,改了下題目,方便能搜索到。心急的可以直接拉到最后看代碼,我都加了比較詳細的注釋。
從8.3號早上9點,到8.8號下午5點半下班,終於把這個python代碼寫出來了,這五天簡直是廢寢忘食(扯淡),每天查資料到半夜2點(其實是天太熱,洗完澡又晾干就要一個多小時了,在這里吐槽下今年的夏天,2016年北京的7月份簡直了,平生第一次長痱子,連去年都沒用過的涼席都翻出來了)。
好吧,扯得有點遠了。因為工作需要,要批量修改一批rtf文件里的文字格式,rtf其實跟word是一樣的。因為是處理文字,所以想用python解決,之前寫過一個遍歷文件夾的腳本,正好能用上。
但是這次要處理word文件,python本身貌似只能處理text文本,網上搜索之后,發現大家都用了一個pywin32模塊,導入這個模塊之后,就可以像vba一樣操作word了!哈哈!
其實還是扯淡!我到寫完這個腳本都沒找到一個像樣的API接口文檔,可以說,我這五天只是在廢寢忘食的查接口文檔。
我曾天真的以為,我能找到一個PyWin32.chm文件,打開以后里面是pywin32模塊里每個函數的詳細用法,包括如何打開word,如何增刪改查,如何修改字體,字號,如何設置段落格式等等,最重要的是,還是中文版!哇!奈斯!
然而查了幾天后,我發現我真是腦子進屎了。安裝完pywin32模塊后,在“C:\Python34\Lib\site-packages”目錄下,會送你一個PyWin32.chm,俗話說便宜沒好貨,何況是送的,全英文版我也忍了,畢竟26個英文字母還是讀寫熟練的,但是當我隨便打開一個對象文檔的時候,還是嚇尿了!
右邊的下拉條這么短是要鬧哪樣!我只是想簡單打開個word啊!
好吧,新手沒見過大場面,好在chm文檔都很貼心的有個搜索框,興奮的輸入了“open”:
哇哦!真不少,挨個點開看看!
誰能告訴我這是些什么瘠薄玩意。。那一堆參數我要怎么輸入。。說好的open(url)打開word文件呢?!
到此,我已經對這個文檔放棄治療了(當然也可能是我太水用不明白這個文檔,但我目前也不想去弄明白他了。。)。
然后我又查查查查查查查查查查。。。。當然也有不少人(其實很少)在網上發了一些入門教學文檔,包括怎么打開文件,關閉文件等等,但是也僅僅是入門,還不能完全滿足我的需求,當然這些文章都被我未經允許,全部轉載過來了。。能復制的就復制粘貼,不能復制的就截圖復制粘貼!不過我應該都放上原文鏈接了。。。吧。。。
基本的功能在測試幾次之后都能實現了,但是還有幾個功能簡直要吐血了,比如讓一段文字格式化,成為沒有任何格式的文本,這樣一個函數折騰了整整一天!后來在vba操作里發現了一個ClearFormatting函數,才得到了解決。在這里必須要誇一誇微軟爹:
這是一份VbaWord.chm文檔,里面詳細介紹了vba中的每個函數的用法,並且都有示例!最最重要的是,他居然是中文版!要不怎么說微軟爹厚道呢^o^
既然說到微軟了,順便提一下python的IDE,我第一門正式學習的語言是Perl(工作需要),我對這門語言的評價是“呵呵”,我現在連一句Perl代碼都記不起來,只記得一個美元符$和一個@。當然不是說Perl這門語言不好,只是對於初學編程的新手來說,代碼實在是晦澀難懂,一堆符號往上一堆,感覺像是在夢游,而且Perl的學習資料很少,Perl在國外很火,但是在國內,呵呵。我當時寫Perl代碼的時候,用的是記事本。。因為那時候別說IDE了,文本編輯器也就知道記事本,寫字板和word這三個。后來無意中知道了還有sublime這種東西,下載下來安裝一試,哇,果然比記事本好用,而且也像網上說的皮膚很酷炫,黑色的,銀色的,其他色什么的,聽說還能裝什么插件,簡直就是神器!我當時感覺這就是我一輩子的伴侶了。然而幾個月后我就換成了notepad++,原因是界面簡單,啟動速度快,漢化好,而且字好像也比較大。。
后來我從那個公司離職后,放棄了Perl,開始學習同是3P之一的python,當時從網上搜索教學視頻,還買了小甲魚的“VIP至尊會員”!在這里打個廣告,想學python的可以去看看小甲魚的視頻,視頻是免費的,優酷上就有,只是他的魚c論壇里有些資料需要魚幣,如果是會員的話是免費的,當然你每天簽到和回復都可以賺魚幣的,如果條件允許的話,可以買個會員,200塊終身的。小甲魚還是很辛苦的,看照片也就20多歲,現在還在每天更新視頻,他不光講python,還有c語言和其他的一些,不過我覺得還是python比較值得一看,畢竟國內的python教學視頻很少,質量更是呵呵。
學習python的時候,我用的IDE一直是python自帶的IDLE,其實我到現在用的也是IDLE。。IDLE其實真的很不錯,有代碼提示,也有顏色區別,F5運行,還有錯誤提示。前幾天在查資料的時候,也看到很多人爭論哪個python IDE最好用,評價最高的是pycharm,網上有人說,使用pycharm寫python就好比使用vs寫c#,聽完這句我馬上下載了這個200M的軟件,然后花了倆小時去破解、漢化,然后試用了一分鍾,最后花了5分鍾卸載。一個漢化有bug,設置字體還要找教程,啟動比vs還慢,占內存比vs還大,IDLE不能自動提示的他也沒有的軟件,我要來何用,你是如何有勇氣跟vs比的?當然也可能是我水平不夠沒寫過什么大項目,但是在我心中,vs依然是最好的IDE。既然vs這么好,那么有沒有vs的python插件呢?畢竟eclipse都有個pydev啊!答案是有,就是PTVS,裝上這個插件后,vs就能新建python項目了,而且vs的很多快捷鍵都可以用,比如注釋,自動排版等,自動提示做的也還可以,畢竟是腳本語言,不能要求太高,引入模塊里的函數一樣不能點出來。當時第一次安裝這個插件的時候其實感覺還是很別扭的,因為並不像寫c#那樣無可挑剔,當時心灰意冷,最終還是用回了IDLE。但是今天在把網上的一段代碼復制到IDLE里后,縮進一直報錯簡直要炸了,一怒之下扔進vs里,看着熟悉的紅色波浪線,心里涌過一絲溫暖,就是你了。。
當然新手還是建議用IDLE,因為你要用PTVS這個插件要先裝一個vs,而一個vs大約是4、5個G左右。。啥?你說裝vs就為跑個python?
微軟的東西就是好啊,雖然vs是收費軟件,但是在國內,你跟誰收費呢?況且現在的vs2015有了免費的社區版,當然你也可以用其他方式獲得專業版(我說的當然是花錢購買正版啊,你們不要誤會)。
另外,c#是個好東西,想想我這一年,前前后后學習了不少東西,究其原因,是我一直想做個自己的網站,當時我已經買了域名和空間,但是還啥也不會。做網站就要學習HTML,但是光有HTML頁面不好看,又學了CSS,但是網頁不能動,不能點擊什么的,又學了JavaScript,期間為了美化差點又學習Photoshop,后來發現是個大坑,趕緊跳了出來,東西太多,還是以后再學吧!然后網頁要注冊什么的吧,又要學習ASP.NET,但是上來沒有基礎又不能直接學,又從c#基礎開始學起,期間還學習了C語言和SqlServer數據庫,到三層的時候感覺有點跟不上了,於是我一鼓作氣,跳了過去直接學ASP了(好無恥)。。因為正好當時老板一直催着我做一個注冊網頁,最后終於是做出來一個乞丐版的注冊界面,能夠跟我的數據庫相連了,做出來的時候還是很高興的!雖然其實代碼量並不多,但好歹也是我自己做的。
說到這里,已經跑題跑的不要不要的了,順便說一下,想要學習編程的同學,往往會在網上搜索“什么編程語言適合入門”,雖然我這篇文章的題目與這完全不相關。。但我把那句話寫上了,萬一搜到了呢,也能幫幫人是吧(希望不要毀人)。我當時也天天搜,網上眾說紛紜,苦惱啊。但是作為一個過來人(其實還在開始的路上),首先要說的是,如果你有穩定的工作,或者不是計算機相關專業的,建議不要學。。或者說不要想着把編程當做一份事業,而拋棄原有的事業和專業。可能剛開始學習的時候,編出一個小程序,能夠計算一個一元二次方程,覺得哇好有趣,編程原來這么簡單啊!但是隨着學習的深入,你會發現后面的知識會非常難理解,並且很枯燥,有的知識你學了也做不出什么有用的程序來,但卻是非常重要的,這個時候你就覺得很沒勁,然后在網上閑逛的時候,很可能會看到別人說,啊,你還在用xxx語言啊,早就不行了,現在是xxx的天下了!你一動搖,可能就會對轉投另外一種語言,然后開頭的學習也是很順利,也很有趣,但是學到后面,會發現這門語言也很難,學一堆東西也是做不出什么像樣的程序。這樣就陷入了循環,不斷學習新的語言,但是每種都只會個定義變量,寫個for循環,甚至連函數都不清楚是什么,更不用說面向對象了,這樣下去,原有的一點興趣也被磨光了,你才會領悟到,原來編程這么難啊!
所以說,如果你現在過得不錯,收入穩定,對編程有點興趣,那就繼續當做興趣就可以了,千萬不要以身試險,因為不是每個人都有極大的毅力和自制力的。別說你有。。說出來你自己都不信。。不然你把lol戒了試試。。或者減20斤膘。。
再有一種,對自己專業不滿意,工作不滿意,想要通過學習一門技術來改變命運的這類人。確實軟件行業一直是高薪行業,一提程序員,都是高薪代名詞。但是啊,高薪不是這么好拿的,還是上面說的,編程不是這么好學的,不然大家都能當程序員了。而且學編程,怎么也得高中畢業吧,如果連里面的單詞都看不懂,我覺得還是挺難得,雖然說關鍵詞就那幾個,但是沒有一定的數學邏輯思維的話,你懂得。。當然世事無絕對,初中生編程高手也是有的,至於小學啊,我就不敢說了。。
總而言之,如果你想從事軟件這門行業,一定要慎重,如果決定了的話,就准備好吃幾年苦吧!沒錯,是幾年,不是幾個月。
拿我自己來說,我原來的專業是生物技術,畢業后的第一個項目是采用基因克隆來檢測細菌,聽上去高大上吧,我用了4種技術來做,PCR,NASBA,LAMP,微陣列芯片,聽上去更是吊炸天吧!然后一年半后我離職了,我跟boss說,我想做點靠譜的事情,我覺得編程挺靠譜的。boss表示很惋惜,但還是挽留我讓我拿了年終獎再走,當時我一心想走,豪氣萬丈都有點看不上年終獎了,后來我很感激boss,因為那年的年終獎漲了2K。。
之后我去了一個小公司,就是我現在的公司,十幾個人,做教育軟件的。因為我那會啥編程語言也不會,只會點半吊子Perl(這是之前的boss讓我學的,用來做生物信息分析),所以我應聘的只是數據錄入,這種只要識字,會點電腦就能干的活,一個月3K,此外啥也沒有,保險也沒有,跟不用說飯補、交通住宿補貼了。而我居然能干下去,估計也是當時手里有點存款了。。
公司里有兩個技術人員,是兩口子,然后男技術又是老板的親戚,有點亂。。這不重要!由於我表現出色(無恥。。),並且表示想要學習一些編程技術,男技術經常給我講一些編程方面的知識,從此,給我打開了C#的大門!
男技術叫CZ,人真的很好,他說他也是大學畢業跨專業考的計算機研究生,本科專業是包裝專業(什么鬼!- -!),然后考上研之后也是經常被忽略,后來依靠自己的努力,慢慢的在軟件行業有了一席之地。啊,太勵志了!
然而放到我身上完全不是這劇本了。。因為在上個公司天天操勞做實驗,做匯報,被掏空了身子,身材一直很瘦削,183的個頭,只有130斤(其實也不算很瘦。。)。然后來這公司以后,天天好吃懶做,每天那點破活隨便就做完了,下班就走愛誰誰,從來不加班。就這樣,半年胖了20斤,到150了,十月一回家的時候把我媽高興壞了。
這半年里,算是初步開始正式接觸編程了,開始在網上學習python,寫一些小腳本用在工作上,然后有一些CZ寫的c#工具,改改里面的數據和小的邏輯,改對的時候,CZ會表揚我一番,那時覺得好高興啊!
還記得當時第一次看c#代碼,當CZ打開VS的時候(那時候也沒見過VS),我一看代碼,卧槽,麻痹天書啊!上面那一列using是什么鬼?public后面那一堆大中小括號什么鬼?里面的一堆點點點是什么鬼?那個幾個單詞連在一起的巨長的是變量名?我當時強裝鎮定,但對我這種紙見過腳本語言的菜鳥,內心的震撼是巨大的。不過后來改數據的時候看多了倒也習慣了,直到有一天我看到了公司軟件的源碼。。
但是這個時期我仍然沒有系統的學習C#,我覺得那個太難了,等我先學會python再說吧。然而到現在我要沒有完全學會python,因為當時也是學到一個地方,再往后面就學不明白了,而且感覺也做不出什么有用的東西。
這個時候,大約是2015年7月份吧,不知道受了什么刺激,我就想做個網站,很快,我就摸索着從萬網購買了域名,從淘寶購買了空間,還申請了帆布拍了照片做備案。這時候還啥都不會呢,就上網查,需要學HTML,好吧,就從網上搜索視頻教程,因為我學編程習慣找視頻學習,看書實在是太枯燥了,然后,下面,我要開始打廣告了。我從網上找到一個教程“張鵬xx天帶你玩轉HTML”,基本是叫這個名字,我覺得講的很好啊,比其他的要好,因為我決定看某個系列的視頻是會對比一下,找一個講的我能接受的。視頻名字好像是7天玩轉,我當然玩不轉啦!估計得看了好幾個月,還沒看完。。但是基本的東西都會了,並且里面也講了css,算是入門了。然后我就鼓搗我的網站,終於有了個主頁面了,按照我想象的做了個排版,然而到今天每個版塊都還是空的 T_T,因為實在是不知道寫點啥,這個網站現在被我用來做測試了。。 咦?到現在還沒出現廣告?馬上就要出現了!
在我學習這套HTML視頻的時候,我注意到一個名字,確切的說是一個培訓機構,從此,我又打開了“傳智播客”的大門!
不吹不黑,傳智播客的確是個良心培訓機構,不僅是指教學質量,更重要的是,看它的視頻到現在,我一分錢沒花,因為網上都有,而且是它的官方網站提供免費下載的。。我覺得這點很難得,固然放出一部分視頻也是為了吸引學員報名,但就是這些免費的視頻也足夠你學習一年半載了。
然后我瘋狂的收集傳智播客的.net系列視頻,並開始系統學習,蘇坤的c#基礎、winform,趙建宇的基礎加強,蔣坤的JavaScript,楊洪波的數據庫、三層,王承偉的ASP.NET。每個老師講的都各有特色,雖然只是看他們的視頻,有的甚至連他們的相貌都不知道,但依然能感覺到他們的風采。蘇坤的幽默,趙建宇的孩子氣,蔣坤的博學認真,楊洪波的東北式幽默簡直能當相聲聽,還有耿直boy王承偉,哈哈,感覺學習起來都不枯燥了。其實傳智播客的金燕辦公樓離我住的地方很近,都在昌平區,坐車半小時就到了。我想如果我以后在這一行業混好了,我一定去一趟傳智播客,見一見那些老師,對他們說,雖然我沒上過你們的課,但是我聽了你們的每一堂課!
另外,在這期間,我還學習了郝斌老師的C語言,這個系列的視頻我從大學的時候就看過,但當時只看過幾節,會了個int a基本就沒再學了,這次硬是看完了指針,雖然還是迷迷糊糊,但好歹是有了個印象。這里有個小細節,我曾經看過傳智播客楊中科的一個介紹“WPF”的視頻,在他找文件的時候,發現他的電腦里居然有郝斌的C語言視頻!后來我知道楊中科也出過一套C語言視頻“C語言也能干大事”,想來他也是覺得郝斌的C語言視頻有可取之處吧!雖然有很多人不喜歡郝斌的這套視頻,覺得他普通話不標准,英語更是不忍直視,與課程無關的廢話太多,而且講解中有一些錯誤。但是,對於一個初學者來說,他能把枯燥的理論化為生動的語言,讓你理解,這就已經夠了。
郝斌還有一套“數據庫”,一套“數據結構”,一套“java”視頻,有興趣的同學可以搜索看一下,“數據結構”的視頻網上應該講的也不多,因為培訓機構不會講這個,推薦看一下。
說了這么多,我現在也只是一只小菜鳥,正在努力的學習當中,這些都是我學習的一些總結,至於推薦新手入門學習的語言,明眼人應該早就看出來了,就是C#,有了VS這個強大的IDE,寫代碼簡直手到擒來,反正我現在的智商已經跟VS綁定了。而且學習C#入門很容易,學習過程很平緩,教學視頻資料眾多,而且還有博客園這種攻略網站,所以牆裂推薦!當然你非要學習Java我也只能說,小伙子,眼光不錯!
總之,程序的這條道路必然是付出一定會有回報的,也只有付出了才能得到回報。
最后,寫一句我一直認為正確的話:選擇什么並不重要,重要的是堅持下去。
下面是代碼,其實只有幾十行,里面的幾個方法都是常用的,如果沒有,可以看下我轉載的其他幾篇文章,應該會對你有所幫助。
當然,前提是你能看到這篇文章。
1 import os #導入文件操作模塊
2 import re #導入正則模塊
3 import win32com #導入word操作模塊
4
5 #准備打開word
6 from win32com.client import Dispatch,constants
7 w = win32com.client.Dispatch('Word.Application') 8 w.Visible = 0 9 w.DisplayAlerts = 0 10 11 #獲取課文全路徑 12 #..\1_一單元\1_《憶讀書》\1_預習\1_音畫課文 13 for root, dirnames, filenames in os.walk(r'C:\Users\jjw\Desktop\test\111_語文晉教版七年級上冊'): 14 #字符串前面加r之后,正則里的\d等都不用變,'\'變成'\\'即可,開頭末尾是'^$',匹配全部是'.*' 15 # if re.match(r'.*\\\d+_\w+\\\d+_.+\\1_預習\\1_音畫課文$',dirpath): 16 # print(dirpath) 17 # else: 18 # print('未找到') 19 for filename in filenames: 20 if re.match(r'課文.rtf',filename): 21 classRTF = os.path.join(root,filename) 22 doc = w.Documents.Open(FileName = classRTF) 23 #文檔最開始插入文字 24 #myRange = doc.Range(0,0) 25 #myRange.InsertBefore('哈哈哈哈哈哈') 26 #選中並修改全文字體 27 #par = doc.Range(doc.Content.Start,doc.Content.End) 28 #par.Font.Size = "14" 29 30 #1.修改全文字體、字號 31 w.ActiveDocument.Select() 32 w.Selection.Font.Name = "微軟雅黑" 33 w.Selection.Font.Size = "14"#四號 34 35 #2.刪除空格,替換字符串 36 w.Selection.Find.ClearFormatting() 37 w.Selection.Find.Replacement.ClearFormatting() 38 w.Selection.Find.Execute(" ",False,False,False,False,False,True,1,True,"",2)#普通空格 39 w.Selection.Find.Execute(" ",False,False,False,False,False,True,1,True,"",2)#這里面是個“口”的符號,全角空格 40 41 #3.刪除空行,這里數量是1,因為回車占一個字符 42 for each in w.ActiveDocument.Paragraphs: 43 if each.Range.Words.Count == 1: 44 each.Range.Delete() 45 46 #作者后面插入空行 47 doc.Paragraphs(2).Range.InsertAfter('\n') 48 49 #前兩行清除格式,主要是首行縮進 50 doc.Paragraphs(1).Range.Select() 51 w.Selection.ClearFormatting() 52 doc.Paragraphs(2).Range.Select() 53 w.Selection.ClearFormatting() 54 55 #前兩行改字體、字號、居中 56 par1 = doc.Paragraphs(1).Range 57 #par1.ParagraphFormat.Reset()#取消首行縮進 58 par1.Font.Name = "微軟雅黑" 59 par1.Font.Size = "28"#一號 60 par1.ParagraphFormat.Alignment = 1 61 par2 = doc.Paragraphs(2).Range 62 par2.Font.Name = "微軟雅黑" 63 par2.Font.Size = "12"#小四 64 par2.ParagraphFormat.Alignment = 1 65 print("已處理:" + classRTF) 66 doc.Close() 67 w.Quit 68 print("處理完畢!")