Laden...

Erstellung eines dynamischen 2dimensionalen Array für Formatübergabe Excel

Erstellt von uksbi vor 9 Jahren Letzter Beitrag vor 9 Jahren 1.632 Views
uksbi Themenstarter:in
13 Beiträge seit 2007
vor 9 Jahren
Erstellung eines dynamischen 2dimensionalen Array für Formatübergabe Excel

Hallo,

ich möchte strukturierte Textdateien in Excel öffnen. Im Prinzip handelt es sich dabei um CSV-Dateien, bei denen aber der Feldtrenner nicht ; oder , ist sondern Tabulator. Um die Dateien zu öffnen, nutze ich die Funktion

Workbooks.Open(FileName)

Diese Funktion enthält einen möglichen Parameter um die gewünschte Spaltenformatierung mitzugeben. Dieses muss als Array erfolgen. Zur Zeit habe ich dieses Array fest definiert:


int[,] iFormatArray = new int[134, 2] { { 1, 2 }, { 2, 2 }, { 3, 2 }, { 4, 2 }, { 5, 2 }, { 6, 2 }, { 7, 2 }, { 8, 2 }, { 9, 2 }, { 10, 2 }, { 11, 2 }, { 12, 2 }, 
    { 13, 2 }, { 14, 2 }, { 15, 2 }, { 16, 2 }, { 17, 2 }, { 18, 2 }, { 19, 2 }, { 20, 2 }, { 21, 2 }, { 22, 2 }, { 23, 2 }, { 24, 2 }, { 25, 2 }, { 26, 2 }, 
    { 27, 2 }, { 28, 2 }, { 29, 2 }, { 30, 2 }, { 31, 2 }, { 32, 2 }, { 33, 2 }, { 34, 2 }, { 35, 2 }, { 36, 2 }, { 37, 2 }, { 38, 2 }, { 39, 2 }, { 40, 2 }, 
    { 41, 2 }, { 42, 2 }, { 43, 2 }, { 44, 2 }, { 45, 2 }, { 46, 2 }, { 47, 2 }, { 48, 2 }, { 49, 2 }, { 50, 2 }, { 51, 2 }, { 52, 2 }, { 53, 2 }, { 54, 2 }, 
    { 55, 2 }, { 56, 2 }, { 57, 2 }, { 58, 2 }, { 59, 2 }, { 60, 2 }, { 61, 2 }, { 62, 2 }, { 63, 2 }, { 64, 2 }, { 65, 2 }, { 66, 2 }, { 67, 2 }, { 68, 2 }, 
    { 69, 2 }, { 70, 2 }, { 71, 2 }, { 72, 2 }, { 73, 2 }, { 74, 2 }, { 75, 2 }, { 76, 2 }, { 77, 2 }, { 78, 2 }, { 79, 2 }, { 80, 2 }, { 81, 2 }, { 82, 2 },
    { 83, 2 }, { 84, 2 }, { 85, 2 }, { 86, 2 }, { 87, 2 }, { 88, 2 }, { 89, 2 }, { 90, 2 }, { 91, 2 }, { 92, 2 }, { 93, 2 }, { 94, 2 }, { 95, 2 }, { 96, 2 }, 
    { 97, 2 }, { 98, 2 }, { 99, 2 }, { 100, 2 }, { 101, 2 }, { 102, 2 }, { 103, 2 }, { 104, 2 }, { 105, 2 }, { 106, 2 }, { 107, 2 }, { 108, 2 }, { 109, 2 }, 
    { 110, 2 }, { 111, 2 }, { 112, 2 }, { 113, 2 }, { 114, 2 }, { 115, 2 }, { 116, 2 }, { 117, 2 }, { 118, 2 }, { 119, 2 }, { 120, 2 }, { 121, 2 }, { 122, 2 }, 
    { 123, 2 }, { 124, 2 }, { 125, 2 }, { 126, 2 }, { 127, 2 }, { 128, 2 }, { 129, 2 }, { 130, 2 }, { 131, 2 }, { 132, 2 }, { 133, 2 }, { 134, 2 } };

oExcel.Workbooks.OpenText(btnEdit.Tag.ToString(), Type.Missing, Type.Missing, Excel.XlTextParsingType.xlDelimited, Excel.XlTextQualifier.xlTextQualifierNone,
                Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, iFormatArray);

Soweit funktoniert auch alles wie gewünscht. Allerdings möchte ich das verwendete Array dynamisch aufbauen, je nachdem, wie viele Spalten die Textdatei hat. Wobei ich bei dem Problem bin, dass ich bis jetzt keine Ansatz gefunden habe, der funktioniert hat. Bei diversen Suche im Netz bin ich immer wieder auf den Ansatz von List<> bzw. Dictionary<> gestoßen. Nun habe ich folgenden Ansatz probiert:


Excel.Application oExcel = new Excel.Application();
StreamReader sr = new StreamReader(FileName);
string sLine = sr.ReadLine();
string[] sLineArray = sLine.Split(sDelimeter.ToString().ToCharArray()); // sDelimeter ist als ; gesetzt

Dictionary<int, int> lstFormat = new Dictionary<int,int>();
for (int i = 0; i < sLineArray.Length; i++)
{
	lstFormat.Add(i, 2);
}

oExcel.Visible = true;
oExcel.Workbooks.OpenText(btnEdit.Tag.ToString(), Type.Missing, Type.Missing, Excel.XlTextParsingType.xlDelimited, Excel.XlTextQualifier.xlTextQualifierNone,
	Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, lstFormat.Keys.ToArray());

Leider bricht das Programm in der Zeile zum Öffnen der Datei mit einer Exception "System.Runtime.InteropServices.COMException" ohne weiter Angaben ab. Ich denke, dass es an der Umwandlung des Dictionary<> in ein Array zu tun hat.

Bin ich mit diesem Ansatz auf dem falschen Weg? Soweit ich gesehen habe, könnte ich bei List<> immer nur einen Wert eintragen, nicht 2, wie bei den Dictionary<>. Im Grunde genommen könnte ich für die Anwendung das oberste Beispiel so lassen, finde es aber recht unprofessionell und unflexibel.

Schon mal vielen Dank für Eure Hilfe!

Gruß Ulf

"Lernen ist nicht angenehm, lernen tut weh." - Aristoteles
4.939 Beiträge seit 2008
vor 9 Jahren

Hallo,

da wirst du wohl bei einem sog. Rectangle-Array bleiben müssen (da List<T> im mehrdimensionalen nur Jagged-Arrays erzeugt) - aber das ist genauso einfach:


int[,] fieldInfo = new int[sLineArray.Length, 2];
for (int i = 0; i < sLineArray.Length; i++)
{
    fieldInfo[i, 0] = i + 1;
    fieldInfo[i, 1] = 2; // Text-Format
}

Den Variablennamen fieldInfo habe ich entsprechend des Parameters für die Workbooks.OpenText-Methode (Excel) benannt.

uksbi Themenstarter:in
13 Beiträge seit 2007
vor 9 Jahren

Hey Th69,

danke für die Hilfe - Code funktioniert!

"Lernen ist nicht angenehm, lernen tut weh." - Aristoteles