旧格式或无效的types库。 (从HRESULTexception:0x80028018(TYPE_E_INVDATAREAD))

将数据网格视图中的数据导出到Excel工作表时出现错误:

错误(旧格式或无效types库(从HRESULTexception:0x80028018(TYPE_E_INVDATAREAD)))

在这一行上:

Microsoft.Office.Interop.Excel._Workbook workbook = app.Workbooks.Add(Type.Missing); 

我该如何解决这个问题?

我的完整代码:

 private void button1_Click(object sender, EventArgs e) { System.Globalization.CultureInfo oldCI = System.Threading.Thread.CurrentThread.CurrentCulture; System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("en-US"); // Creating Excel Application Microsoft.Office.Interop.Excel._Application app = new Microsoft.Office.Interop.Excel.Application(); System.Threading.Thread.CurrentThread.CurrentCulture = oldCI; // Creating new WorkBook within Excel application Microsoft.Office.Interop.Excel._Workbook workbook = app.Workbooks.Add(Type.Missing); // Creating new Excel sheet in workbook Microsoft.Office.Interop.Excel._Worksheet worksheet = null; // See the Excel sheet behind the program //Funny app.Visible = true; // Get the reference of first sheet. By default its name is Sheet1. // Store its reference to worksheet try { // Fixed:(Microsoft.Office.Interop.Excel.Worksheet) worksheet = (Microsoft.Office.Interop.Excel.Worksheet)workbook.Sheets["Sheet1"]; worksheet = (Microsoft.Office.Interop.Excel.Worksheet)workbook.ActiveSheet; // Changing the name of active sheet worksheet.Name = "Exported from Ketoan"; // Storing header part in Excel for (int i = 1; i < DGData.Columns.Count + 1; i++) { worksheet.Cells[1, i] = DGData.Columns[i - 1].HeaderText; } // Storing each row and column value to Excel sheet for (int i = 0; i < DGData.Rows.Count - 1; i++) { for (int j = 0; j < DGData.Columns.Count; j++) { worksheet.Cells[i + 2, j + 1] = DGData.Rows[i].Cells[j].Value.ToString(); } } // Save the application string fileName = String.Empty; SaveFileDialog saveFileExcel = new SaveFileDialog(); saveFileExcel.Filter = "Excel files |*.xls|All files (*.*)|*.*"; saveFileExcel.FilterIndex = 2; saveFileExcel.RestoreDirectory = true; if (saveFileExcel.ShowDialog() == DialogResult.OK) { fileName = saveFileExcel.FileName; //Fixed-old code: 11 para->add 1:Type.Missing workbook.SaveAs(fileName, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Microsoft.Office.Interop.Excel.XlSaveAsAccessMode.xlExclusive, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing); } else return; // Exit from the application //app.Quit(); } catch (System.Exception ex) { } finally { app.Quit(); workbook = null; app = null; } } 

您的代码在Office 2007 + VS 2010上正常工作。您使用的是哪个版本? Mayby您select了错误的互操作版本:Office 2007 = 12.0.0.0,Office 2010 = 14.0.0.0

你可以看看http://support.microsoft.com/default.aspx?scid=kb;en-us;320369它可以解决你的问题&#x3002;

考虑:

 System.Threading.Thread.CurrentThread.CurrentCulture = oldCI; 

删除此行或移到closuresExcel应用程序的行下。

这个对我有用。

真正的原因是为启动线程的用户configuration的区域设置。 它被logging为一个错误。

http://support.microsoft.com/default.aspx?scid=kb;en-us;320369

我有同样的问题,我解决了它:
看这个:
Microsoft.Office.Interop.Excel不能在64位上工作

你应该input这一行:

 System.Threading.Thread.CurrentThread.CurrentCulture = oldCI; 

在closuresExcel应用程序后执行此操作; 在添加WorkBook之前,您不应该使用这一行。