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

# -*- 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 = "陆升鹏345"
        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()
 

时间: 2024-11-08 15:20:29

利用 Excel封装成OCX 在wxPython窗口中显示、操作的相关文章

VC实现A进程窗口嵌入到B进程窗口中显示的方法

这篇文章主要介绍了VC实现A进程窗口嵌入到B进程窗口中显示的方法,对于理解windows程序运行原理的进程问题有一定的帮助,需要的朋友可以参考下 本文通过一个Demo示例讲述把A应用程序嵌入到B应用程序中显示的方法. 主要代码如下: <span style="font-size:12px;font-weight: normal;">//在B应用启动时创建A进程 CreateProcess(_T("A.exe"),NULL,NULL,NULL,FALSE,

IDA 在string窗口中显示中文字符串

打开ida61\cfg中的ida.cfg文件找到 // (cp866 version)AsciiStringChars = "\r\n\a\v\b\t\x1B" " !\"#$%&'()*+,-./0123456789:;<=>?" "@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_" "`abcdefghijklmnopqrstuvwxyz{|}~" "€?‚ƒ„…†

Office 2010 中打开多个Excel文件只能在同一窗口中显示的问题

安装Microsoft Office 2010 的朋友们可能会发现,当你打开多个Excel文件时,想要将几个文件对比参考时,发现无法将几个窗口并排放置,几个Excel文件是共享一个窗口的. 通过上网寻求帮助,找到了一种方法,可以使多个Excel文件在多个独立的窗口中打开. 注: 此方法在Windows 7及Windows XP下均测试有效. Start: 打开"运行"窗口(快捷键:Win + R),输入regedit编辑注册表. 定位到[HKEY_CLASSES_ROOT\Excel.

在窗口中显示类信息

import java.lang.reflect.Field; import javax.swing.JFrame; import javax.swing.BorderFactory; import java.awt.event.ActionListener; import java.awt.event.ActionEvent; import javax.swing.JTextField; import javax.swing.JButton; import javax.swing.JLabel

统计图钻取的明细报表在非模态窗口中显示

润乾报表的统计图可以在图例 / 图形上设置超链接,从而实现钻取到明细报表的操作,钻取得到的报表可以在新窗口或者当前窗口中打开.关于如何在统计图的图形 / 图例上设置超链接,在用户手册中有常用示例的介绍.今天小编要给大家介绍的是如何在非模态窗口中打开图形超链接钻取得到的报表.首先创建一张带有统计图的报表,报表文件名为 planWorkView2.rpx.增加数据集 ds1, 下面是 ds1 的数据: 在 A2 单元格中增加一个柱形图,统计图的分类和系列值数据分别来源于数据集 ds1 的 ORG_N

如何在DOS窗口中显示UTF-8字符

在中文Windows系统中,如果一个文本文件是UTF-8编码的,那么在CMD.exe命令行窗口(所谓的DOS窗口)中不能正确显示文件中的内容.在默认情况下,命令行窗口中使用的代码页是中文或者美国的,即编码是中文字符集或者西文字符集. 如果想正确显示UTF-8字符,可以按照以下步骤操作: 1.打开CMD.exe命令行窗口 2.通过 chcp命令改变代码页,UTF-8的代码页为65001 chcp 65001 执行该操作后,代码页就被变成UTF-8了.但是,在窗口中仍旧不能正确显示UTF-8字符.

windows dos命令下DOS窗口中显示UTF-8字符

在中文Windows系统中,如果一个文本文件是UTF-8编码的,那么在CMD.exe命令行窗口(所谓的DOS窗口)中不能正确显示文件中的内容.在默认情况下,命令行窗口中使用的代码页是中文或者美国的,即编码是中文字符集或者西文字符集. 如果想正确显示UTF-8字符,可以按照以下步骤操作: 1.打开CMD.exe命令行窗口 2.通过 chcp命令改变代码页,UTF-8的代码页为65001 chcp 65001 执行该操作后,代码页就被变成UTF-8了.但是,在窗口中仍旧不能正确显示UTF-8字符.

TxQueryRunner类对结果集封装成bean、map及object的操作

一.需要的jar包: itcast-tools-1.4.jar     http://pan.baidu.com/s/1Dbo2i commons-beanutils-1.8.3.jar    http://pan.baidu.com/s/1Dbo2i commons-logging-1.1.1.jar  http://pan.baidu.com/s/1c0yefK0 mysql-connector-java-5.1.28-bin.jar    http://pan.baidu.com/s/1e

(转)SDL2.0在mfc窗口中显示yuv的一种方法

DWORD ThreadFun() {    //用mfc窗口句柄创建一个sdl window    SDL_Window * pWindow = SDL_CreateWindowFrom( (void *)( GetDlgItem(IDC_STATIC1)->GetSafeHwnd() ) ); SDL_Rect sdlRT;    sdlRT.h = 288;    sdlRT.w = 352;    sdlRT.x = 0;    sdlRT.y = 0; SDL_Rect dstRT;