L'erreur s'est produite lors de l'exportation de données dans une vue de grille de données vers une feuille Excel:
erreur (ancien format ou bibliothèque de types non valide. (exception de HRESULT: 0x80028018 (TYPE_E_INVDATAREAD))))
sur cette ligne:
Microsoft.Office.Interop.Excel._Workbook workbook = app.Workbooks.Add(Type.Missing);
Comment puis-je résoudre ce problème?
Mon code complet:
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;
}
}
Considérer:
System.Threading.Thread.CurrentThread.CurrentCulture = oldCI;
Supprimez cette ligne ou passez sous la ligne qui ferme l'application Excel.
Ça marche pour moi.
La vraie raison est les paramètres régionaux configurés pour l'utilisateur qui lance le thread. Il est documenté comme un bug.
http://support.Microsoft.com/default.aspx?scid=kb;en-us;320369
Votre code fonctionne correctement sur Office 2007 + VS 2010. Quelles versions utilisez-vous? Peut-être que vous avez choisi une mauvaise version de la référence d'interopérabilité: Office 2007 = 12.0.0.0, Office 2010 = 14.0.0.0
Vous pouvez consulter http://support.Microsoft.com/default.aspx?scid=kb;en-us;320369 cela pourrait résoudre votre problème.
J'ai eu le même problème et je l'ai résolu:
Regarde ça:
Microsoft.Office.Interop.Excel ne fonctionne pas sur 64 bits
Vous devez taper cette ligne:
System.Threading.Thread.CurrentThread.CurrentCulture = oldCI;
Faites-le après avoir fermé votre application Excel; avant d'ajouter WorkBook, vous ne devez pas utiliser cette ligne.