Une option élégante consiste à écrire une méthode d'extension (voir ci-dessous) pour la classe DataTable du cadre .net.
Cette méthode d'extension peut être appelée comme suit :
using System;
using System.Collections.Generic;
using System.Linq;
using Excel = Microsoft.Office.Interop.Excel;
using System.Data;
using System.Data.OleDb;
DataTable dt;
// fill table data in dt here
...
// export DataTable to excel
// save excel file without ever making it visible if filepath is given
// don't save excel file, just make it visible if no filepath is given
dt.ExportToExcel(ExcelFilePath);
Méthode d'extension de la classe DataTable :
public static class My_DataTable_Extensions
{
// Export DataTable into an excel file with field names in the header line
// - Save excel file without ever making it visible if filepath is given
// - Don't save excel file, just make it visible if no filepath is given
public static void ExportToExcel(this DataTable tbl, string excelFilePath = null) {
try {
if (tbl == null || tbl.Columns.Count == 0)
throw new Exception("ExportToExcel: Null or empty input table!\n");
// load excel, and create a new workbook
var excelApp = new Excel.Application();
excelApp.Workbooks.Add();
// single worksheet
Excel._Worksheet workSheet = excelApp.ActiveSheet;
// column headings
for (var i = 0; i < tbl.Columns.Count; i++) {
workSheet.Cells[1, i + 1] = tbl.Columns[i].ColumnName;
}
// rows
for (var i = 0; i < tbl.Rows.Count; i++) {
// to do: format datetime values before printing
for (var j = 0; j < tbl.Columns.Count; j++) {
workSheet.Cells[i + 2, j + 1] = tbl.Rows[i][j];
}
}
// check file path
if (!string.IsNullOrEmpty(excelFilePath)) {
try {
workSheet.SaveAs(excelFilePath);
excelApp.Quit();
MessageBox.Show("Excel file saved!");
}
catch (Exception ex) {
throw new Exception("ExportToExcel: Excel file could not be saved! Check filepath.\n"
+ ex.Message);
}
} else { // no file path is given
excelApp.Visible = true;
}
}
catch (Exception ex) {
throw new Exception("ExportToExcel: \n" + ex.Message);
}
}
}
0 votes
La méthode la plus simple consiste à effectuer une boucle foreach imbriquée sur les éléments et les sous-éléments.
0 votes
REMARQUE : si vous essayez de transmettre des valeurs d'une table de données à un objet puis à Excel, vous devez également traiter les erreurs de type de données. Par exemple, les Guids tueront votre affectation avec une exception HRESULT : 0x800A03EC. Une solution pour éviter de tester les types de données est d'utiliser "ToString()" lorsque vous remplissez votre objet. Excel reconvertira les chiffres au format numérique de lui-même. FlashTrev a abordé le problème connexe des dates et heures.
0 votes
Je recommande la réponse à cette question : stackoverflow.com/a/536699/1367391