Laden...

[gelöst] VSTO: NullRferenceException beim Auslesen von Werten in Excelzellen

Erstellt von Bionic vor 16 Jahren Letzter Beitrag vor 16 Jahren 2.943 Views
B
Bionic Themenstarter:in
214 Beiträge seit 2005
vor 16 Jahren
[gelöst] VSTO: NullRferenceException beim Auslesen von Werten in Excelzellen

Hi zusammen,

bin der Verzweiflung sehr nahe. Ich versuche die Werte bestimmter Zellen (alle benannten Zellen) in Excel auszulesen. Jedoch verabschiedet sich das Ganze mit eine NullReferenzeException. Komischerweise erst nachdem es 4 Zellen durchgegangen ist und auch die Werte ausgelesen hat. (Excel 2003 und VSTO 2005 SE)

Folgender Code, dient zum Auslesen von Werten in Excel:


			if (excelApp != null)
			{
				Excel.Worksheet excelWrkSheet = (Excel.Worksheet) excelApp.Worksheets.get_Item("Data");
				ArrayList excelValues = new ArrayList();
				foreach (Excel.Name valueName in excelApp.Names)
				{
					try
					{
						// Überprüfen ob der Zellenname auf eine richtige Zelle verweist
						bool schlechterReferer = false;
						string rngNameRefersTo = valueName.RefersTo.ToString();
						schlechterReferer = rngNameRefersTo.Contains("REF!");
						if (!schlechterReferer)
						{
							Excel.Range valueRange = excelWrkSheet.get_Range(valueName.Name, Type.Missing);
							// NullReferenceException nach 4 Aufrufen von get_Range(), wieso auch immer :-/
							excelValues.Add(new TISExcelValues(valueName.Name.ToString(), valueRange.Value2.ToString()));
						}
					}
					catch (Exception e)
					{
						throw;
					}
				}
			}

public class TISExcelValues
	{
		private string pIdentName;
		private string pExcelValue;
		private string pUnit;

		public string Unit
		{
			get { return pUnit; }
			set { pUnit = value; }
		}

		public string ExcelValue
		{
			get { return pExcelValue; }
			set { pExcelValue = value; }
		}

		public string IdentName
		{
			get { return pIdentName; }
			set { pIdentName = value; }
		}

		//---
		public TISExcelValues(string identName, string excelValue, string unit)
		{
			this.pIdentName = identName;
			this.pExcelValue = excelValue;
			this.pUnit = unit;
		}

		public TISExcelValues(string identName, string excelValues)
		{
			this.pIdentName = identName;
			this.pExcelValue = excelValues;
			this.pUnit = "";
		}

		public TISExcelValues()
		{
			this.pIdentName = "";
			this.pExcelValue = "";
			this.pUnit = "";
		}

	}

Die Fehlermeldung lautet wie folgt:

NullReferenceException wird nicht vom Benutzercode behandelt.
Der Objektverweise wurde nicht auf eine Objektinstanz festgelegt.

Ich weiß nicht wo ich da ansetzen soll. 4 Zellen liest er aus und dann schmeißt er mir die Exception. Bin wie immer für jeden Hinweis sehr dankbar.

//-- LÖSUNG
Wenn die Zelle in Excel keinen Wert drin hat, wird diese mit null angegeben. Ich war der festen Überzeugung das da ein Leerstring drinstehen würde. Sprich der Value2 einer Excelzelle ist immer null, sofern kein Wert drinsteht.
So sieht die Lösung aus:

if (excelApp != null)
{
    Excel.Worksheet excelWrkSheet = (Excel.Worksheet) excelApp.Worksheets.get_Item("Webserver Data");
    List<TISExcelValues> excelValues = new List<TISExcelValues>();

    foreach (Excel.Name valueName in excelApp.Names)
    {
        try
        {
            // Überprüfen ob der Zellenname auf eine richtige Zelle verweist
            bool schlechterReferer = false;
            string rngNameRefersTo = valueName.RefersTo.ToString();
            schlechterReferer = rngNameRefersTo.Contains("REF!");
            if (!schlechterReferer)
            {
                Excel.Range valueRange = excelWrkSheet.get_Range(valueName.Name.ToString(), valueName.Name.ToString());
                object valueObject = valueRange.Value2;
                string valueString = (valueObject != null) ? valueObject.ToString() : "(null)";
                string valueNameString = valueName.Name;

                excelValues.Add(new TISExcelValues(valueNameString, valueString));
            }
        }
        catch (Exception e)
        {
            throw e;
        }
    }
}

Bionic

.:: SilvrGame - Browsergame Development with Silverlight
.:: Bionic's blOg

1.274 Beiträge seit 2005
vor 16 Jahren

Hallo

Sind die Werte überall gleich?
Wo tritt der Fehler auf?

"Das Problem kennen ist wichtiger, als die Lösung zu finden, denn die genaue Darstellung des Problems führt automatisch zur richtigen Lösung." Albert Einstein

B
Bionic Themenstarter:in
214 Beiträge seit 2005
vor 16 Jahren

Die Werte sind unterschiedliche und der Fehler tritt beim Beenden der foreach Anweisung raus. Sprich, er läuft 4 mal die Schleife durch und beim Verlassen des 4. Schleifendurchgangs wirft er die Exception. Es sind 29 benannte Zellen in Excel, dies kann ich mir auch anzeigen lassen.

Ich hab schon alle Objekte in der Schleife auf null geprüft und keines der dort verwendeten Objekte wird jemals null. Die Fehlermeldung gibt leider auch nichts her 😕

.:: SilvrGame - Browsergame Development with Silverlight
.:: Bionic's blOg

1.274 Beiträge seit 2005
vor 16 Jahren

Mach in den zeilen wirklich mal den gleichen Wert schau dir das mal an

lg
LG.

"Das Problem kennen ist wichtiger, als die Lösung zu finden, denn die genaue Darstellung des Problems führt automatisch zur richtigen Lösung." Albert Einstein