我想使用Python添加和從Office/Excel文檔中提取文件。到目前爲止,添加事物很容易,但對於提取我還沒有找到一個乾淨的解決方案Python:無需剪貼板,從Office/Excel文檔訪問嵌入式OLE
爲了清楚我已經得到了什麼,以及我沒有寫下這個小例子test.py下面並進一步解釋。
test.py
import win32com.client as win32
import os
from tkinter import messagebox
import win32clipboard
# (0) Setup
dir_path = os.path.dirname(os.path.realpath(__file__))
print(dir_path)
excel = win32.gencache.EnsureDispatch('Excel.Application')
wb = excel.Workbooks.Open(dir_path + "\\" + "test_excel.xlsx")
ws = wb.Worksheets.Item(1)
objs = ws.OLEObjects()
# (1) Embed file
f = dir_path + "\\" + "test_txt.txt"
name = "test_txt_ole.txt"
objs.Add(Filename=f, IconLabel=name)
# (2) Access embedded file
obj = objs.Item(1) # Get single OLE from OLE list
obj.Copy()
win32clipboard.OpenClipboard()
data = win32clipboard.GetClipboardData(0xC004) # Binary access
win32clipboard.EmptyClipboard()
win32clipboard.CloseClipboard()
messagebox.showinfo(title="test_txt_ole.txt", message=str(data))
# (3) Press don't save here to keep
# wb.Close() # Will close excel document and leave excel opened.
excel.Application.Quit() # Will close excel with all opened documents
爲了製備(步驟0)它打開與一個工作表給定的excel文件,這是通過使用Excel中新文檔按鈕建立之前。 在步驟(1)它使用API將給定的文本文件嵌入到Excel文檔中。該文本文件之前使用文本編輯器創建了內容「TEST123」。然後在步驟(2)它嘗試使用剪貼板從嵌入的OLE中讀回內容,並打開一個消息框,顯示剪貼板中OLE的內容。最後(3)程序關閉打開的文件。要保持不變的設置,請按這裏。
這個解決方案的一個很大的缺點是使用了剪貼板,它可以在剪貼板中破壞任何用戶內容,這在生產環境中是不好的風格。此外,它使用剪貼板的未公開選項。
更好的解決方案是安全的OLE或OLE嵌入文件到Python數據容器或我選擇的文件。在我的示例中,我使用了TXT文件來輕鬆識別文件數據。最後,我將使用ZIP進行一體化解決方案,但對於base64數據,TXT文件解決方案已足夠。 0xC004的
源= 49156:https://danny.fyi/embedding-and-accessing-a-file-in-excel-with-vba-and-ole-objects-4d4e7863cfff
這VBA例子看起來有趣,但我不知道VBA線索:Saving embedded OLE Object (Excel doc) to file in Excel 2010 vs 2013
所以,我發現這個問題令人困惑。看起來你想從excel文件中提取某些東西,但是我發現* something *有點含糊。 –
我對python並不熟悉,但事實上,你已經在做很多「VBA」了。 'Workbooks.Open','Worksheets.Item'等等都是VBA命令(技術上它們是IDispatch調用)。爲什麼不直接嘗試在Python代碼中直接調用VBA示例中的'oEmbFile.Object.SaveAs fName' –
@Simon:Pyhton就像VBA一樣使用COM接口。我可以使用下面的代碼行來查看對象API,但沒有SaveAs只有Activate和Copy之類的東西。 messagebox.showinfo(title =「packBootstrap」,message =「Item obj:\ n」+ str(type(obj))+ str(dir(obj)) messagebox.showinfo(title =「packBootstrap」,message =「_ oleobj _:\ n」+ str(type(obj._oleobj_))+ str(dir(obj._oleobj_))) 但沒有任何東西讓我進一步也「obj._oleobj_」是一個「PylDispatch」對象。 – BREMI