我想使用Python将Excel表中的OLE对象提取到Windows剪贴板中。
This post并没有提供进一步的帮助,因为它是针对VBA的。而this post仍然没有答案。
假设给定的Excel表(带有ChemDraw或ChemSketch OLE对象):

有一些Python模块可以处理Excel文件,例如openpyxl、xlrd。模块win32clipboard可以将数据放入剪贴板。
我的问题:
openpyxl和xlrd以及win32clipboard不适合这样做?oletools,它也许可以做到,但我不明白它是如何工作的。https://pypi.org/project/oletools/从本页:
oleobj:从OLE文件中提取嵌入式对象。
这似乎正是我正在寻找的,但是,我找不到任何MCVEs。不幸的是,oleobj的文档基本上简化为:“阅读源代码,自己找出答案”。如有提示和帮助,我将不胜感激。
到目前为止我的代码是:
### trying to extract OLE objects from Excel table into clipboard
from openpyxl import load_workbook
import win32clipboard as clpbd
def set_clipboard(data):
clpbd.OpenClipboard()
clpbd.EmptyClipboard()
clpbd.SetClipboardText(data) # I'm aware, this is only for text, is there anything for OLEs?
clpbd.CloseClipboard()
def print_clipboard():
clpbd.OpenClipboard()
data = clpbd.GetClipboardData()
clpbd.CloseClipboard()
print(data)
wb = load_workbook(filename = 'tbChemOLE.xlsx')
ws = wb.active
myName = ws['A3'].value # result: napthalene
myImage = ws['B3'].value # result: None
myObject = ws['C3'].value # result: None
set_clipboard(myName)
print_clipboard() # result: Naphtalene
# set_clipboard(myImage) # crash, because myImage is None
print_clipboard()
# set_clipboard(myObject) # crash, because myObject is None
print_clipboard()
wb.close()
### end of code发布于 2020-01-20 13:43:21
同时,我找到了this post,在那里OP实际上不想让OLE对象出现在剪贴板上,但对我来说,这很好。实际上,不需要openpyxl或xlrd,但需要win32com.client。
我可以得到所有OLE对象,但是,它们的索引(可能)是按照它们添加的顺序进行的。因此,我需要创建一个字典,其中行索引作为键,OLE对象索引和名称作为值。
代码:
### copy OLE object in certain cell to clipboard
import win32com.client as win32
import win32clipboard
excel = win32.gencache.EnsureDispatch('Excel.Application')
ffname = r'C:\Test\tbChemOLE.xlsx'
wb = excel.Workbooks.Open(ffname)
ws = wb.Worksheets.Item(1)
objs = ws.OLEObjects()
def get_all_OLEs():
oleNo_dict = {} # dictionary for all OLE objects
for i in range(1,len(objs)+1): # loop all OLE objects
obj = objs.Item(i)
myRow = obj.TopLeftCell.Row # row of OLE object
myName = ws.Cells(myRow,1).Value # corresponding name
oleNo_dict[myRow] = (i, myName)
return oleNo_dict
def get_OLE(row):
try:
objs[oleNo_dict[row][0]].Copy()
win32clipboard.OpenClipboard()
data = win32clipboard.GetClipboardData(0xC004) # Binary access
win32clipboard.CloseClipboard()
except Exception as e:
print(e)
win32clipboard.OpenClipboard()
win32clipboard.EmptyClipboard()
win32clipboard.CloseClipboard()
return oleNo_dict[row]
# and OLE is on clipboard if found
oleNo_dict = get_all_OLEs()
row = 4
myMolecule = get_OLE(row)
print(myMolecule[1], "OLE object is now on the clipboard.")
wb.Close()
excel.Application.Quit()
### end of code结果:
Anthracene OLE object is now on the clipboard.发布于 2020-10-26 10:17:39
我构建了一个python模块来完成这个检查。https://pypi.org/project/AttachmentsExtractor/也可以在任何操作系统上运行该模块。
安装库后,请使用以下代码片段:
from AttachmentsExtractor import extractor
abs_path_to_file='Please provide absolute path here '
path_to_destination_directory = 'Please provide path of the directory where the extracted attachments should be stored'
extractor.extract(abs_path_to_file,path_to_destination_directory) # returns true if one or more attachments are found else returns false.https://stackoverflow.com/questions/59810248
复制相似问题