none
c#: Problem beim Speichern von Array in Excel RRS feed

  • Frage

  •  

    Hallo,

    ich möchte Daten aus einer Datenbank in ein Array speichern und dieses dann in Excel ausgeben. (C#)

    Dies habe ich wie auf dieser Seite beschrieben gemacht:

     

    http://support.microsoft.com/kb/306023/de Artikel-ID: 306023

     

     

    Mein Problem, ist aber das nur die letzte Zeile für alle Einträge ausgegeben wird

     

    wenn ich zb eine Matrix haben möchte

    1 2 3

    4 5 6

    7 8 9

     

    bekomme ich in Excel eine Matrix nur aus den letzten Zeilen

    7 8 9

    7 8 9

    7 8 9

     

    kann mir bitte jemand sagen, wo der Fehler ist und wie ich ihn beheben kann?

     

    Danke

     

     

    using System;
    using objExcel = Microsoft.Office.Interop.Excel;
    using System.Windows.Forms;


    namespace WindowsApplication1
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }

            private void button1_Click(object sender, EventArgs e)
            {
                objExcel.Application appExcel;
                objExcel.Workbooks objBooks;
                objExcel.Workbook objBook;
                objExcel.Sheets objSheets;
                objExcel.Worksheet objSheet;
                objExcel.Range objRange;
               

                object objtemp = Application.StartupPath + "/test.xlsx";
                object objMissing = Type.Missing;

             
                    appExcel = new objExcel.Application();
                    objBooks = appExcel.Workbooks;
                    objBook = objBooks.Add(objtemp);               
                    objSheets = objBook.Worksheets;
                    objSheet = (objExcel.Worksheet)objBook.Worksheets.get_Item("Info");
                    objRange = (objExcel.Range)objSheet.Cells[3, 1];

                    objRange.Value2 = null;
             

                object[] test = new object[5];
               
                int a = 1;

                for (int i = 1; i < 4; i++)
                {

                    test[0] = a.ToString();
                    a += 1;
                    test[1] = a.ToString();
                    a += 1;
                    test[2] = a.ToString();
                    a += 1;

                    objRange = objSheet.get_Range("A1", "C1");

                    objRange = objRange.get_Resize(i, 5);

                    objRange.Value2 = test; 
                }
                }
            }
        }

     

     

    • Bearbeitet cybercus Freitag, 5. November 2010 11:55 formartierung
    Freitag, 5. November 2010 11:51

Antworten

  • Hi cybercus,

    Wenn ich mir die for-Schleife in Deinem Code ansehe, hat es den Anschein, dass Du die Daten zeilenweise einfügen möchtest und nicht ein Range von drei Zeilen auf einmal. Wenn es das ist, was Du möchtest, dann:

    object[] test = new object[3];
    int a = 1;
    
    for (int zeilenIndex = 1; zeilenIndex < 4; zeilenIndex++)
    {
      test[0] = a.ToString(); a++;
      test[1] = a.ToString(); a++;
      test[2] = a.ToString(); a++;
    
      objRange = objSheet.get_Range("A" + zeilenIndex, "C" + zeilenIndex);
      objRange.Value2 = test;
    }
    
    

    Wenn Du aber das Array auf das gesamte (erweiterte) Range anwenden willst, dann:

    object[,] test = new object[3,3] {{1,2,3},{4,5,6},{7,8,9}};
    
    objRange = objSheet.get_Range("A1", "C1");
    objRange = objRange.get_Resize(3, 3);
    objRange.Value2 = test;
    
    

     

    Gruß
    Marcel

    Freitag, 5. November 2010 19:58
    Moderator
  • Hallo C.,

    Du hast Dir in Deiner for-Schleife einfach nur die Werte pro Durchlauf überschrieben. Als Möglichkeit hier also zum Beispiel:

     for (int i = 1; i < 4; i++) // using Excel = Microsoft.Office.Interop.Excel;
     { 
     for (int j = 0; j < 3; j++) test[j] = a++;
     objRange = objSheet.get_Range(objSheet.Cells[i, 1] as Excel.Range, objSheet.Cells[i, 3] as Excel.Range);
     objRange.Value2 = test;
     }

    Sehen kannst Du das übrigens leicht, wenn Du zum Test einmal:
     appExcel.Visible = true;
    

    setzt. Oder gleich verkürzt in einem 3 mal 3 Array etwa:

     int[,] test = new int[,] {{1,2,3}, {4,5,6}, {7,8,9}};
     objSheet.get_Range("A1", "C1").get_Resize(3, 3).Value = test;

    oder auch ohne Resize:

      int[,] test = new int[,] {{1,2,3},{4,5,6},{7,8,9}};
      objSheet.get_Range("A1", "C3").Value = test;
    


    ciao Frank
    Samstag, 6. November 2010 11:19

Alle Antworten

  • Hi cybercus,

    Wenn ich mir die for-Schleife in Deinem Code ansehe, hat es den Anschein, dass Du die Daten zeilenweise einfügen möchtest und nicht ein Range von drei Zeilen auf einmal. Wenn es das ist, was Du möchtest, dann:

    object[] test = new object[3];
    int a = 1;
    
    for (int zeilenIndex = 1; zeilenIndex < 4; zeilenIndex++)
    {
      test[0] = a.ToString(); a++;
      test[1] = a.ToString(); a++;
      test[2] = a.ToString(); a++;
    
      objRange = objSheet.get_Range("A" + zeilenIndex, "C" + zeilenIndex);
      objRange.Value2 = test;
    }
    
    

    Wenn Du aber das Array auf das gesamte (erweiterte) Range anwenden willst, dann:

    object[,] test = new object[3,3] {{1,2,3},{4,5,6},{7,8,9}};
    
    objRange = objSheet.get_Range("A1", "C1");
    objRange = objRange.get_Resize(3, 3);
    objRange.Value2 = test;
    
    

     

    Gruß
    Marcel

    Freitag, 5. November 2010 19:58
    Moderator
  • Hallo C.,

    Du hast Dir in Deiner for-Schleife einfach nur die Werte pro Durchlauf überschrieben. Als Möglichkeit hier also zum Beispiel:

     for (int i = 1; i < 4; i++) // using Excel = Microsoft.Office.Interop.Excel;
     { 
     for (int j = 0; j < 3; j++) test[j] = a++;
     objRange = objSheet.get_Range(objSheet.Cells[i, 1] as Excel.Range, objSheet.Cells[i, 3] as Excel.Range);
     objRange.Value2 = test;
     }

    Sehen kannst Du das übrigens leicht, wenn Du zum Test einmal:
     appExcel.Visible = true;
    

    setzt. Oder gleich verkürzt in einem 3 mal 3 Array etwa:

     int[,] test = new int[,] {{1,2,3}, {4,5,6}, {7,8,9}};
     objSheet.get_Range("A1", "C1").get_Resize(3, 3).Value = test;

    oder auch ohne Resize:

      int[,] test = new int[,] {{1,2,3},{4,5,6},{7,8,9}};
      objSheet.get_Range("A1", "C3").Value = test;
    


    ciao Frank
    Samstag, 6. November 2010 11:19