# This demo uses some of the Microsoft Office components. # # It was taken from an MSDN article showing how to embed excel. # It is not comlpete yet, but it _does_ show an Excel spreadsheet in a frame! # import regutil import win32con import win32ui import win32uiole from pywin.mfc import activex, docview, object, window from win32com.client import gencache # WordModule = gencache.EnsureModule('{00020905-0000-0000-C000-000000000046}', 1033, 8, 0) # if WordModule is None: # raise ImportError, "Microsoft Word version 8 does not appear to be installed." class OleClientItem(object.CmdTarget): def __init__(self, doc): object.CmdTarget.__init__(self, win32uiole.CreateOleClientItem(doc)) def OnGetItemPosition(self): # For now return a hard-coded rect. return (10, 10, 210, 210) def OnActivate(self): # Allow only one inplace activate item per frame view = self.GetActiveView() item = self.GetDocument().GetInPlaceActiveItem(view) if item is not None and item._obj_ != self._obj_: item.Close() self._obj_.OnActivate() def OnChange(self, oleNotification, dwParam): self._obj_.OnChange(oleNotification, dwParam) self.GetDocument().UpdateAllViews(None) def OnChangeItemPosition(self, rect): # During in-place activation CEmbed_ExcelCntrItem::OnChangeItemPosition # is called by the server to change the position of the in-place # window. Usually, this is a result of the data in the server # document changing such that the extent has changed or as a result # of in-place resizing. # # The default here is to call the base class, which will call # COleClientItem::SetItemRects to move the item # to the new position. if not self._obj_.OnChangeItemPosition(self, rect): return 0 # TODO: update any cache you may have of the item's rectangle/extent return 1 class OleDocument(object.CmdTarget): def __init__(self, template): object.CmdTarget.__init__(self, win32uiole.CreateOleDocument(template)) self.EnableCompoundFile() class ExcelView(docview.ScrollView): def OnInitialUpdate(self): self.HookMessage(self.OnSetFocus, win32con.WM_SETFOCUS) self.HookMessage(self.OnSize, win32con.WM_SIZE) self.SetScrollSizes(win32con.MM_TEXT, (100, 100)) rc = self._obj_.OnInitialUpdate() self.EmbedExcel() return rc def EmbedExcel(self): doc = self.GetDocument() self.clientItem = OleClientItem(doc) self.clientItem.CreateNewItem("Excel.Sheet") self.clientItem.DoVerb(-1, self) doc.UpdateAllViews(None) def OnDraw(self, dc): doc = self.GetDocument() pos = doc.GetStartPosition() clientItem, pos = doc.GetNextItem(pos) clientItem.Draw(dc, (10, 10, 210, 210)) # Special handling of OnSetFocus and OnSize are required for a container # when an object is being edited in-place. def OnSetFocus(self, msg): item = self.GetDocument().GetInPlaceActiveItem(self) if ( item is not None and item.GetItemState() == win32uiole.COleClientItem_activeUIState ): wnd = item.GetInPlaceWindow() if wnd is not None: wnd.SetFocus() return 0 # Dont get the base version called. return 1 # Call the base version. def OnSize(self, params): item = self.GetDocument().GetInPlaceActiveItem(self) if item is not None: item.SetItemRects() return 1 # do call the base! class OleTemplate(docview.DocTemplate): def __init__( self, resourceId=None, MakeDocument=None, MakeFrame=None, MakeView=None ): if MakeDocument is None: MakeDocument = OleDocument if MakeView is None: MakeView = ExcelView docview.DocTemplate.__init__( self, resourceId, MakeDocument, MakeFrame, MakeView ) class WordFrame(window.MDIChildWnd): def __init__(self, doc=None): self._obj_ = win32ui.CreateMDIChild() self._obj_.AttachObject(self) # Dont call base class doc/view version... def Create(self, title, rect=None, parent=None): style = win32con.WS_CHILD | win32con.WS_VISIBLE | win32con.WS_OVERLAPPEDWINDOW self._obj_.CreateWindow(None, title, style, rect, parent) rect = self.GetClientRect() rect = (0, 0, rect[2] - rect[0], rect[3] - rect[1]) self.ocx = MyWordControl() self.ocx.CreateControl( "Microsoft Word", win32con.WS_VISIBLE | win32con.WS_CHILD, rect, self, 20000 ) def Demo(): import sys import win32api docName = None if len(sys.argv) > 1: docName = win32api.GetFullPathName(sys.argv[1]) OleTemplate().OpenDocumentFile(None) # f = WordFrame(docName) # f.Create("Microsoft Office") if __name__ == "__main__": Demo()