(GELÖST) Aktualisierung einer Excelzelle über .NET

24. Mai 2017 08:05

Hallo zusammen,

ich habe folgendes Problem und hoffe einer von euch kann mir da weiterhelfen ;)

Ich würde gerne über NAV den Wert einer Zelle in einer vorhandenen Exceldatei abändern ohne die komplette Datei neu schreiben zu müssen. Mein erster Gedanke war dann das ganze über .NET zu lösen. Zum Test wie und ob dies möglich ist, habe ich vorab ein kleines Programm in Visual Studio erstellt:

Code:
            Microsoft.Office.Interop.Excel.Application xlApp;
            Microsoft.Office.Interop.Excel.Workbook xlWorkBook;
            Microsoft.Office.Interop.Excel.Worksheet xlWorkSheet;

            xlApp = new Microsoft.Office.Interop.Excel.Application();
            xlWorkBook = xlApp.Workbooks.Open(@"\\srv\inc\Excel_Import_Beispiel_2.xlsx");
            xlWorkSheet = (Microsoft.Office.Interop.Excel.Worksheet)xlWorkBook.Worksheets.get_Item(1);
            xlWorkSheet.Cells[1, 1] = "NEWVALUE";
            xlWorkBook.Save();


Das C# Programm funktioniert auch ohne Probleme. Wenn ich dieses ausführe wird die entsprechende Zelle (1, 1) in der Exceldatei mit dem Wert "NEWVALUE" aktualisiert. Aktuell versuche ich nun dieses Programm in NAV nachzubauen, bekomme es aber irgendwie nicht hin. Der Code sieht wie folgt aus:

Code:
Name   DataType   Subtype   Length
XlApp   DotNet   Microsoft.Office.Interop.Excel.ApplicationClass
XlWrkBk   DotNet   Microsoft.Office.Interop.Excel.Workbook
XlWrkSht   DotNet   Microsoft.Office.Interop.Excel.Worksheet
XlRange   DotNet   Microsoft.Office.Interop.Excel.Range
XlHelper   DotNet   Microsoft.Dynamics.Nav.Integration.Office.Excel.ExcelHelper
XlShts   DotNet   Microsoft.Office.Interop.Excel.Sheets

XlApp := XlApp.ApplicationClass;
XlWrkBk := XlHelper.CallOpen(XlApp, cv_FileName);
XlWrkSht := XlWrkBk.Worksheets.Item('Tabelle1');
XlRange.Value('NEWVALUE');
XlWrkBk.Save;


Hier erscheint folgende Fehlermeldung:

Fehler bei einem Aufruf von System.__ComObject.get_Item mit folgender Meldung: Der Typ mindestens eines Arguments entspricht nicht dem Parametertyp der Methode.
Laut Debugger steigt er in der Zeile XlWrkSht := XlWrkBk.Worksheets.Item('Tabelle1'); aus.

Die Selektierung der Sheets bzw. des Worksheet Items habe ich auch schon über andere Wege versucht, aber bisher alles ohne Erfolg.
Auf Grund der Fehlermeldung habe ich auch schon versucht über die .NET Converter Klasse was umzuwandeln, hat aber auch nichts gebracht.
Vielleicht hat ja jemand von euch schon ein ähnliches Problem gehabt oder sieht direkt was ich falsch gemacht habe ;)

Ich muss das ganze aber auch nicht über .NET lösen. Wenn jemand ein funktionierendes Beispiel für NAV hat, immer her damit.

In diesem Sinne, besten Dank im Voraus.
Zuletzt geändert von CBT am 24. Mai 2017 14:57, insgesamt 1-mal geändert.

Re: Aktualisierung einer Excelzelle über .NET

24. Mai 2017 09:44

Hallo,

du kannst normalerweise diese Änderung direkt über die Excel Buffer Tabelle durchführen.

Gruß

Michael

Re: Aktualisierung einer Excelzelle über .NET

24. Mai 2017 10:22

Hallo,

ich danke dir für die Rückmeldung. Ich habe mit dem Excel Buffer bisher noch nichts gemacht, habe mir dessen Funktionalitäten jetzt aber mal was näher angeschaut und auf Basis von vorhandenem Code im NAV Standard folgendes versucht:

Code:
TempFileName := FileManagement.UploadFileSilent(ItemImportSetup."Excel File Name");
ExcelBuffer.UpdateBook(TempFileName, ItemImportSetup."Excel Sheet Name");
ExcelBuffer.WriteSheet('', COMPANYNAME, USERID);
ExcelBuffer.CloseBook;


Den Excel Buffer fülle ich vorher, was auch ohne Probleme funktioniert.
Wenn ich den oben genannten Code ausführe knallt er mir allerdings beim CloseBook mit folgender Fehlermeldung um die Ohren:
Fehler bei einem Aufruf von Microsoft.Dynamics.Nav.OpenXml.Spreadsheet.WorkbookWriter.ValidateDocument mit folgender Meldung: Die Arbeitsmappe ist beschädigt. Der folgende Fehler ist aufgetreten: The element has unexpected child element 'http://schemas.openxmlformats.org/spreadsheetml/2006/main:headerFooter'..

Eine Idee ?

Re: Aktualisierung einer Excelzelle über .NET

24. Mai 2017 14:56

Hallo,
mit dem Ansatz von rwendler in diesem Thread hat es funktioniert.
Besten Dank.