在VB.Net面板中创建Excel工作簿

时间:2015-01-28 03:49:26

标签: vb.net excel excel-interop excel-2013

我遇到了一个VB.Net应用程序的问题,该应用程序在我的表单上的面板中打开Excel。我有点像.Net的初学者,所以这个问题可能很简单,虽然我已经做了很多搜索而没有找到解决方案。

在XP / Excel 2010计算机上运行应用程序时,一切正常。当我在Win7 / Excel 2013机器上运行它时,我遇到了这个问题。我使用的是Microsoft Excel 15.0对象库,所以我认为这应该对Excel 2013有用。

我的表单有两个按钮。其中一个按钮可打开现有电子表格,另一个按钮可创建新电子表格并添加一些格式。在Win7 / Excel2013计算机上运行应用程序时,我遇到了创建新电子表格的问题(顺便说一下,加载现有的电子表格没有问题)。代码将打开一个新的电子表格,将其嵌入面板中,并完成格式化。完成后,我无法更改电子表格中的单元格。它几乎就像被完全锁定一样。

当单步执行代码时,我可以看出当代码行设置oSheet的值时会出现这种行为。这是我的代码,在删除了许多不适用于这个问题的东西之后。

Imports Microsoft.Office.Interop
Imports Microsoft.Office.Interop.Excel
Imports Microsoft.Office
Imports Microsoft.Office.Core

Dim oExcel As New Excel.Application
Dim oWB As Excel.Workbook
Dim WithEvents oSheet As Excel.Worksheet


Private Sub btnNewConfig_Click(sender As Object, e As EventArgs) Handles btnNewConfig.Click

    'This routine will create a new configuration file.
    oExcel.DisplayAlerts = False

    oExcel.Workbooks.Add()

    oExcel.Application.WindowState = Excel.XlWindowState.xlMaximized
    oExcel.Visible = True

    'Maximize the Excel window within the panel
    SetParent(oExcel.Hwnd, pnlExcel.Handle)
    SendMessage(oExcel.Hwnd, WM_SYSCOMMAND, SC_MAXIMIZE, 0)

    boolFormatExcel = True

    oWB = oExcel.ActiveWorkbook
    oSheet = oWB.Worksheets("Sheet1")

    oSheet.Range("A1").Value = "Address"
    oSheet.Range("A1").ColumnWidth = 14

    oSheet.Range("B1").Value = "Description"
    oSheet.Range("B1").ColumnWidth = 35

    ........

对我来说很奇怪的是,当我打开现有的电子表格时,它仍然以相同的方式设置oWB和oSheet,没有任何问题。这是我在加载现有配置时的方法,这可以正常工作......

Private Sub btnLoadConfig_Click(sender As Object, e As EventArgs) Handles btnLoadConfig.Click

    'This routine will prompt for a configuration file and load it into the form.
    'sExcelFileName = oExcel.GetOpenFilename(FileFilter:="Excel Files,*.xlsx")

    dlgOpenFile.Title = "Open a Configuration File"
    dlgOpenFile.Filter = "Excel Files|*.xlsx"
    dlgOpenFile.FileName = ""
    Dim DidWork As Integer = dlgOpenFile.ShowDialog()

    sExcelFileName = dlgOpenFile.FileName

    If DidWork <> DialogResult.Cancel Then
        oExcel.DisplayAlerts = False
        oExcel.Workbooks.Open(sExcelFileName)
        oWB = oExcel.ActiveWorkbook
        oSheet = oWB.Worksheets("Sheet1")

        'Check if a valid configuration file is selected.  If so, load it.  If not, pop up a message to user.
        If oSheet.Cells(1, 1).Value = "Address" Then
            oExcel.Application.WindowState = Excel.XlWindowState.xlMaximized
            oExcel.Visible = True

            'Maximize the Excel window
            SetParent(oExcel.Hwnd, pnlExcel.Handle)
            SendMessage(oExcel.Hwnd, WM_SYSCOMMAND, SC_MAXIMIZE, 0)

..............

所以,在我看来,我正在做一些Excel 2013不喜欢的东西,但我似乎无法弄清楚它是什么。

感谢您的帮助......

2 个答案:

答案 0 :(得分:1)

对于遇到在自定义控件/面板/表单等中嵌入excel 2013/2016的问题,我遇到了一个问题,只有在嵌入时,电子表格才能保持焦点,从而阻止编辑/输入。

在我的实例中,解决方法是删除我的行

xlsApp.WindowState=XlWindowState.xlMaximized

这是我在面板/用户控件中最大化它的位置 - (我现在只在调整大小时使用MOVEWINDOW)

以下链接中的简单示例有效,因此我的代码中出现了问题。

https://social.msdn.microsoft.com/Forums/sqlserver/en-US/85d0972f-9655-48fc-ac5d-0ac7f9acc8b7/problem-with-setparent-api-in-excel-2013?forum=winforms

基本上我一直在评论我的代码,直到它工作。

希望这有助于某人。

修改

关闭色带,而嵌入式带来了问题(在嵌入工作之前将其关闭工作正常) - 所以还有其他的东西仍然可以让它更好地完全测试。

我的功能区关闭代码是

xlsApp.ExecuteExcel4Macro("SHOW.TOOLBAR(""Ribbon"",False)") 

答案 1 :(得分:0)

在表单声明后尝试此操作。它可能会奏效。

oSheet.UNPROTECT