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 Wolfgang
Habe es aufgegeben die C# dll in X# umzuschreiben.
Habe hier nun noch mein kleines X# Prg und die neueste C# dll inkl. Source hochgeladen, liesst nun Xlsx Files über alle Sheets, kann sicher noch ein anderer gebrauchen. Hoffe alles ist dabei.

Gruss
Horst
Attachments
ReadXlsx.zip
(76.58 KiB) Downloaded 60 times
User avatar
wriedmann
Posts: 3775
Joined: Mon Nov 02, 2015 5:07 pm
Location: Italy

Excel lesen

Post by wriedmann »

Hallo Horst,
ich bin mir nicht sicher, dass hier nicht ein Problem im X# Compiler mit den Attributen vorliegt.
Ich habe leider aktuell nicht die Zeit, der Sache nachzugehen - vielleicht über die Weihnachtsfeiertage... (Italien erwägt, das ganze Land über die Feiertage zur roten Zone zu erklären, mit Ausgangssperren und Verbot, die eigene Gemeinde zu verlassen),
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
Ich habe auch das Gefühl X# macht da was nicht richtig. Aber irgendwie hast du schon recht, man kann das in einer eigenen DLL lassen und wen es schon unter c# läuft kann mans auch lassen.
Ich habe noch kurz ne Frage zu foreach und dem:
FOREACH oworksheet AS worksheet IN Workbook.Worksheets(SELF:aFile [1] [4])
Ich brauche meistens nur gerade das erste Sheet eines Excelfiles. Jetzt springe ich einfach mit EXIT raus.
Einen Array würde ich mit aLen abfragen. Wie kann ich das erste oWorksheet von Workbook ansprechen ?
Gruss
Horst
User avatar
wriedmann
Posts: 3775
Joined: Mon Nov 02, 2015 5:07 pm
Location: Italy

Excel lesen

Post by wriedmann »

Hallo Horst,
eine Collection beginnt immer mit 0 (nicht mit 1!).
Also würde ich das so machen:

Code: Select all

oWorkSheet := WorkBook.WorkSheets( self:aFile[1][4] )[0]
nachdem Du abgefragt hast, ob die Instanzvariable :Count > 0 ist.
Idealerweise

Code: Select all

oSheets := Workbook.Worksheets( self:aFile[1][4] )
if oSheets:Count > 0
  oSheet := oSheets[0]
endif
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 »

Danke

Wieder was gelernt :-)
Gruss
Horst
User avatar
Horst
Posts: 337
Joined: Tue Oct 13, 2015 3:27 pm

Excel lesen

Post by Horst »

Habe jetzt aber ein Problem mit der Declaration.

// FOREACH oworksheet AS worksheet IN Workbook.Worksheets(SELF:aFile [1] [4])

LOCAL oworksheet AS workbook.worksheet
oder LOCAL oworksheet AS worksheet
oWorksheet := Workbook.Worksheets(SELF:aFile [1] [4]) [0]
IF oWorksheet != NULL

Beim komplieren kennt er worksheet nicht
Was mache ich da falsch?
Gruss
Horst
User avatar
robert
Posts: 4555
Joined: Fri Aug 21, 2015 10:57 am
Location: Netherlands

Excel lesen

Post by robert »

Horst,

The type is named Excel.worksheet, not Workbook.worksheet.

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

Ja it works with excel.worksheet, but i thought when i use
#using Excel - then
Local oworksheet as worksheet
shoud be enough? Confused.
And now it stopt at
oWorksheet := Workbook.Worksheets(SELF:aFile [1] [4])[0]
error XS0021: Cannot apply indexing with [] to an expression of type 'System.Collections.Generic.IEnumerable<Excel.worksheet>'
is Wolfgang's example wrong ?
And :-) Starts collection allways with 0 or like Array when VO Dialekt with 1 ??

Horst
User avatar
robert
Posts: 4555
Joined: Fri Aug 21, 2015 10:57 am
Location: Netherlands

Excel lesen

Post by robert »

Horst,

using Excel should work indeed.

W.r.t. error xs0021: apparently the Worksheets property is an IEnumarable<Excel.worksheet> which means that you can use a FOREACH on it but not an index operator.
As an alternative (if you include using System.Linq) you can use the FirstOrDefault() extension method to get the first
element in the collection or NULL when the collection is empty.

And to answer your questions about [0] or [1] based collections:
The indexer of a collection is written in code. It depends on who wrote that code if the collection starts with a 0 or 1.
You can also have indexers that accept a string (like in a dictionary) so there are no "fixed" rules for collections.
So you will have to rely on the documentation, or use a FOREACH or FirstOrDefault() to make sure it always works.
For arrays things are different: normally they start with 1 in X# and with 0 in C#.
I know this is confusing, since both the indexer and the array use the [nPos] notation.

Robert
XSharp Development Team
The Netherlands
robert@xsharp.eu
Post Reply