Excel lesen

Deutschsprachiges X#-Forum – German language forum

Moderator: wriedmann

User avatar
Horst
Posts: 337
Joined: Tue Oct 13, 2015 3:27 pm

Excel lesen

Post 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
Attachments
Start.TXT
(833 Bytes) Downloaded 67 times
User avatar
robert
Posts: 4529
Joined: Fri Aug 21, 2015 10:57 am
Location: Netherlands

Excel lesen

Post 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
XSharp Development Team
The Netherlands
robert@xsharp.eu
User avatar
Horst
Posts: 337
Joined: Tue Oct 13, 2015 3:27 pm

Excel lesen

Post 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
User avatar
wriedmann
Posts: 3759
Joined: Mon Nov 02, 2015 5:07 pm
Location: Italy

Excel lesen

Post by wriedmann »

Hi Horst,
in C# ist es

Code: Select all

worksheet.Rows
in X#

Code: Select all

worksheet:Rows
Wolfgang
Wolfgang Riedmann
Meran, South Tyrol, Italy
wolfgang@riedmann.it
https://www.riedmann.it - https://docs.xsharp.it
User avatar
Horst
Posts: 337
Joined: Tue Oct 13, 2015 3:27 pm

Excel lesen

Post 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
Attachments
Cell.txt
(2.99 KiB) Downloaded 60 times
User avatar
wriedmann
Posts: 3759
Joined: Mon Nov 02, 2015 5:07 pm
Location: Italy

Excel lesen

Post 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
Wolfgang Riedmann
Meran, South Tyrol, Italy
wolfgang@riedmann.it
https://www.riedmann.it - https://docs.xsharp.it
User avatar
wriedmann
Posts: 3759
Joined: Mon Nov 02, 2015 5:07 pm
Location: Italy

Excel lesen

Post by wriedmann »

Hallo Horst,
ich habe jetzt wie versprochen den Debugger auf das Cell-Objekt angesetzt:
Cell.png
Cell.png (8.22 KiB) Viewed 713 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
Wolfgang Riedmann
Meran, South Tyrol, Italy
wolfgang@riedmann.it
https://www.riedmann.it - https://docs.xsharp.it
User avatar
robert
Posts: 4529
Joined: Fri Aug 21, 2015 10:57 am
Location: Netherlands

Excel lesen

Post 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
XSharp Development Team
The Netherlands
robert@xsharp.eu
User avatar
Horst
Posts: 337
Joined: Tue Oct 13, 2015 3:27 pm

Excel lesen

Post 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
Attachments
Start.TXT
(915 Bytes) Downloaded 65 times
User avatar
robert
Posts: 4529
Joined: Fri Aug 21, 2015 10:57 am
Location: Netherlands

Excel lesen

Post 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
XSharp Development Team
The Netherlands
robert@xsharp.eu
Post Reply