使用Interop将DataGridView导出到Excel会导致Outlook 2010崩溃

时间:2015-07-22 22:14:17

标签: winforms c#-4.0 datagridview excel-interop

我有一个带有DataGridViews的Windows窗体应用程序,在其中两个网格上我有一个导出按钮,允许用户将网格中的数据导出到excel文件。

导出似乎工作正常,EXCEL.EXE进程在事件执行后正确结束,并且创建的excel文件是完美的。但在将我的一个datagridviews导出为ex​​cel后,如果我尝试在Outlook 2010中发送新电子邮件或回复电子邮件,Outlook将停止工作。

经过几次尝试后,我发现“Outlook遇到了'microsoft outlook社交连接器'加载项出现严重问题...”错误 enter image description here

我很肯定这是我的应用程序中的导出功能导致这种情况,因为Outlook导出正常直到我导出,如果我尝试发送电子邮件它会立即崩溃。我可以随意复制这个,我也在其他工作站上复制了这个结果。

My Outlook和其他经历过此操作的工作站的Outlook都有自定义加载项。此加载项使用以下命名空间:

using Office = Microsoft.Office.Core;
using RibbonStuff = Microsoft.Office.Tools.Ribbon;
using Outlook = Microsoft.Office.Interop.Outlook;

以下是我的导出活动中的代码。

using Excel = Microsoft.Office.Interop.Excel;

private void exportUpdateGridToExcel()
{
    Excel.Application xlApp = null;
    Excel.Workbook xlBook = null;
    Excel.Worksheet xlSheet = null;
    try
    {
        SaveFileDialog sfd = new SaveFileDialog();
        sfd.Filter = "Excel Documents (*.xls)|*.xls";
        sfd.FileName = "Inventory_Adjustment_Export.xls";
        if (sfd.ShowDialog() == DialogResult.OK)
        {
            // Copy DataGridView results to clipboard
            copyAlltoClipboard(dgvItems);

            object misValue = System.Reflection.Missing.Value;
            xlApp = new Excel.Application();

            xlApp.DisplayAlerts = false; // Without this you will get two confirm overwrite prompts
            xlBook = xlApp.Workbooks.Add(misValue);
            xlSheet = (Excel.Worksheet)xlBook.Worksheets.get_Item(1);

            // Format column D as text
            Excel.Range rng = xlSheet.get_Range("D:D").Cells;
            rng.NumberFormat = "@";

            // Paste clipboard results to worksheet range
            Excel.Range CR = (Excel.Range)xlSheet.Cells[1, 1];
            CR.Select();
            xlSheet.PasteSpecial(CR, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, true);

            // Delete blank row header column and select cell A1
            Excel.Range delRng = xlSheet.get_Range("A:A").Cells;
            delRng.Delete(Type.Missing);
            xlSheet.get_Range("A1").Select();

            // Save excel file and capture the location from the SaveFileDialog
            xlBook.SaveAs(sfd.FileName, Excel.XlFileFormat.xlWorkbookNormal, misValue, misValue, misValue, misValue, Excel.XlSaveAsAccessMode.xlExclusive, misValue, misValue, misValue, misValue, misValue);

            // Clear Clipboard and select "Item" cell
            Clipboard.Clear();
            dgvItems.ClearSelection();
        }
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.ToString());
    }
    finally
    {
        xlBook.Close(false);
        xlApp.Quit();
    }
}

private void copyAlltoClipboard(DataGridView dv)
{
    dv.SelectAll();
    DataObject dataObj = dv.GetClipboardContent();
    if (dataObj != null)
        Clipboard.SetDataObject(dataObj);
}

0 个答案:

没有答案