2017-08-01 9 views
0

Désolé, si cela a été répondu, j'ai cherché pendant des heures, et je suis également nouveau à la programmation.C# Comment ajouter des valeurs spécifiées à la prochaine ligne disponible d'une feuille de calcul Excel sous des noms de colonnes spécifiés en utilisant OleDbCommand

Actuellement, j'ai 15 lignes avec des données dans ma feuille de calcul Excel, le code ci-dessous insérer les valeurs dans la ligne 40, et en appuyant sur le bouton d'exportation à nouveau insérera une nouvelle ligne avec les valeurs dans la ligne 41 etc ...

Ma question est comment puis-je l'obtenir pour insérer une nouvelle ligne avec les valeurs directement en dessous de mes données existantes (ligne 16) et ainsi de suite avec chaque clic sur le bouton d'exportation. Je cherche à garder la procédure de commande.

private void exportBtn_Click(object sender, EventArgs e) 
{ 
    OleDbCommand newRow = new OleDbCommand(); 
    newRow.CommandType = CommandType.Text; 
    newRow.CommandText = "INSERT INTO [Sheet1$] ([Company:], [County:], [State:], [Notes:], [User:], [Email:], [Username:], [Password:], [SMMM PWD:], [CAD:]) VALUES (1,2,3,4,5,6,7,8,9,10)"; 
    newRow.Connection = connectionExl; 

    connectionExl.Open(); 
    newRow.ExecuteNonQuery(); 
    connectionExl.Close(); 
} 

MISE À JOUR

Jusqu'à présent, je peux obtenir l'int de la ligne suivante disponible, Maintenant, je veux ajouter des valeurs dans les colonnes spécifiées à cette ligne disponibles.

Pour faciliter disons que j'ai 2 colonnes nommées (colonne1, colonne2) et les valeurs que je veux mettre en sont respectivement (1,2)

Comment puis-je faire?

Mon code à ce jour:

private void exportBtn_Click(object sender, EventArgs e) 
    { 
     Excel.Application xlApp = StartExcel(); 
//Excel.Application xlApp = new Excel.Application(); // instead of above line you can open new instance of Excel application and at the end of procedure xlApp.Application.Quit(); 
     Excel.Workbook myBook = xlApp.Workbooks.Open(@"C:\Users\path\path\excel.xlsx"); 

     Excel.Worksheet mySheet = myBook.Sheets[1]; 
     xlApp.Visible = true; // by default excel is invisible leave it invisible if you just like to add data and save it (also use new instance of Excel in this case) 
     int lastRow = mySheet.Cells.SpecialCells(Excel.XlCellType.xlCellTypeLastCell).Row; 
     int openRow = lastRow + 1; 
     mySheet.Cells[openRow, 1].Value = "your value for column A"; 
     mySheet.Cells[openRow, 2].Value = "your value for column B"; 

     myBook.Save(); 
     myBook.Close(); 

    } 

    private static Excel.Application StartExcel() // would be better to make it public somewhere in your module 
    { 
     Excel.Application instance = null; 
     try { instance = (Excel.Application)Marshal.GetActiveObject("Excel.Application"); } 
     catch (System.Runtime.InteropServices.COMException ex) { instance = new Excel.Application(); } 
     return instance; 
    } 
+0

Vous recherchez le [excel interop] (https://msdn.microsoft.com/fr-fr/library/microsoft.office.interop.excel.aspx) Familiarisez-vous avec les documents MSDN car ce sera votre single plus grande ressource. –

Répondre

0

Vous auriez probablement besoin Microsoft.Office.Interop.Excel ou toute autre bibliothèque Excel. Ci-dessous je mis en place un certain échantillon avec Interop vous pouvez ajuster au besoin:

public int getLastRow(Excel.Worksheet ws) 
{ 
    object[,] arData = ws.UsedRange.FormulaR1C1; // FormulaR1C1 returns only string in 2 dimensional array 
    for (int iRow = arData.GetUpperBound(0); iRow > 0; iRow--) { 
     for (int iCol = 1; iCol <= arData.GetUpperBound(1); iCol++) { 
      if (arData[iRow, iCol].ToString() != "") { return iRow; } 
     } 
    } 
    return 0; 
} 

Si votre feuille de calcul n'est pas formaté au-delà de la plage de données, le ci-dessous vous donnerait la dernière ligne.

int lastRow = ws.Cells.SpecialCells(Excel.XlCellType.xlCellTypeLastCell).Row; 

Vous pouvez commencer votre Excel et d'ajuster au besoin pour mettre à votre classeur/feuille de calcul:

using System.Runtime.InteropServices; 
using Excel = Microsoft.Office.Interop.Excel; 

void test() 
{ 
    Excel.Application xlApp = csXL.StartExcel(); 
    Excel.Worksheet ws = xlApp.ActiveSheet; 
    int irow = getLastRow(ws); 
} 

public static Excel.Application StartExcel() 
{ 
    Excel.Application instance = null; 
    try { instance = (Excel.Application)Marshal.GetActiveObject("Excel.Application"); } 
    catch (System.Runtime.InteropServices.COMException ex) { instance = new Excel.Application(); } 
    return instance; 
} 

Dans ce cas, vous auriez pas besoin OleDbCommand vous pouvez simplement insérer vos données avec 2 dimensions :

object[,] arLoad = new object[0, 9]; arLoad[0, 0] = 1; arLoad[0, 1] = 2; 
ws.Range["A" + irow + ":J" + irow].FormulaR1C1 = arLoad; // or use Value instead of FormulaR1C1 

Gardez à l'esprit lorsque vous chargez des données dans Excel de 2 dimensions de votre tableau est 0 basé, mais quand vous lisez à partir d'Excel votre tableau de limite inférieure est 1. J'attendrais un jour peut-être que quelqu'un posterait une meilleure réponse.

Voici quelques façons d'ajouter des données sous une colonne/cellule particulière, mais c'est beaucoup plus rapide lorsque vous ajoutez des données avec un tableau bidimensionnel, comme je l'ai montré ci-dessus. pour les petites entrées, la vitesse n'est pas un problème.

Excel.Worksheet ws; 
Excel.Range rngXL = ws.Cells[3, 2]; // Set range to cell B3 
rngXL.Value = "Sample Test"; 
rngXL.FormulaR1C1 = "= 3 + 2"; 
ws.Cells[4,2].FormulaR1C1 = "5"; 
ws.Cells[5, 3].Value = "2"; // Cell E3 
ws.Range["B5:D5"].Value = "Same text for cells B5,C5,D5"; 
ws.Range["E5"].Value = "This cell is"; 

Lire également ici Unable to open another excel file (when one excel is opened by .net) avec une solution simple comment faire nettoyer Quitter avec Excel. Où j'ai édité votre code utiliserait l'instance ouverte de l'application Excel. Si vous avez juste besoin de mettre à jour Excel et quitter, utilisez une nouvelle instance d'Excel et quand vous avez fait tout à fait l'application Excel.

+0

Oui, je suppose que cela peut être fermé car il semble que personne ne sait comment faire avec OleDbCommand et comme vous et Bender Binding mentionné, je dois juste me familiariser avec Excel Interop – RobertJRu

+0

Comme Bender Bending a également noté la route, vous aurez plus option pour modifier la sortie de toute façon que vous aimez. OleDbCommand ne contrôle pas Excel comme la bibliothèque Excel le ferait. Pour effectuer cette tâche particulière, il ne vous reste plus que quelques lignes de code à ajouter à ce qui précède. Faites-moi savoir si vous avez besoin d'aide. –

+0

S'il vous plaît si vous pouvez jeter un oeil à ma question ci-dessous MISE À JOUR à mon message original – RobertJRu