Benutzer mit den meisten Antworten
c#: Problem beim Speichern von Array in Excel

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
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- Als Antwort vorgeschlagen Frank Dzaebel Sonntag, 7. November 2010 19:39
- Als Antwort markiert Robert BreitenhoferModerator Donnerstag, 11. November 2010 15:34
-
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- Als Antwort vorgeschlagen Frank Dzaebel Sonntag, 7. November 2010 19:39
- Als Antwort markiert Robert BreitenhoferModerator Donnerstag, 11. November 2010 15:34
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- Als Antwort vorgeschlagen Frank Dzaebel Sonntag, 7. November 2010 19:39
- Als Antwort markiert Robert BreitenhoferModerator Donnerstag, 11. November 2010 15:34
-
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- Als Antwort vorgeschlagen Frank Dzaebel Sonntag, 7. November 2010 19:39
- Als Antwort markiert Robert BreitenhoferModerator Donnerstag, 11. November 2010 15:34