導航:首頁 > 編程語言 > python處理word公式

python處理word公式

發布時間:2023-09-12 10:02:23

『壹』 python Word文檔處理 上篇:python-docx

某天我收到一個需求:希望能夠用python對word文檔進行一些處理,比如更換一些文字以及添加批註。

簡單搜索後,我發現 python-docx 是一個處理docx文檔的常用python庫,因此我打算用它來進行進一步開發。

官方文檔 提供了一個簡單的示例

python-docx 將文檔抽象為document對象、paragraph對象以及run對象,提供了圍繞這些對象進行簡單處理的API

然而在文檔中並沒有出現關於批註操作的部分,我在搜尋 一些文章 後發現了在某個 issue 中提及了添加批註相關信息,然而還是沒有得到具體的解決辦法

docx文檔底層是由XML文件組成的

我們可以將一個 xx.docx 文件的後綴名改為 .rar 然後將其手動解壓,可以得到下面這些文件

在諸多文件當中主要用到的是 document.xml 文件,這里保存了文檔的內容

打開一份 document.xml 文件,拋開header、footer、table以及其他特殊項,去掉樣式等修飾項,一份樸素的docx文檔主要可以分為三個部分:paragraph、run、text

paragraph即段落,就是我們在word當中看到的一段。text即文本,就是真實的內容。run比較抽象,我們可以將其理解為片段,即語句的切分。

為了更好地理解run是什麼,打開一篇word文檔定位其中一句話

讓我們看看這篇文檔解壓之後的 document.xml 文件中對應的部分

OK,我們可以看到原本完整的一句話在word中被拆分成了許多個 <w:r> 標簽,這就是 run ,word切分 run 的規則很多,有的根據標點符號,有的根據中文分詞,句子中如果存在不同樣式的字詞也會單獨切分出來,因此我們很難預估一句話究竟會被分成幾個片段。

在issue中搜索comment關鍵字發現在一個 merge request 上已經給出了添加批註的解決方案,可以通過 paragraph 對象上的 add_comment 方法給一個段落添加批註

但這還是不符合我的需求,我的目標是精準添加到某個詞或者短語上

打開 這個貢獻者的源碼 進行研究

其實就是在P標簽內插入comment標簽引用,同時添加comment標簽到xx文件

同理我們可以在r標簽內插入comment標簽引用,同時添加comment標簽到xx文件,這樣就能實現給特定詞添加批註的需求了

『貳』 如何在 Linux 上使用 Python 讀取 word 文件信息

首先下載安裝win32com
from win32com import client as wc
word = wc.Dispatch('Word.Application')
doc = word.Documents.Open('c:/test')
doc.SaveAs('c:/test.text', 2)
doc.Close()
word.Quit()

這種方式產生的text文檔,不能用python用普通的r方式讀取,為了讓python可以用r方式讀取,應當寫成

doc.SaveAs('c:/test', 4)

注意:系統執行完成後,會自動產生文件後綴txt(雖然沒有指明後綴)。
在xp系統下面,應當
open(r'c:\text','r')
wdFormatDocument = 0
wdFormatDocument97 = 0
wdFormatDocumentDefault = 16
wdFormatDOSText = 4
wdFormatDOSTextLineBreaks = 5
wdFormatEncodedText = 7
wdFormatFilteredHTML = 10
wdFormatFlatXML = 19
wdFormatFlatXMLMacroEnabled = 20
wdFormatFlatXMLTemplate = 21
= 22
wdFormatHTML = 8
wdFormatPDF = 17
wdFormatRTF = 6
wdFormatTemplate = 1
wdFormatTemplate97 = 1
wdFormatText = 2
wdFormatTextLineBreaks = 3
wdFormatUnicodeText = 7
wdFormatWebArchive = 9
wdFormatXML = 11
wdFormatXMLDocument = 12
= 13
wdFormatXMLTemplate = 14
= 15
wdFormatXPS = 18

照著字面意思應該能對應到相應的文件格式,如果你是office 2003可能支持不了這么多格式。word文件轉html有兩種格式可選wdFormatHTML、wdFormatFilteredHTML(對應數字 8、10),區別是如果是wdFormatHTML格式的話,word文件裡面的公式等ole對象將會存儲成wmf格式,而選用 wdFormatFilteredHTML的話公式圖片將存儲為gif格式,而且目測可以看出用wdFormatFilteredHTML生成的HTML 明顯比wdFormatHTML要干凈許多。
當然你也可以用任意一種語言通過com來調用office API,比如PHP.
from win32com import client as wc
word = wc.Dispatch('Word.Application')
doc = word.Documents.Open(r'c:/test1.doc')
doc.SaveAs('c:/test1.text', 4)
doc.Close()
import re
strings=open(r'c:\test1.text','r').read()
result=re.findall('\(\s*[A-D]\s*\)|\(\xa1*[A-D]\xa1*\)|\(\s*[A-D]\s*\)|\(\xa1*[A-D]\xa1*\)',strings)
chan=re.sub('\(\s*[A-D]\s*\)|\(\xa1*[A-D]\xa1*\)|\(\s*[A-D]\s*\)|\(\xa1*[A-D]\xa1*\)','()',strings)
question=open(r'c:\question','a+')
question.write(chan)
question.close()
answer=open(r'c:\answeronly','a+')
for i,a in enumerate(result):
m=re.search('[A-D]',a)
answer.write(str(i+1)+' '+m.group()+'\n')
answer.close()
chan=re.sub(r'\xa3\xa8\s*[A-D]\s*\xa3\xa9','()',strings)
#不要(),容易引起歧義。

『叄』 實現python文本寫入word

准備
我測試使用的Python版本為2.7.10,如果你的版本是Python3.5的話,這里就不太適合了。

使用Speech API
原理
我們的想法是藉助微軟的語音介面,所以我們肯定是要進行調用 相關的介面。所以我們需要安裝pywin32來幫助我們完成這一個底層的交互。
示例代碼
import win32com.clientspeaker = win32com.client.Dispatch("SAPI.SpVoice")speaker.Speak("Hello, it works!")

小總結
是的,調用介面來實現語音功能就是這么簡單,但是我們不得不來聊一聊這種方式的缺點。
對中文支持的不夠好,僅僅是這一點,估計在中國沒幾個用它的了。
還有就是語速不能很好的控制
pyttsx方式
原理
pyttsx 是Python的一個關於文字轉語音方面的很不錯的庫。我們還可以藉助pyttsx來實現在線朗讀rfc文件或者本地文件等等,最為關鍵的是,它對中文支持的還是不錯的。
示例代碼
# coding:utf-8import sysreload(sys)sys.setdefaultencoding('utf8')# __author__ = '郭 璞'# __date__ = '2016/8/6'# __Desc__ = 文字轉語音輸出import pyttsxengine = pyttsx.init()engine.say('hello world')engine.say('你好,郭璞')engine.runAndWait()# 朗讀一次engine.endLoop()

小總結
使用pyttsx,我們可以藉助其強大的API來實現我們基本的業務需求。很酷吧。
pyttsx深入研究
做完上面的小實驗,你肯定會覺得怎麼這么不過癮呢?
別擔心,下面我們就一起走進pyttsx的世界,深入的研究一下其工作原理吧。
語音引擎工廠
類似於設計模式中的「工廠模式」,pyttsx通過初始化來獲取語音引擎。當我們第一次調用init操作的時候,會返回一個pyttsx的engine對象,再次調用的時候,如果存在engine對象實例,就會使用現有的,否則再重新創建一個。
pyttsx.init([driverName : string, debug : bool]) → pyttsx.Engine

從方法聲明上來看,第一個參數指定的是語音驅動的名稱,這個在底層適合操作系統密切相關的。如下:
1.drivename:由pyttsx.driver模塊根據操作系統類型來調用,默認使用當前操作系統可以使用的最好的驅動
sapi5 - SAPI5 on Windows

nsss - NSSpeechSynthesizer on Mac OS X

espeak - eSpeak on every other platform

2.debug: 這第二個參數是指定要不要以調試狀態輸出,建議開發階段設置為True
引擎介面
要想很好的運用一個庫,不了解其API是不行的。下面來看看pyttsx。engine.Engine的引擎API。
方法簽名 參數列表 返回值 簡單釋義
connect(topic : string, cb : callable) topic:要描述的事件名稱;cb:回調函數 → dict 在給定的topic上添加回調通知
disconnect(token : dict) token:回調失聯的返回標記 Void 結束連接
endLoop() None → None 簡單來說就是結束事件循環
getProperty(name : string) name有這些枚舉值「rate, vioce,vioces,volumn → object 獲取當前引擎實例的屬性值

setProperty(name : string) name有這些枚舉值「rate, vioce,vioces,volumn → object 設置當前引擎實例的屬性值
say(text : unicode, name : string) text:要進行朗讀的文本數據; name: 關聯發音人,一般用不到 → None 預設要朗讀的文本數據,這也是「萬事俱備,只欠東風」中的「萬事俱備」
runAndWait() None → None 這個方法就是「東風」了。當事件隊列中事件全部清空的時候返回
startLoop([useDriverLoop : bool]) useDriverLoop:是否啟用驅動循環 → None 開啟事件隊列
元數據音調
在pyttsx.voice.Voice中,處理合成器的發音。
age

發音人的年齡,默認為None
gender

以字元串為類型的發音人性別: male, female, or neutral.默認為None
id

關於Voice的字元串確認信息. 通過 pyttsx.engine.Engine.setPropertyValue()來設置活動發音簽名. 這個屬性總是被定義。
languages

發音支持的語言列表,如果沒有,則為一個空的列表。
name

發音人名稱,默認為None.
更多測試
朗讀文本
import pyttsxengine = pyttsx.init()engine.say('Sally sells seashells by the seashore.')engine.say('The quick brown fox jumped over the lazy dog.')engine.runAndWait()

事件監聽
import pyttsxdef onStart(name): print 'starting', namedef onWord(name, location, length): print 'word', name, location, lengthdef onEnd(name, completed): print 'finishing', name, completedengine = pyttsx.init()engine.say('The quick brown fox jumped over the lazy dog.')engine.runAndWait()

打斷發音
import pyttsxdef onWord(name, location, length): print 'word', name, location, length if location > 10: engine.stop()engine = pyttsx.init()engine.say('The quick brown fox jumped over the lazy dog.')engine.runAndWait()

更換發音人聲音
engine = pyttsx.init()voices = engine.getProperty('voices')for voice in voices: engine.setProperty('voice', voice.id) engine.say('The quick brown fox jumped over the lazy dog.')engine.runAndWait()

語速控制
engine = pyttsx.init()rate = engine.getProperty('rate')engine.setProperty('rate', rate+50)engine.say('The quick brown fox jumped over the lazy dog.')engine.runAndWait()

音量控制
engine = pyttsx.init()volume = engine.getProperty('volume')engine.setProperty('volume', volume-0.25)engine.say('The quick brown fox jumped over the lazy dog.')engine.runAndWait()

執行一個事件驅動循環
engine = pyttsx.init()def onStart(name): print 'starting', namedef onWord(name, location, length): print 'word', name, location, lengthdef onEnd(name, completed): print 'finishing', name, completed if name == 'fox': engine.say('What a lazy dog!', 'dog') elif name == 'dog': engine.endLoop()engine = pyttsx.init()engine.say('The quick brown fox jumped over the lazy dog.', 'fox')engine.startLoop()

使用一個外部的驅動循環
engine = pyttsx.init()engine.say('The quick brown fox jumped over the lazy dog.', 'fox')engin(www.alOnely.Com.Cn)e.startLoop(False)# engine.iterate() must be called inside externalLoop()externalLoop()engine.endLoop()

總結
以上就是Python如何實現文本轉語音的全部內容,看完了上面的講述,是不是感覺Python實現文本轉語音還是蠻簡單的?那麼,大家快來嘗試嘗試吧。希望本文對大家學習Python有所幫助。

『肆』 python讀取word每一行

Python學習筆記(28) - Python讀取word文本 - 程序員大陽的博客...

1. 簡介 Python可以利用python-docx模塊處理word文檔,處理方式是面向對象的。也就是說python-docx模塊會把word文檔,文檔中的段落、文本、字體等都看做對象,
2. 相關概念 如果需要讀取

『伍』 python操作word文檔表格

>>>app=my.Office.Word.GetInstance()
>>>doc=app.Documents[0]
>>>printdoc.Name
VBA工具集.doc
>>>doc.Tables.Count
2
>>>table=doc.Tables[1]
>>>table.Cell(1,1).Select()
>>>app.Selection.MoveEnd(Unit=12,Count=4)
4
>>>app.Selection.Cells.Shading.Texture=-10
>>>

1.my.Office.Word.GetInstance()用win32com得到Word的Application對象的實例

2.我所使用的樣本word文件中包含兩個Table第二個Table是想要修改的

3.table.Cell(1,1).Select()用於選中這個樣表的第一個單元格

4.app.Selection.MoveEnd用於獲得向右多選取4個單元格,wdCell=12,用於指示按單元格移動

5.app.Selection.Cells.Shading.Texture = -10用於執行陰影底紋的設置工作,wdTextureDiagonalUp=-10是一個代表斜向右上的底紋樣式的常數

閱讀全文

與python處理word公式相關的資料

熱點內容
壓縮文件zip怎麼解壓不了 瀏覽:390
如何看蘋果appstore軟體是否收費 瀏覽:463
android發送字元串 瀏覽:13
python3最好的書籍推薦 瀏覽:684
藍牙模塊與單片機連接 瀏覽:665
mssql命令大全 瀏覽:193
mpv伺服器怎麼樣 瀏覽:599
伺服器遷移後怎麼恢復 瀏覽:249
在vfp中如何顯示和隱藏命令 瀏覽:283
如何部署地圖伺服器 瀏覽:737
安卓系統雲閃付哪個app好用 瀏覽:111
程序員一天完成幾個需求 瀏覽:960
請運行命令來卸載oracle 瀏覽:243
知識問答哪個app好 瀏覽:398
數控銑床編程代碼大全 瀏覽:869
程序員相親被罵 瀏覽:810
r6單片機 瀏覽:614
牛客編程題怎麼評分 瀏覽:189
希沃白板怎麼在安卓重置系統 瀏覽:845
python處理json過大 瀏覽:260