首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用Python从Excel表中提取OLE对象?

如何使用Python从Excel表中提取OLE对象?
EN

Stack Overflow用户
提问于 2020-01-19 13:02:40
回答 2查看 1.8K关注 0票数 1

我想使用Python将Excel表中的OLE对象提取到Windows剪贴板中。

This post并没有提供进一步的帮助,因为它是针对VBA的。而this post仍然没有答案。

假设给定的Excel表(带有ChemDraw或ChemSketch OLE对象):

有一些Python模块可以处理Excel文件,例如openpyxlxlrd。模块win32clipboard可以将数据放入剪贴板。

我的问题:

  1. 我不知道如何将嵌入的OLE对象放到剪贴板上。也许,openpyxlxlrd以及win32clipboard不适合这样做?
  2. 有一个Python模块oletools,它也许可以做到,但我不明白它是如何工作的。https://pypi.org/project/oletools/

从本页:

oleobj:从OLE文件中提取嵌入式对象。

这似乎正是我正在寻找的,但是,我找不到任何MCVEs。不幸的是,oleobj的文档基本上简化为:“阅读源代码,自己找出答案”。如有提示和帮助,我将不胜感激。

到目前为止我的代码是:

代码语言:javascript
复制
### 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
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-01-20 13:43:21

同时,我找到了this post,在那里OP实际上不想让OLE对象出现在剪贴板上,但对我来说,这很好。实际上,不需要openpyxlxlrd,但需要win32com.client

我可以得到所有OLE对象,但是,它们的索引(可能)是按照它们添加的顺序进行的。因此,我需要创建一个字典,其中行索引作为键,OLE对象索引和名称作为值。

代码:

代码语言:javascript
复制
### 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

结果:

代码语言:javascript
复制
Anthracene OLE object is now on the clipboard.
票数 0
EN

Stack Overflow用户

发布于 2020-10-26 10:17:39

我构建了一个python模块来完成这个检查。https://pypi.org/project/AttachmentsExtractor/也可以在任何操作系统上运行该模块。

安装库后,请使用以下代码片段:

代码语言:javascript
复制
 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.
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59810248

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档