Ajout de données à un fichier Excel à l'aide de C#
Je suis assez nouveau avec C# et je suis en train d'exporter des données à partir d'un DataGridView en C# dans un fichier Excel. Les apports de la datagridview sont remplis par l'utilisateur.
Actuellement, mon programme peut créer un fichier excel avec les valeurs de la datagridview avec la date donnée, comme son nom de fichier.
Mon problème est que je n'arrive pas à trouver un moyen d'ajouter les données de la gridview SI le fichier existe déjà, il remplace l'actuel fichier excel à la place.
Toute aide/conseils/suggestions est très apprécié.
Merci 🙂
Voici mon code:
Microsoft.Office.Interop.Excel.Application xlApp;
Microsoft.Office.Interop.Excel.Workbook xlWorkBook;
Microsoft.Office.Interop.Excel.Worksheet xlWorkSheet;
Microsoft.Office.Interop.Excel.Sheets xlBigSheet;
Microsoft.Office.Interop.Excel.Sheets xlSheet;
object misValue;
String newPath;
private void buttonOK_Click(object sender, EventArgs e)
{
createXLSfile();
}
private void createXLSfile(){
String cDate = datePicker.Value.ToShortDateString();
String cMonth = datePicker.Value.ToString("MMMM");
String cYear = datePicker.Value.ToString("yy");
String cDay = datePicker.Value.ToString("dd");
String fName = cDay + "-" + cMonth+ "-" + cYear + ".xls";
String mainPath = @"C:\Users\User1\Desktop\" + cYear;
String folderPath = System.IO.Path.Combine(mainPath, cMonth);
String excelPath = System.IO.Path.Combine(folderPath, fName);
System.IO.Directory.CreateDirectory(mainPath);
System.IO.Directory.CreateDirectory(folderPath);
String fNameOnly = Path.GetFileNameWithoutExtension(excelPath);
String extension = Path.GetExtension(excelPath);
String path = Path.GetDirectoryName(excelPath);
newPath = excelPath;
if(File.Exists(newPath))
{
existingFile();
}else
{
newFile();
}
MessageBox.Show("Submitted");
}
private void newFile()
{
xlApp = new Microsoft.Office.Interop.Excel.Application();
xlApp.Visible = true;
misValue = System.Reflection.Missing.Value;
xlWorkBook = xlApp.Workbooks.Add(misValue);
xlWorkSheet = (Microsoft.Office.Interop.Excel.Worksheet)xlWorkBook.Worksheets.get_Item(1);
xlWorkSheet = xlWorkBook.Sheets["Sheet1"];
xlWorkSheet = xlWorkBook.ActiveSheet;
xlWorkSheet.Name = "Sheet1";
xlWorkSheet.Cells[2, 1] = "Header1";
xlWorkSheet.Cells[2, 2] = "Header2";
xlWorkSheet.Cells[2, 3] = "Total";
getData();
xlWorkBook.SaveAs(newFullPath, Microsoft.Office.Interop.Excel.XlFileFormat.xlWorkbookNormal, misValue,
misValue, misValue, misValue, Microsoft.Office.Interop.Excel.XlSaveAsAccessMode.xlExclusive, misValue, misValue, misValue, misValue, misValue);
xlWorkBook.Close(true, misValue, misValue);
xlApp.Quit();
Marshal.ReleaseComObject(xlWorkSheet);
Marshal.ReleaseComObject(xlWorkBook);
Marshal.ReleaseComObject(xlApp);
}
private void existingFile()
{
xlApp = new Microsoft.Office.Interop.Excel.Application();
xlApp.Visible = true;
xlWorkBook = xlApp.Workbooks.Open(newPath, 0,
false, 5, "", "", false, Microsoft.Office.Interop.Excel.XlPlatform.xlWindows,
"", true, false, 0, true, false, false);
xlBigSheet = xlWorkBook.Worksheets;
string x = "Sheet1";
xlWorkSheet = (Microsoft.Office.Interop.Excel.Worksheet)xlBigSheet.get_Item(x);
getData();
xlWorkBook.SaveAs(newPath, Microsoft.Office.Interop.Excel.XlFileFormat.xlWorkbookNormal,
misValue, misValue, misValue, misValue, Microsoft.Office.Interop.Excel.XlSaveAsAccessMode.xlExclusive,
misValue, misValue, misValue,
misValue, misValue);
xlWorkBook.Close(misValue, misValue, misValue);
xlWorkBook = null;
xlApp.Quit();
GC.WaitForPendingFinalizers();
GC.Collect();
GC.WaitForPendingFinalizers();
GC.Collect();
}
private void getData()
{
double a,b,c,d,total = 0;
int lastRow_ = 3;
foreach(DataGridViewRow r in dataGridView1.Rows)
{
if(!r.IsNewRow)
{
a = Convert.ToDouble(r.Cells[2].Value);
b = Convert.ToDouble(r.Cells[3].Value);
c = Convert.ToDouble(r.Cells[4].Value);
d = Convert.ToDouble(r.Cells[5].Value);
total = a + b + c + d;
xlWorkSheet.Cells[lastRow_, 1] = "Hi";
xlWorkSheet.Cells[lastRow_, 2] = "Hello";
xlWorkSheet.Cells[lastRow_, 3] = Convert.ToString(total);
lastRow_ = xlWorkSheet.Cells.Find(
"*",
xlWorkSheet.Cells[1, 1],
misValue,
Microsoft.Office.Interop.Excel.XlLookAt.xlPart,
Microsoft.Office.Interop.Excel.XlSearchOrder.xlByRows,
Microsoft.Office.Interop.Excel.XlSearchDirection.xlPrevious,
misValue,
misValue,
misValue).Row + 1;
}
}
total = 0;
}
Mise à jour 1:
Toujours bloqué.
Essaie de suivre ce lien:
https://www.codeproject.com/articles/5123/opening-and-navigating-excel-with-c
SORTIE
- Il y a quelques choses dans votre affiché le code qui ne compile pas, donc je m'interroge sur votre relevé de compte que vous êtes en mesure d'exporter les
DataGridView
à un nouveau fichier excel. La ligne:String mainPath = "@C:\Users\User1\Desktop\"" + cYear;
est incorrect... le " @ " est hors de place et un supplément ’”’citation est à la fin... devrait êtreString mainPath = @"C:\Users\User1\Desktop\" + cYear;
Également la ligne:System.IO.Directory.Create(folderPath);
est incorrecte,Create
DNE... devrait être:System.IO.Directory.CreateDirectory(mainPath);
Enfin de l'aide. - Vous pouvez ajouter la ligne:
xlApp.Visible = true;
pendant le débogage de la création du fichier excel. Cela vous permettra de VOIR ce qui se passe dans votre code, étape par étape, et peut révéler certains des problèmes que vous rencontrez. Juste une pensée. - merci pour l'aide, c'est juste une simulation de code que j'ai créé ici depuis mon programme principal est trop grand. Il n'y a pas de problème avec mon répertoire et j'ai fait ce que vous avez dit. Il remplace le fichier excel au lieu de l'ajoutant dans le fichier. Avez-vous des suggestions à ce sujet?
- J'ai nettoyé le code en question. merci pour la sortir
- Permettez-moi de voir si j'ai eu ce droit. Depuis votre programme principal code est trop gros à poste... puis la partie que vous avez un problème avec... au lieu de copier/coller le code que vous re-tapé à créer une “maquette” de la version avec des erreurs? Donc les erreurs que j'ai souligné plus haut, ne sont pas vraiment dans votre code? Si c'est le cas, alors pourquoi perdez-vous d'autres temps? Poste le code (pas une “maquette” de la version) qui ne fonctionne pas. Sinon, comme à votre affiché “se moquer de” code de la réponse est... il a des erreurs, et il ne fonctionne pas, puisqu'il est “faux” code n'a aucun sens pour les autres de les tester et de déboguer ou vous aider à trouver de vos erreurs.
- J'ai testé le code et il fonctionne exactement comme mon principal, la seule différence est, ma principale dispose d'environ 30columns j'ai donc décidé d'être "smart" pour couper les colonnes vers le bas, juste un peu et de le poster ici, je suppose que ce n'est pas la bonne chose à faire? mais oui, ce code crée un fichier excel et ÉCRASE un fichier excel existant. savez-vous ou avez des suggestions sur l'AJOUTANT à la place? merci pour votre aide
- Le code que vous avez posté ne pouvait pas travailler comme il y a une erreur de compilation dans le
getData()
méthode. - J'ai ajouté de la sortie sur ma question
Vous devez vous connecter pour publier un commentaire.
Lorsque vous avez besoin d'ajouter des données à une feuille de calcul existante, vous devez savoir où, la dernière ligne est et commencer à ajouter des données après cette ligne. Votre code pour obtenir cette “dernière” ligne est maladroit car une fois que vous commencez à ajouter des lignes de garder le contrôle de cette “dernière” ligne ce qui est inutile. Le
getData()
méthode est tout simplement l'ajout de données dans un nouveau fichier excel où la dernière ligne n'a pas d'importance. Si le fichier existe, il faut simplement que vous obtenez, la dernière ligne et de commencer à importer les données sur la ligne suivante. Je devine que c'est peut être mieux que votre code va, pour l'envoyer sur une ligne de départ pour l'indice deGetData(RowToStart)
méthode et il suffit d'incrémenter lelastRow_
variable, comme ci-dessous: Il n'est pas nécessaire de garder le contrôle de cette dernière ligne.Si le fichier est nouveau, vous pouvez appeler cette méthode comme ci-dessous.
Si le fichier existe déjà et que vous avez besoin pour ajouter les données dans la feuille de calcul existante, vous devez obtenir la dernière ligne, puis commencer à la ligne suivante. Vous pouvez appeler
getData(RowToStart)
comme ci-dessous.J'espère que cela a du sens.
DisplayAlerts
dans excel comme:xlApp.DisplayAlerts = false;