Export DataTable Win Form vers Excel 2003
Bonjour,
je sais, c'est un sujet plus de mille fois abordé, mais je bute alors je sollicite votre aide.
OBJET : Exporter un datatable d'un winform (windows form) avec ses entêtes de colonnes vers EXCEL.
Langage : C#
IDe : VS 2005
Problème : entre toutes les références , entre les export xml et xls classic , enter les codes pour asp.net et pour les autres projets, je me mélange les "crayons".
Les références que j'ai essayées :
- Microsoft.Office.Tools.Excel
- Microsoft.Office.Core
- Microsoft.Visualstudio.Tools.Applications.Runtime
plus
- using System.Data.oleDb;
- using System.IO;......
Pour l'heure je récupère un DataTable (que j'exporte déjà en pdf) et je voudrais le plus simplement du monde l'exporter vers un fichier Excel que je crée pour l'occasion.
Quelques soit la piste suivie (références...), j'ai buté sur quelque chose.
J'aime même vu que je ne pouvais faire référence à un index de colonne pour parcourir les colonne d'un DataTable ! C'est étonnant !
Alors que c'est possible pour les DataSet ou DataRow[].
Bref, si quelqu'un a une solution en C# toute simple pour, depuis mon appli Windows, créer un fichier Excel et l'alimenter, je serai ravi.
Merci d'avance
David
précision sur ma question
RE bonjour,
J'ai l'impression qu'avec OleDb on devrait s'en sortir mais je n'aiaps réussi.
Autrement, j'espère qu'on doit y arriver avec Microsoft.Office.Tools.Excel. sinon à quoi cela sert cette biblio.
Sur la toile, je trouve pas mal de code avec des "Excel.Application" mais moi impossible de trouver la référence qu'il faut pour cela.
A +
c# DataTable Excel export import
Bonjour,
Merci à vous pour vos réponses.
J'ai une bonne nouvelle, j'ai trouvé des solutions efficaces.
Avant de les implémenter, il faut ajouter la référence COM : "Microsoft Excel 12.0 Object Library".
1ère Solution Elle est assez claire et facile
Source : http://msmvps.com/blogs/deborahk/arc...-to-excel.aspx
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68
|
In C#:
using Excel = Microsoft.Office.Interop.Excel;
using System.Reflection;
Excel.Application oXL;
Excel.Workbook oWB;
Excel.Worksheet oSheet;
Excel.Range oRange;
// Start Excel and get Application object.
oXL = new Excel.Application();
// Set some properties
oXL.Visible = true;
oXL.DisplayAlerts = false;
// Get a new workbook.
oWB = oXL.Workbooks.Add(Missing.Value);
// Get the active sheet
oSheet = (Excel.Worksheet)oWB.ActiveSheet ;
oSheet.Name = "Customers";
// Process the DataTable
// BE SURE TO CHANGE THIS LINE TO USE *YOUR* DATATABLE
DataTable dt = Customers.RetrieveAsDataTable();
int rowCount = 1;
foreach (DataRow dr in dt.Rows)
{
rowCount += 1;
for (int i = 1; i < dt.Columns.Count+1; i++)
{
// Add the header the first time through
if (rowCount==2)
{
oSheet.Cells[1, i] = dt.Columns[i - 1].ColumnName;
}
oSheet.Cells[rowCount, i] = dr[i - 1].ToString();
}
}
// Resize the columns
oRange = oSheet.get_Range(oSheet.Cells[1, 1],
oSheet.Cells[rowCount, dt.Columns.Count]);
oRange.EntireColumn.AutoFit();
// Save the sheet and close
oSheet = null;
oRange = null;
oWB.SaveAs("test.xls", Excel.XlFileFormat.xlWorkbookNormal,
Missing.Value, Missing.Value, Missing.Value, Missing.Value,
Excel.XlSaveAsAccessMode.xlExclusive,
Missing.Value, Missing.Value, Missing.Value,
Missing.Value, Missing.Value);
oWB.Close(Missing.Value, Missing.Value, Missing.Value);
oWB = null;
oXL.Quit();
// Clean up
// NOTE: When in release mode, this does the trick
GC.WaitForPendingFinalizers();
GC.Collect();
GC.WaitForPendingFinalizers();
GC.Collect(); |
2ème Solution Plus courte, épurée, mais j'ai choisi la 1ère.
Le copier/coller est sale.
Source : http://www.daniweb.com/forums/thread213015.html
Code:
1 2 3
|
// Create an Excel object and add workbook... Excel.ApplicationClass excel = new Excel.ApplicationClass(); Excel.Workbook workbook = excel.Application.Workbooks.Add(true); // true for object template??? // Add column headings... int iCol = 0; foreach (DataColumn c in dt.Columns) { iCol++; excel.Cells[1, iCol] = c.ColumnName; } // for each row of data... int iRow = 0; foreach (DataRow r in dt.Rows) { iRow++; // add each row's cell data... iCol = 0; foreach (DataColumn c in dt.Columns) { iCol++; excel.Cells[iRow + 1, iCol] = r[c.ColumnName]; } } // Global missing reference for objects we are not defining... object missing = System.Reflection.Missing.Value; // If wanting to Save the workbook... workbook.SaveAs("MyExcelWorkBook.xls", Excel.XlFileFormat.xlXMLSpreadsheet, missing, missing, false, false, Excel.XlSaveAsAccessMode.xlNoChange, missing, missing, missing, missing, missing); // If wanting to make Excel visible and activate the worksheet... excel.Visible = true; Excel.Worksheet worksheet = (Excel.Worksheet)excel.ActiveSheet; ((Excel._Worksheet)worksheet).Activate(); // If wanting excel to shutdown... ((Excel._Application)excel).Quit(); |
A plus les amis.
méthode avec ou sans instanciation de Excel
RE bonjour,
en fait ma solution instancie Excel, ce qui est plus lourd que de ne pas l'instancier.
J'aurai bien utilisé une méthode plus légère mais j'en ai pas trouvée de propre.
Donc voilà. Mais si vous en avez une sans instancier Excel, j'aimerai bien que vous la notiez dans ce poste.
Merci et à la prochaine.
David
pbesoin deplus de précisions
D'accord Olibara,
bien,
mais peux-tu me donner le code ou la ligne pour
Citation:
Tu sauve le nom des colones et le contenu des cellulles en text tab délimité
Tu nomme ton fichier machin.xls
Merci.
David