C# Mit C# Excelsheet lesen/umgestestalten

Raknar

Ensign
Registriert
Apr. 2006
Beiträge
208
Mahlzeit,

ich bin gerade dabei ein kleines Tool in C# zu schreiben, mit dem man eine Tabelle auf einem Excelarbeitsblatt umgestaltet.

Hintergrund: eine Software A speichert Daten im Excelformat. Diese werden von einer weiteren Software B eingelesen/weiterverarbeitet. Software A wird gegen eine andere C ausgetauscht, diese hat die gleiche Funktion, die Excelausgabe hat die die gleichen Informationen, nur anders aufbereitet.

Dieses kleine workaround möchte ich nutzen, um mit C# die Officeprogrammierung kennenzulernen. C# nutze ich schon etwas länger, nur noch nicht so.

Nun zum Problem: in Zeile 53 will ich einfach einen Wert überprüfen um dann weiter zu entscheiden. Das klappt nicht..."Problem festgestellt und muss beendet werden. Vielleicht kann mir da einer von euch weiterhelfen :)
Code:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using xl = Microsoft.Office.Interop;
using System.Diagnostics;
using System.Runtime.InteropServices;
using System.IO;

/*Änderungen bei Excel 2007: Es muss die COM-Bibliothek Microsoft Excel 12.0 Object Library verwendet werden.

  Änderungen bei Excel 2010: Es muss die COM-Bibliothek Microsoft Excel 14.0 Object Library verwendet werden.*/

namespace ADIS_zu_AQS
{
    class Program
    {
        static void Main(string[] args)
        {
            StringBuilder xl_Pfad;
           // string testpfad = @"C:\Dokumente und Einstellungen\g.reinholz\Desktop\ExportADIS.xlsx";

            if (args.Count() > 0)
            {
                Console.WriteLine("Folgende Datei wurde ausgewaehlt: " + args[0]);
            }
            else
            {
                Console.WriteLine("Nichts passiert");
            }

            xl_Pfad = new StringBuilder(args[0]);
           // xl_Pfad = new StringBuilder(testpfad);
            Console.WriteLine(Environment.NewLine + "StringBuilder: "+xl_Pfad);

            StringBuilder sheetName = new StringBuilder("Tabelle1");
            xl.Excel.Application xlApp = new xl.Excel.Application();
            xlApp.Visible = true;
            xl.Excel.Workbook xlWbk = xlApp.Workbooks.Open(xl_Pfad.ToString());
            xl.Excel.Worksheet xlSht = xlWbk.Sheets[sheetName.ToString()];

            int startRow = 1;
            int lastRow = RowCount(xlSht, 1);
            Console.WriteLine("LastRow: "+lastRow);

            //Spalten umbenennen
            int[] obligatoryColumns = new int [39];

            for (int row = startRow; row < lastRow; row++)
		{
			    foreach (int spalte in obligatoryColumns)
                {
                    if(xlSht.Cells[row,spalte].value.ToString()=="Betreiber")
                    {
                        xlSht.Cells[row, spalte] = "ma";
                    }
                } 
			}

           
            Console.ReadKey();

        }
        static int RowCount(xl.Excel.Worksheet sheet, int column)
        {
            xl.Excel.Range xlRange = sheet.Cells[sheet.Rows.Count, column];
            return xlRange.get_End(xl.Excel.XlDirection.xlUp).Row;
        }
    }
}

Des Weiteren finde ich es komisch/unpraktisch das es Visualstudio "egal" ist, ob da ".value.ToString()", "[row,spalte].Text" oder "[row,spalte] = " steht. Erst bei Programmausführung wird ein Fehler sichtbar
 
probiers mal die Zeile 53 so:

Code:
if(xlSht.Cells != null && xlSht.Cells[row,spalte] != null &&Convert.ToString(xlSht.Cells[row,spalte].Value) == "Betreiber" )
 
@ J4CK50N

Leider funktioniert das nicht. COMException: Ausnahme von HRESULT: 0x800A03EC (Abgefangen: "0x800A03EC
bei System.RuntimeType.ForwardCallToInvokeMember(String memberName, BindingFl
ags flags, Object target, In")
 
Ich würde sagen es liegt daran, dass deine Variable 'spalte' immer 0 ist, da du ja über ein frisch initialisiertes Array iterierst, in dem jeder Wert mit 0 initialisiert wird.
Da in Excel die Indizes (dummerweise) nicht 0 basiert sondern 1 basiert sind fliegt dir dann das: 'xlSht.Cells[row,spalte]' um die Ohren.

btw. ich würde die Variable nicht unbedingt 'spalte', sondern eher 'column' nennen. ;)

Edit:
So wie der Code jetzt aussieht könntest du natürlich auch einfach die foreach-Schleife weglassen und 'spalte' durch 1 ersetzen.
 
Zuletzt bearbeitet:
Statt auf die Zellen einzeln zugreifen zu müssen, könntest du auch über ExcelSheet.UsedRange.Value die Werte des ganzen Datenblattes in ein 2 dimensionales Object Array überführen und dann auf diesem Array deine Auswertungen machen. Ist wesentlich schneller in der Ausführung und meiner Meinung nach einfacher zu handhaben, z.B:

Code:
object[ , ] values = xlSht.UsedRange.Value;

Aber korrigiert mich, falls ich falsch liege...
 
Zuletzt bearbeitet:

Ähnliche Themen

Zurück
Oben