我正在使用旧的DsoFramer控件在我的表单中嵌入一个Excel实例。这在Excel 2000、2003和2007中运行良好。
然而,2010年我认为它的表现略有不同。我现在得到了一个关于宏的提示,然后它会阻塞我的UI,直到用户将焦点转移到后台的excel实例并单击ok。
我知道微软不再支持使用这个控件,但不幸的是,我们还不能取代它。所以我在寻找我们的方法来尝试禁用这个对话框。我试过用
枚举,但这似乎没有任何区别。如果我直接通过代码打开文件,那么它很好,不会提示,但是axFramer.open()调用总是使它提示。有人知道怎么解决这个问题吗?
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using Microsoft.Office.Interop.Excel;
using System.Diagnostics;
namespace WindowsFormsApplication1
{
public partial class Form1 : System.Windows.Forms.Form
{
private AxDSOFramer.AxFramerControl axFramer;
public Form1()
{
// Kill any Excel processes first so they don't interfere with our tests
KillExcelProcesses();
InitializeComponent();
try
{
CreateAndAddFramer();
string file = @"c:\temp\date_6490.xls";
// Create a new Excel Application. For the purpose of the test lets ensure it's visible too.
Application excelApp = new Application() { Visible = true, DisplayAlerts = false };
// Set the Excel security to Forcefully disable all macros.
excelApp.AutomationSecurity = Microsoft.Office.Core.MsoAutomationSecurity.msoAutomationSecurityForceDisable;
// Open the file. This is because it needs to be open before trying with the DsoFramer
// control. It also demonstrates that excel opens fine without prompting for any
// macro support.
Workbook selectedBook = excelApp.Workbooks.Open(file);
// Open the file in the framer. This will now prompt to enable macros.
axFramer.Open(file, true, null, null, null);
}
catch (Exception e)
{
System.Windows.Forms.MessageBox.Show(e.ToString());
KillExcelProcesses();
}
}
/// <summary>
/// Creates a DsoFramer and adds to the form.
/// </summary>
private void CreateAndAddFramer()
{
// Create an axFramer control
this.axFramer = new AxDSOFramer.AxFramerControl();
// Initialize the axFamer
((System.ComponentModel.ISupportInitialize)(this.axFramer)).BeginInit();
// Update the name of the framer (bug in framer)
this.axFramer.Name = "framer_" + Guid.NewGuid().ToString();
this.axFramer.ResetText();
// Dock the framer and add to the form
this.axFramer.Dock = System.Windows.Forms.DockStyle.Fill;
this.Controls.Add(axFramer);
((System.ComponentModel.ISupportInitialize)(this.axFramer)).EndInit();
}
/// <summary>
/// Kills all excel processes.
/// </summary>
private static void KillExcelProcesses()
{
// Kill all instances of Excel
foreach (Process p in Process.GetProcessesByName("excel"))
{
p.Kill();
}
}
}
}