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
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.
Hey Th69,
danke für die Hilfe - Code funktioniert!