xsharp.eu • Excel lesen
Page 1 of 4

Excel lesen

Posted: Wed Dec 09, 2020 3:47 pm
by Horst
Hallo
Ich habe eine kleine Dll gefunden mit der man Excel auslesen kann und ich wollte damit mal rumprobieren..
https://www.codeproject.com/Tips/801032 ... h-Lines-of
Nun versuche ich das C# Beispiel in X# umzuschreiben und ggrrrrr ich kriegs nicht hin.

foreach (var worksheet in Workbook.Worksheets(@"C:ExcelFile.xlsx")
foreach (var row in worksheet.Rows)
foreach (var cell in row.Cells)
// if (cell != null) // Do something with the cells

Mein erfolgloser Versuch ist im Anhang

Wie übersetzt man das ?
Gruss Horst

Excel lesen

Posted: Wed Dec 09, 2020 3:57 pm
by robert
Horst

Remove the local declarations for worksheet, row and cell and try this:

Code: Select all

	FOREACH VAR worksheet IN Workbook.Worksheets("C:xideExcelTest.xlsx")
        AAdd (aExcelDaten, "neues Sheet")
    	FOREACH VAR row IN worksheet.Rows
    		cDataString := ""
        	FOREACH VAR cell IN row.Cells  
        		cDataString := cDataString + cell+";"
	        NEXT                                     
	        AAdd (aExcelDaten, cDataString)
    	NEXT
NEXT


Explanation:
FOREACH wants either:
- VAR before the variable name
- AS <type> after the variable name

Robert

Excel lesen

Posted: Wed Dec 09, 2020 4:14 pm
by Horst
Hi Robert

Then it comes
error xs0120: an object reference is requiered for the non-static field. method. or property 'worksheet.Rows'

Horst

Excel lesen

Posted: Wed Dec 09, 2020 4:18 pm
by wriedmann
Hi Horst,
in C# ist es

Code: Select all

worksheet.Rows
in X#

Code: Select all

worksheet:Rows
Wolfgang

Excel lesen

Posted: Wed Dec 09, 2020 4:56 pm
by Horst
Hallo Wolfgang
LOL fast peinlich, daran bin ich schon mal gescheitert.
Aber warum gibt es bei der Zeile
FOREACH VAR worksheet IN Workbook.Worksheets("C:xideExcelTest.xlsx") keinen Error ?

Und nun habe ich noch das Problem, dass cell kein string ist sondern eine Klasse und ich den Wert in der Zelle haben muss.
Versucht habe ich: cell:value dann crashed die Exe mit der Fehlermeldung: Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt.
Ich habe mal das cell.txt (cs) angehängt, wie komme ich auf den Inhalt einer Zelle ? Value ist doch darin als Variable definiert ??

Gruss
Horst

Excel lesen

Posted: Wed Dec 09, 2020 6:11 pm
by wriedmann
Hallo Horst,
C# unterscheidet nicht zwischen statischen Methoden (also Methoden, die sich auf die Klasse beziehen) und "normalen" Methoden, also solchen, die sich auf ein Objekt der Klasse beziehen - es wird immer der Punkt verwendet.
X# unterscheidet hier sehr wohl: ein Punkt für statische Methoden und ein Doppelpunkt für normale Methoden.
WorkSheets ist eine statische Methode der Klasse Workbook, daher der Punkt.
Rows ist ein Zugriff auf ein Objekt der Klasse Worksheet, daher der Doppelpunkt.
Um Dein Problem mit dem Value zu lösen, würde ich mal den Debugger drauf ansetzen.
Mache ich ggf später noch und zeige es Dir hier.
Wolfgang

Excel lesen

Posted: Wed Dec 09, 2020 6:58 pm
by wriedmann
Hallo Horst,
ich habe jetzt wie versprochen den Debugger auf das Cell-Objekt angesetzt:
Cell.png
Cell.png (8.22 KiB) Viewed 671 times
Die Variable "Amount" ist ein Double, also numerisch, während die Variable "Text" den Wert als String gibt.
Und das ist Dein etwas angepasster Code:

Code: Select all

using excel

function Start( ) as void
	System.Console.WriteLine("Hello x#!")

	local aExcelDaten:= {}	as array
	local cDataString		as string
	local nCnt 				as dword

	foreach worksheet as worksheet in Workbook.Worksheets("C:devnettempsample.xlsx")
        AAdd (aExcelDaten, "neues Sheet")
    	foreach row as Row in worksheet:Rows
    		cDataString := ""
        	foreach cell as Cell in row:Cells
        		altd()
        		cDataString := cDataString + cell:Text +";"
	        next
	        AAdd (aExcelDaten, cDataString)
    	next
	next

	for nCnt := 1 upto ALen(aExcelDaten)
		System.Console.WriteLine( AsString( aExcelDaten[nCnt] ) )
	next nCnt

	return
Wolfgang

Excel lesen

Posted: Wed Dec 09, 2020 7:01 pm
by robert
Horst,

C# allows to add a non string to a string. It will silently call ToString().
So change the code to:

cDataString := cDataString + cell:ToString()+";"

Robert

Excel lesen

Posted: Thu Dec 10, 2020 7:54 am
by Horst
Hallo Wolfgang
Danke !
Mein grober Fehler war 'cell != null' nicht reinzuschreiben , weil das Prg dann sofort abstürzt wen eine Zelle leer ist.
Den Debugger habe ich mal gestartet aber er lief einfach durch. Nicht wie bei VO wo er bei der ersten Prg Zeile stoppt. Altd() reinzuhängen kam mir nicht in den Sinn, da ich schon lange den Debugger nicht mehr benutzte. (CGI)
Ich habe mir dann noch den Array aExceldaten angeschaut und erschrack was alles abgelegt ist. Wusste gar nicht das Arrays so kompliziert sind.
Habe die funktionierende Version noch anghängt, kann ja vieleicht nocht ein anderer brauchen.
Gruss
Horst

Excel lesen

Posted: Thu Dec 10, 2020 8:56 am
by robert
Horst,
Part of the problem of "." versus ":" is caused by the fact that you are using variable names in your code that are identical to type names.

Code: Select all

FOREACH worksheet AS worksheet IN Workbook.Worksheets("C:xideExcelTest.xlsx")
If you write

Code: Select all

worksheet.Rows
then the compiler does not know if the word before the dot refers to the local variable or the type.
If you use different names

Code: Select all

FOREACH oWorksheet AS worksheet IN Workbook.Worksheets("C:xideExcelTest.xlsx")
then you should be able to use both

Code: Select all

oWorksheet.Rows
and

Code: Select all

oWorksheet:Rows

Robert