在VB.Net面板中创buildExcel工作簿

我有一个VB.Net应用程序在我的窗体上的面板中打开Excel的问题。 我在.Net上是一个初学者,所以这个问题可能很简单,虽然我做了很多search,没有find解决办法。

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

我的表单有两个button。 其中一个button打开一个现有的电子表格,另一个创build一个新的电子表格并添加一些格式。 在Win7 / Excel2013机器上运行应用程序时,我遇到了创build新电子表格的问题(顺便说一句,加载现有的电子表格工作正常,没有问题)。 代码将打开一个新的电子表格,将其embedded到面板中,然后完成格式化。 当这样做完成后,我无法更改电子表格中的单元格。 这几乎就好像被完全locking了一样。

在逐步执行代码时,我可以看到,当代码行设置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,没有任何问题。 这是我加载现有的configuration时,它做到了这一点,这工作正常…

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

谢谢你的帮助…

对于任何遇到问题embedded自定义控制/面板/窗体等问题2013/16我有一个问题,只有当embedded,电子表格无法保持焦点,所以防止编辑/打字。

在我的例子中,修复是删除我的线

 xlsApp.WindowState=XlWindowState.xlMaximized 

这是我最大化面板/用户控制内的地方 – (我现在只是使用MOVEWINDOWresize)

下面的链接中的简单示例工作,并指出我的代码中的问题。

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

基本上我只是不断评论我的代码,直到它的工作。

希望这有助于某人。

编辑

closures色带,同时embedded带来的问题(在embedded之前closures它工作正常) – 所以还有其他的东西,仍然会导致这个更好地testing它完全。

我的丝带closures代码是

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

在表单声明之后试试这个。 它可能工作。

oSheet.UNPROTECT