C# I';我无法将datagridview传输到Excel

C# I';我无法将datagridview传输到Excel,c#,winforms,C#,Winforms,我在下面的datagridview中出现错误的原因是什么 System.InvalidCastException:无法将类型为“Microsoft.Office.Interop.Excel.ApplicationClass”的COM对象分配给接口类型“Microsoft.Office.Interop.Excel.\u应用程序”。此操作失败,因为具有IID“{000208D5-0000-0000-C000-0000000000 46}”的接口的COM组件中的QueryInterface调用失败,并

我在下面的datagridview中出现错误的原因是什么

System.InvalidCastException:无法将类型为“Microsoft.Office.Interop.Excel.ApplicationClass”的COM对象分配给接口类型“Microsoft.Office.Interop.Excel.\u应用程序”。此操作失败,因为具有IID“{000208D5-0000-0000-C000-0000000000 46}”的接口的COM组件中的QueryInterface调用失败,并出现以下错误:加载类型库/DLL时出错。(返回的HRESULT异常:0x80029C4A(类型_E_CANTLOADLIBRARY))。'

我写的代码是:

saveFileDialog.InitialDirectory = "C:";
saveFileDialog.Title = "Save as Excel File";
saveFileDialog.FileName = "Data";
saveFileDialog.Filter = "Excel Files(2003)|*.xls|Excel Files(2007)|*.xlsx";

if (saveFileDialog.ShowDialog() != DialogResult.Cancel)
{
    Microsoft.Office.Interop.Excel.Application excelApp = new Microsoft.Office.Interop.Excel.Application();
    excelApp.Application.Workbooks.Add(Type.Missing);

    excelApp.Columns.ColumnWidth = 20;

    for (int i = 1; i < dgwReport.Columns.Count + 1; i++)
    {
        excelApp.Cells[1, i] = dgwReport.Columns[i - 1].HeaderText;
    }

    for (int i = 0; i < dgwReport.Rows.Count; i++)
    {
        for (int j = 0; j < dgwReport.Columns.Count; j++)
        {
            excelApp.Cells[i + 2, j + 1] = dgwReport.Rows[i].Cells[j].Value;
        }
    }

    excelApp.ActiveWorkbook.SaveCopyAs(saveFileDialog.FileName.ToString());
    excelApp.ActiveWorkbook.Saved = true;
    excelApp.Quit();
}
saveFileDialog.InitialDirectory=“C:”;
saveFileDialog.Title=“另存为Excel文件”;
saveFileDialog.FileName=“数据”;
saveFileDialog.Filter=“Excel文件(2003)|*.xls | Excel文件(2007)|*.xlsx”;
如果(saveFileDialog.ShowDialog()!=DialogResult.Cancel)
{
Microsoft.Office.Interop.Excel.Application excelApp=新的Microsoft.Office.Interop.Excel.Application();
excelApp.Application.Workbooks.Add(Type.Missing);
excelApp.Columns.ColumnWidth=20;
对于(int i=1;i
使用发布的代码,我没有得到您描述的错误

excelApp.Application.Workbooks.Add(Type.Missing);
这在创建新工作簿时看起来是正确的。但是,在将数据写入工作簿时,似乎存在问题。问题是代码正在将数据写入
excelApp
,这是不正确的。
excelApp
可以打开多个工作簿,每个工作簿可以有多个“工作表”。您需要指定要写入的“位置”(哪个工作簿中的哪个工作表)

由于要创建新工作簿,您需要“添加”新工作表并写入该工作表,而不是
excelApp。

我测试了下面的代码,它将数据正确地写入新工作簿中的新工作表中

saveFileDialog.InitialDirectory = "C:";
saveFileDialog.Title = "Save as Excel File";
saveFileDialog.FileName = "Data";
saveFileDialog.Filter = "Excel Files(2003)|*.xls|Excel Files(2007)|*.xlsx";

Microsoft.Office.Interop.Excel.Application excelApp = null;
Microsoft.Office.Interop.Excel.Workbook workbook = null;
Microsoft.Office.Interop.Excel.Worksheet worksheet = null;

try {
   if (saveFileDialog.ShowDialog() != DialogResult.Cancel) {
    excelApp = new Microsoft.Office.Interop.Excel.Application();
    workbook = excelApp.Application.Workbooks.Add(Type.Missing);
    worksheet = workbook.ActiveSheet;
    excelApp.Columns.ColumnWidth = 20;
    for (int i = 1; i < dgwReport.Columns.Count + 1; i++) {
      worksheet.Cells[1, i] = dgwReport.Columns[i - 1].HeaderText;
    }
    for (int i = 0; i < dgwReport.Rows.Count; i++) {
      for (int j = 0; j < dgwReport.Columns.Count; j++) {
        worksheet.Cells[i + 2, j + 1] = dgwReport.Rows[i].Cells[j].Value;
      }
    }
    excelApp.ActiveWorkbook.SaveCopyAs(saveFileDialog.FileName.ToString());
    excelApp.ActiveWorkbook.Saved = true;
    workbook.Close();
    excelApp.Quit();
  }
}
catch (Exception ex) {
  MessageBox.Show("Excel write error: " + ex.Message);
}
finally {
  // release the excel objects to prevent leaking the unused resource
  if (worksheet != null)
    Marshal.ReleaseComObject(worksheet);
  if (workbook != null)
    Marshal.ReleaseComObject(workbook);
  if (excelApp != null)
    Marshal.ReleaseComObject(excelApp);
}
saveFileDialog.InitialDirectory=“C:”;
saveFileDialog.Title=“另存为Excel文件”;
saveFileDialog.FileName=“数据”;
saveFileDialog.Filter=“Excel文件(2003)|*.xls | Excel文件(2007)|*.xlsx”;
Microsoft.Office.Interop.Excel.Application excelApp=null;
Microsoft.Office.Interop.Excel.Workbook工作簿=空;
Microsoft.Office.Interop.Excel.Worksheet工作表=空;
试一试{
如果(saveFileDialog.ShowDialog()!=DialogResult.Cancel){
excelApp=新的Microsoft.Office.Interop.Excel.Application();
工作簿=excelApp.Application.Workbooks.Add(Type.Missing);
工作表=工作簿.ActiveSheet;
excelApp.Columns.ColumnWidth=20;
对于(int i=1;i
哪一行引发异常?是否安装了Excel?是的,安装了Excel。语音错误接收行错误接收行;excelApp.Application.Workbooks.Add(Type.Missing);我无法修复此错误我不是Excel interop的专家,但正在将
类型传递给
工作簿。缺少
。Add()
看起来不起作用。是的,此代码已在其他应用程序中使用,但应能正常工作。我不明白问题出在哪里:(非常感谢。我测试了代码。但我再次遇到了相同的错误。引用中也安装了Microsoft.Excel.Interop.Excel。我不明白问题出在哪里。:(但是,从您的评论中,我在这里找到了稻草…“此代码已经在其他应用程序中使用过”…让我怀疑Excel库(在代码中)是否存在问题)匹配目标计算机。例如,如果从另一台使用“其他”版本Excel库的计算机获取代码,可能会导致此错误。我认为“任何”互操作命令在这一点上会失败,但是,我知道如果您使用MS Excel 14.0对象库的代码并在使用MS Excel 12.0对象库的计算机上运行它,那么您可能会遇到一些兼容性问题。幸运的是,您应该能够简单地“转储”更新当前版本并重新添加针对本地计算机的Excel引用。即…右键单击项目“引用”然后删除Excel库,然后重新添加它。这至少可以确保代码库引用与该计算机上使用的代码库引用相同。如果这不起作用,那么如果当前计算机在某个较早的时间有一个“later”,则还有另一种可能那么,我的理解是,一个注册表项可能与以前的版本存在差异,需要删除该项。请选中此项,然后回答…关于使用互操作对象的另一点。在当前代码中,您会注意到,即使我们关闭工作簿并退出
excelApp
…将保留“com”对象。您可以