153 lines
4.9 KiB
Python
153 lines
4.9 KiB
Python
|
# 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()
|