【问题标题】:Creating Excel workbook in VB.Net panel在 VB.Net 面板中创建 Excel 工作簿
【发布时间】:2015-01-28 03:49:25
【问题描述】:

我的 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 不喜欢的事情,但我似乎无法弄清楚它是什么。

感谢您的帮助...

【问题讨论】:

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


    【解决方案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)") 
    

    【讨论】:

      【解决方案2】:

      在工作表声明后试试这个。它可能会起作用。

      oSheet.UNPROTECT

      【讨论】:

      • 不幸的是,这不起作用。工作表实际上并没有受到保护,它只是不会响应鼠标点击。感谢您的回复...
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-26
      相关资源
      最近更新 更多