利用 Excel封装成OCX 在wxPython窗口中显示、操作

<span style="font-size:18px;"># -*- coding: utf-8 -*-  SCITE 消除乱码设置: 文件->编码->带BOM的UTF-8
# 奇怪的乱码!
"""
目的:
    1. 封装Excel 的 OCX太少! 好用的更是少之又少!(注意!!! iWebOffice2006.ocx涉及到版权! 这里iWebOffice2006.ocx仅做学习、研究、交流用! 如需使用请君购买正版! ) 
    2. OCX嵌入到wxPython对话框例子太少.
    3. 这个例子就是填补1-2空白 
    4. 最好的利用了:
        1. excel高普及率、
        2. VBA操作的灵活强大
        3. Python高效开发、不用编译直接运行
        4. Python脚本+ VBA脚本 + 窗口界面 浑然一体
环境准备:
    1. Python2.7.8
    2. Office2007
    3. pyInstaller2.1
    4. wxPython For py2.7
    5. 其他py需要的包(如:COM,Win32)根据提示安装
"""

import wx
import  wx.lib.anchors as anchors
from wx.lib.activexwrapper import MakeActiveXClass
import win32com.client.gencache as win32

import sys

reload(sys)
de = sys.getdefaultencoding() # ascii
fe = sys.getfilesystemencoding() #mbcs
#print de, fe

# 注意: 先使用 开始->Python2.7->PythonWin->Tools->COM Makepy utility->选中iWebOffice2006Library(1.0) 
# 生成C:\Python27\lib\site-packages\win32com\gen_py\19890DF8-EB54-4FB0-ABBA-5242B2A07EEEx0x1x0.py!
excelControl = win32.EnsureModule('{19890DF8-EB54-4FB0-ABBA-5242B2A07EEE}',0,1,0) 
#print excelControl
#print dir(excelControl)

if excelControl is None: # 发布时要带上 19890DF8-EB54-4FB0-ABBA-5242B2A07EEEx0x1x0.py!
    raise ImportError("Can't load iWebOffice2006.ocx Make sure you have iWebOffice2006.ocx regstered.")
    
[   ID_ANCHORSDEMOFRAMEANCHOREDPANEL, 
    ID_ANCHORSDEMOFRAMEMAINPANEL, 
    ID_ANCHORSDEMOFRAMEOKBUTTON,
    ID_ANCHORSDEMOFRAME, 
 ] = map(lambda _init_ctrls: wx.NewId(), range(4))  
 
class MyFrame(wx.Frame):
    def _init_utils(self):
        pass
        
    def _init_ctrls( self ):
        wx.Frame.__init__(
            self, size=(800, 600), id=ID_ANCHORSDEMOFRAME, 
            title=u'用Excel(OCX)做界面', parent=None, 
            name='AnchorsDemoFrame', 
            style = wx.DEFAULT_FRAME_STYLE | wx.CLIP_CHILDREN, pos=(261, 123)
            )

        self._init_utils()

        self.mainPanel = wx.Panel(
                            size=(320, 160), 
                            parent=self, 
                            id=ID_ANCHORSDEMOFRAMEMAINPANEL, 
                            name='panel1', 
                            style=wx.TAB_TRAVERSAL | wx.CLIP_CHILDREN
                            | wx.FULL_REPAINT_ON_RESIZE, 
                            pos=(0, 0)
                            )

        self.mainPanel.SetAutoLayout(True)  # 

        self.okButton = wx.Button(
                            label='OK', 
                            id=ID_ANCHORSDEMOFRAMEOKBUTTON, 
                            parent=self.mainPanel, 
                            name='btnOk', 
                            size=(72, 24), style=0, pos=(240, 128)
                            )

        self.okButton.SetConstraints(
            anchors.LayoutAnchors(self.okButton, False, False, True, True)
            )
        self.Bind( wx.EVT_BUTTON,  self.OnBtnOk, id=ID_ANCHORSDEMOFRAMEOKBUTTON )
            
        excelWrapper = MakeActiveXClass( excelControl.HandWriteCtrl )
        #print excelWrapper
        self.excelOcx = excelWrapper( self.mainPanel, -1, (8, 40), ( 304, 80 ) )
        self.excelOcx.SetConstraints(
            anchors.LayoutAnchors(self.excelOcx, True, True, True, True)
            )
        
        self.excelOcx.ShowToolBar = 2  # 不现显示工具栏
        self.excelOcx.ShowMenu = "0"   # 隐藏菜单
        #self.excelOcx.Compatible = False #Save Excel2007 must set false. Must befor self.excelOcx.FileType! 测试版的ocx才有此功能
        self.excelOcx.FileType = ".xls"  #operate excel fmt file.
        
        #print "self.excelOcx.Compatible", self.excelOcx.Compatible
        
        self.iExcelIndex = 0
        self.arrExcel = [ u"./Excel报告模版/钢筋拉伸试验.xls".encode( fe ), 
                          u"./Excel报告模版/钢筋焊接件拉伸试验.xls".encode( fe ), 
                          u"./Excel报告模版/混凝土抗压试验.xls".encode( fe ), 
                          u"./Excel报告模版/混凝土抗折试验.xls".encode( fe ), 
                          u"./Excel报告模版/砂浆抗压试验.xls".encode( fe ),
                          u"./Excel报告模版/水泥抗压试验.xls".encode( fe ),
                          u"./Excel报告模版/砖块抗压试验.xls".encode( fe ),
                          ]
        self.OpenExcelFile( self.arrExcel[ self.iExcelIndex ] ) #self.excelOcx.WebOpenLocalFile( self.arrExcel[ self.iExcelIndex ] )
        
        # print "self.excelOcx.WebObject:", self.excelOcx.WebObject
        # print "self.excelOcx.WebObject.Application:", self.excelOcx.WebObject.Application
        #self.excelOcx.WebObject.Application.ActiveSheet.Range("AX67").Value = "Value345" 
        self.okButton.Label = str( self.iExcelIndex )   

    def __init__( self ):
        self._init_ctrls( )
        
    def OpenExcelFile( self, strExcelFilePath ):
        self.excelOcx.WebClose() # Close First 
        self.excelOcx.WebOpenLocalFile( strExcelFilePath ) # then open
        #print strExcelFilePath

        app = self.excelOcx.WebObject.Application
        app.DisplayFormulaBar = False #公式
        app.CommandBars[ "Cell" ].Enabled = False           # 单元格
        app.ActiveWindow.DisplayHeadings            = False # 不显示:行头、列头
        app.ActiveWindow.DisplayHorizontalScrollBar = False # 水平滚动条
        app.ActiveWindow.DisplayVerticalScrollBar   = True  # 垂直滚动条
        app.ActiveWindow.DisplayWorkbookTabs        = False # 工作表标签Tab页
        app.ActiveWindow.DisplayGridlines           = False # 网格线
        app.ActiveSheet.Protect( None, True, True, True )  # 保护单元格
        
    def OnBtnOk( self, evt ):
        #r = self.excelOcx.WebSaveLocalFile( self.strExcelFile )
        #print "self.excelOcx.WebSaveLocalFile:", r
        
        self.iExcelIndex += 1
        self.iExcelIndex %= 5
        self.OpenExcelFile( self.arrExcel[ self.iExcelIndex ] )
        self.okButton.Label = str( self.iExcelIndex )         
        #self.excelOcx = None
        #self.Close()

if __name__=="__main__":
    app=wx.PySimpleApp()
    media1=MyFrame()
    media1.Show()
    app.MainLoop()
 </span>

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值