<p>与此同时,我发现了<a href="https://stackoverflow.com/q/43154439/7295599">this post</a>,OP实际上不希望将OLE对象放在剪贴板上,但对我来说这很好。实际上,不需要<code>openpyxl</code>或<code>xlrd</code>,但需要<code>win32com.client</code></p>
<p>我可以获取所有OLE对象,但是,它们(可能)是按照添加顺序索引的。
所以我需要创建一个字典,行索引作为键,一组OLE对象索引和名称作为值</p>
<p><strong>代码:</strong></p>
<pre><code>### 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
</code></pre>
<p><strong>结果:</strong></p>
<pre><code>Anthracene OLE object is now on the clipboard.
</code></pre>