关于silverlight DataGrid导出Excel
代码是从网上找的,网上有关datagrid导出excel的文章有很多,估计大家都很熟悉,
代码运行到下面这句时出了异常:
dynamic excel = AutomationFactory.CreateObject("Excel.Application");
异常如下:
用户代码未处理 System.NotSupportedException
Message=此操作在当前上下文中不受支持。
StackTrace:
位于 MS.Internal.Error.MarshalXresultAsException(UInt32 hr, COMExceptionBehavior comExceptionBehavior)
位于 MS.Internal.XcpImports.CheckHResult(UInt32 hr)
位于 MS.Internal.ComAutomation.ComAutomationNative.CreateObject(String progID, IntPtr& nativeObject)
位于 MS.Internal.ComAutomation.ComAutomationServices.CreateObject(String progID, ComAutomationParamWrapService paramWrapService)
位于 System.Runtime.InteropServices.Automation.AutomationFactory.CreateObject(String progID)
位于 ExportToExcelTools.ExportManager.ExportToExcel(Object[,] data)
位于 ExportToExcelTools.DataGridExcelTools.StartExport(Object data)
位于 System.Threading.ThreadHelper.ThreadStart_Context(Object state)
位于 System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx)
位于 System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
位于 System.Threading.ThreadHelper.ThreadStart(Object obj)
InnerException:
[解决办法]
这个只能在浏览器外运行(Out Of Browser , OOB),并且要提升权限。
并且,在后续的代码中一般都会使用到 Excel 的属性或方法,这就要求使用 DLR ,
要添加 Microsoft.CSharp.dll 这个程序集的引用
下面的例子在 OOB 的环境下创建一个 Word 文档
dynamic word;private void btnRunWord_Click(object sender, RoutedEventArgs e){ if (!App.Current.HasElevatedPermissions) { return; } bool hasInitialed = false; try { try { // 尝试获取进程 word = System.Runtime.InteropServices.Automation.AutomationFactory.GetObject("Word.Application"); hasInitialed = true; } catch (Exception) { // 进程不存在,新创建进程 word = System.Runtime.InteropServices.Automation.AutomationFactory.CreateObject("Word.Application"); hasInitialed = true; } if (hasInitialed) { // 要使用 DLR ,就要添加 Microsoft.CSharp 这个命名空间的引用 string myDocuments = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments); string path = System.IO.Path.Combine(myDocuments, this.textBox1.Text); if (System.IO.File.Exists(path)) { word.Documents.Open(path); } else { // 新建空文档 word.Documents.Add(); } word.ActiveWindow.WindowState = 1; //word.Selection.Paste(); //word.Quit(); } } catch (Exception ex) { MessageBox.Show(ex.ToString()); }}