我有一个带有DataGridViews的Windows窗体应用程序,在其中两个网格上我有一个导出按钮,允许用户将网格中的数据导出到excel文件。
导出似乎工作正常,EXCEL.EXE进程在事件执行后正确结束,并且创建的excel文件是完美的。但在将我的一个datagridviews导出为excel后,如果我尝试在Outlook 2010中发送新电子邮件或回复电子邮件,Outlook将停止工作。
经过几次尝试后,我发现“Outlook遇到了'microsoft outlook社交连接器'加载项出现严重问题...”错误
我很肯定这是我的应用程序中的导出功能导致这种情况,因为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);
}