मैं किसी Office/एक्सेल दस्तावेज़ अजगर का उपयोग करने से जोड़ सकते हैं और फ़ाइलों को अलग करना चाहते हैं के बिना कार्यालय/एक्सेल दस्तावेज़ से पहुंच एम्बेडेड 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) के लिए यह खोलता है एक वर्कशीट के साथ किसी दिए गए एक्सेल दस्तावेज है कि एक्सेल में नया दस्तावेज़ बटन का उपयोग करके पहले बनाने था। चरण में (1) यह एक्सेल दस्तावेज में दिए गए पाठ फ़ाइल एम्बेड करने के लिए API का उपयोग करता। टेक्स्ट फ़ाइल को पाठ संपादक का उपयोग करके सामग्री "TEST123" से पहले बनाया गया था। चरण में बाद में (2) इसे वापस एम्बेडेड OLE से सामग्री क्लिपबोर्ड का उपयोग करके पढ़ने के लिए कोशिश करता है और एक संदेश बॉक्स कि क्लिपबोर्ड में OLE से सामग्री से पता चलता खोलता है। अंत में (3) कार्यक्रम खोले दस्तावेज़ को बंद कर देता है। एक अपरिवर्तित सेटअप रखने के लिए यहां कोई दबाएं।
इस समाधान का बड़ा नुकसान यह है जो क्लिपबोर्ड जो एक उत्पादक वातावरण में बुरा शैली है में किसी भी उपयोगकर्ता सामग्री स्मैश क्लिपबोर्ड का उपयोग है। इसके अलावा यह क्लिपबोर्ड के लिए एक अनियंत्रित विकल्प का उपयोग करता है।
एक बेहतर समाधान एक अजगर डेटा कंटेनर के लिए या अपनी पसंद के किसी फ़ाइल के लिए सुरक्षित OLE या OLE एम्बेडेड फाइल करने के लिए किया जाएगा। मेरे उदाहरण में मैंने फ़ाइल डेटा को आसानी से पहचानने के लिए एक TXT फ़ाइल का उपयोग किया है। आखिरकार मैं एक इन-इन-वन समाधान के लिए ज़िप का उपयोग करूंगा लेकिन बेस 64 डेटा के लिए एक TXT फ़ाइल समाधान पर्याप्त होगा।
0xC004 का स्रोत = 49,156: 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
तो, मैं भ्रमित सवाल लग रहा है यहाँ मेरी कोड है। ऐसा लगता है कि आप एक्सेल फ़ाइल से कुछ निकालना चाहते हैं, लेकिन मुझे लगता है कि * कुछ * थोड़ा अस्पष्ट होना क्या है। –
मैं अजगर से परिचित नहीं हूं, लेकिन वास्तव में, आप पहले से ही बहुत सारे "वीबीए" कर रहे हैं। 'वर्कबुक। ओपन', 'वर्कशीट्स.इटम' इत्यादि वीबीए कमांड हैं (तकनीकी रूप से वे आईडीस्पैच कॉल हैं)। आप केवल अपने पायथन कोड –
@ सिमॉन से वीबीए उदाहरण में 'oEmbFile.Object.SaveAs fName' जैसे कुछ कॉल करने का प्रयास क्यों नहीं करते हैं: वीबीए जैसे पायथन COM इंटरफ़ेस का उपयोग करते हैं।मैं ऑब्जेक्ट एपीआई को देखने के लिए निम्न कोड लाइन का उपयोग कर सकता हूं लेकिन केवल SaveAs को सक्रिय और कॉपी जैसी चीजें नहीं हैं। messagebox.showinfo (शीर्षक = "पैकबूटस्ट्रैप", संदेश = "आइटम obj: \ n" + str (प्रकार (obj)) + str (dir (obj)) messagebox.showinfo (शीर्षक = "पैकबूटस्ट्रैप", संदेश = "_ oleobj _: \ n" + str (type (obj._oleobj_)) + str (dir (obj._oleobj_)) लेकिन ऐसा कुछ भी नहीं है जो मुझे आगे लाए "obj._oleobj_" एक "पिलडिस्पैच" ऑब्जेक्ट है । – BREMI