Conversion string[,] depuis System.Array

Résolu
el_teedee Messages postés 497 Date d'inscription mercredi 7 juillet 2004 Statut Membre Dernière intervention 13 juillet 2015 - 6 août 2005 à 22:17
el_teedee Messages postés 497 Date d'inscription mercredi 7 juillet 2004 Statut Membre Dernière intervention 13 juillet 2015 - 10 août 2005 à 08:58
Bonjour, tout est dans le titre,



je récupère un System.Array qui, par exemple est un tableau de string [5,3] :

[1,1]

[1,2]
[1,3]
...

[5,1]

[5,2]

[5,3]



J'aimerais pour pouvoir parcourir ce tableau, le mettre dans un tableau
de string[5,3]. (PS : le nb de lignes et de colonnes sera toujours
connu).

Comment puis-je faire ? J'ai essayer différents cast, mais il y a toujours une erreur. Est-ce que c'est seulement possible ?



Sinon, existe-il une méthode pour parcourir un System.Array, genre équivalent de foreach... ?
A voir également:

18 réponses

cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
7 août 2005 à 11:54
Il aurait peut etre fallu en parler tout de suite, c'est un détail relativement important la source de l'objet lol
Je pense que ceci répond à ta question :
http://www.c-sharpcorner.com/winforms/ExcelReadMG.asp

Cocoricoooooooo !!!!
coq
MVP Visual C#
3
cs_Bidou Messages postés 5487 Date d'inscription dimanche 4 août 2002 Statut Membre Dernière intervention 20 juin 2013 61
6 août 2005 à 22:29
Salut,
Tu as essayé la méthode Copy de la class Array ?

[Pub] http://www.csharpfr.com/auteurdetail.aspx?ID=13319 [\Pub]
C# forever
0
cs_Bidou Messages postés 5487 Date d'inscription dimanche 4 août 2002 Statut Membre Dernière intervention 20 juin 2013 61
6 août 2005 à 22:32
Ca donnerait quelque chose comme ceci :



string[] s =
new
string[10];
System.Array ar = myArray.ToArray();
System.Array.Copy(ar, 0, s, 0, ar.Length);

[Pub] http://www.csharpfr.com/auteurdetail.aspx?ID=13319 [\Pub]
C# forever
0
cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
6 août 2005 à 22:37
Salut,

System.Array est précisément la classe de base de tout tableau en .Net.
=>
string[,] strArray = (string[,])array; // avec array une instance de System.Array

Cocoricoooooooo !!!!
coq
MVP Visual C#
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_Bidou Messages postés 5487 Date d'inscription dimanche 4 août 2002 Statut Membre Dernière intervention 20 juin 2013 61
6 août 2005 à 22:44
Pour parcourir le tableau (j'avais pas vu la question) tu peux utiliser des for avec la méthode GetValue de la class Array...

[Pub] http://www.csharpfr.com/auteurdetail.aspx?ID=13319 [\Pub]
C# forever
0
el_teedee Messages postés 497 Date d'inscription mercredi 7 juillet 2004 Statut Membre Dernière intervention 13 juillet 2015 9
7 août 2005 à 03:02
> Coq, j'ai essayé ceci :

string[,] strArray =(string[,])r.Cells.Value2;

=>Erreur, "le cast n'était pas valide"



> Bidou, j'ai essayé ça :

string[] s = new string[15];

System.Array ar = r.Cells.Value2.ToArray();

System.Array.Copy(ar, 0, s, 0, ar.Length);
Il marque que
ToArray n'est pas disponible car en fait r.Cells.Value2, (ce que
j'avais appelé mon array) est en fait un Object, donc il n'a que ceci
comme propriété et méthode disponibles :

Equals

GetHashCode

GetType

ToString



Un peu plus de précisions sur le contexte, si vous le voulez bien. J'essaye d'ouvrir un classeur excel. Ma variable "r" est :

Excel.Range r = xlFeuill1.get_Range (text_case_depart.Text ,text_case_arrivee.Text);



Donc, si je rentre ("A1","B3"), j'ai ceci quand j'ajoute des espions :


+ r {System.__ComObject} Excel.Range

+ Cells {System.__ComObject} Excel.Range

Value System.Object

- Value2 {System.Array} System.Object

[1,1] "coucou" string

[1,2] "salut" string

[2,1] "bonjour" string

[2,2] null string

[3,1] null string

[3,2] null string



Pour r.Cells.Value2 (ci dessus), le type est "System.Object" et la valeur est "System.Array"



Maintenant, je veux foutre .Value2 dans une variable dont le type me permet de la parcourir, c'est mieux...
0
Lutinore Messages postés 3246 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 octobre 2012 41
7 août 2005 à 03:40
// object o = ( object )new string[ 2, 2 ];


string[ , ] array = ( string[ , ] )o;


Si ça ne marche pas, c'est que ton type n'est pas un tableau de chaines à deux dimensions, ou c'est un "jagged array" ( string[][] ) mais je n'y crois pas trop. Si tu es certain que ton type est un tableau tu peux le caster en Array:


Array array = ( Array )o;
0
Lutinore Messages postés 3246 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 octobre 2012 41
7 août 2005 à 04:31
C'est peut être un type d'Excel, Range ou Cell un truc comme ca:

Range r = ( Range )value;
0
el_teedee Messages postés 497 Date d'inscription mercredi 7 juillet 2004 Statut Membre Dernière intervention 13 juillet 2015 9
7 août 2005 à 12:06
> Lutinore : pas de problème sur la validité de

object o = ( object )new string[ 2, 2 ];

string[ , ] array = ( string[ , ] )o;

cependant, lorsque je mets mon array dans l'object o, ca me remet
"erreur, information supplémentaire : le cast spécifié n'est pas
valide".

object o = ( object )new string[ nb_lignes, nb_colonne ]; OK

o = r.Cells.Value2; OK

string[ , ] strArray = ( string[ , ] )o; Cast invalide



Sinon, j'ai essayé aussi ta 2ème idée, mais c'est pas ça non plus

Excel.Range r2 = ( Excel.Range )r.Cells.Value2; Informations supplémentaires : Le cast spécifié n'est pas valide.



Je vais vous filer le petit bout de code. Vous pouvez essayer avec un fichier .xls et me dire ce que ca donne de votre côté :



private void button1_Click(object sender, System.EventArgs e)

{

string fileName = Application.StartupPath + "\\test.xls";

Excel._Application xlApp; //appli

Excel._Workbook xlClasseur; //classeur

Excel._Worksheet xlFeuill1; //feuille



xlApp = new Excel.Application(); //Appli

xlApp.Visible
= true; //soit disant ne pas faire apparaitre la feuille

//Ouverture classeur

xlClasseur = xlApp.Workbooks.Open(fileName,


Missing.Value,Missing.Value,Missing.Value,
Missing.Value, Missing.Value, Missing.Value,

Missing.Value,Missing.Value,


Missing.Value,
Missing.Value,Missing.Value,Missing.Value,Missing.Value,Missing.Value);

//feuille

Excel.Sheets xlFeuilles = xlClasseur.Sheets;

xlFeuill1 = (Excel._Worksheet)xlFeuilles["Feuil1"];



Excel.Range r
= xlFeuill1.get_Range (text_case_depart.Text ,text_case_arrivee.Text);

//Excel.Range r = xlFeuill1.get_Range ("A1","A2");

//object cell = (object)r.Cells.Value ;

//object cell = (object)r.Cells.Value2 ;

//r.Cells.Value2 = "xxx";

//string val1 = (string)cell;

//cell = "G";

//string val2 = (string)cell;



//Il faut rechercher dans le tableau toutes les cases recherchées :

int nb_colonne = r.Cells.Count / r.Cells.Rows.Count;

int nb_lignes = r.Cells.Rows.Count;

int nb_cases = r.Cells.Count;



//Il faut parcourir les lignes :

for (int i=0; i
0
el_teedee Messages postés 497 Date d'inscription mercredi 7 juillet 2004 Statut Membre Dernière intervention 13 juillet 2015 9
7 août 2005 à 12:08
Thx ! Coq



Voilà le passage intéressant : (enfin je pense, ca y ressemble)

You also may want to
note the ConvertToStringArray method which is used to convert a
System.Array into a string array. If someone knows an
easier way to do this, please let me know and I'll alter the
article. The problem is that an Excel Array comes back as
two dimensional even if you are selecting a range of a single
row, so you need to change the 2-d array into something the
listview can accept. Also the listview array is 0 based and the
Excel range array is 1 based.





string[]
ConvertToStringArray(System.Array values)

{

// create a new string
array

string[] theArray = new
string[values.Length];




// loop through the 2-D
System.Array and populate the 1-D String Array

for
(int
i = 1; i <= values.Length; i++)

{

if
(values.GetValue(1, i) == null)

theArray[i-1] =
"";

else

theArray[i-1] = (string)values.GetValue(1,
i).ToString();

}




return
theArray;

}
0
Lutinore Messages postés 3246 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 octobre 2012 41
7 août 2005 à 15:21
Faut connaitre le model objet d'Excel pour savoir que le tableau est de base 1. Entre moi qui te proposait de caster ton object en Array et Bidou qui t'avait donné la méthode Array.GetValue, tu avais la solution. : )
0
el_teedee Messages postés 497 Date d'inscription mercredi 7 juillet 2004 Statut Membre Dernière intervention 13 juillet 2015 9
7 août 2005 à 15:27
C vrai merci les gars,



mais c la première fois que je touche à Excel en programmation, donc j'étais un peu perdu



@++
0
cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
7 août 2005 à 15:30
Tssss, pas d'excuse, l'espion te le disais clairement pourtant ;-)

Cocoricoooooooo !!!!
coq
MVP Visual C#
0
cs_Bidou Messages postés 5487 Date d'inscription dimanche 4 août 2002 Statut Membre Dernière intervention 20 juin 2013 61
7 août 2005 à 18:20
Un espion ?
Rhalala nos amis français francise vraiment tout et n'importe quoi
Tu utilises aussi les mots pourriel, arroseur et tout les autres? lol

[Pub] http://www.csharpfr.com/auteurdetail.aspx?ID=13319 [\Pub]
C# forever
0
cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
7 août 2005 à 18:31
Oui, je suis réputé comme ferveur admirateur de la commission de terminologie (en charge de terminer la phase de démolition du français "technique") et de néologie (ils sont dans la matrice...)

Cocoricoooooooo !!!!
coq
MVP Visual C#
0
Lutinore Messages postés 3246 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 octobre 2012 41
10 août 2005 à 04:00
3 jours après : )

Voilà une méthode qui doit marcher, par exemple pour extraire la première valeur:

string val = ( ( ( object[ , ] )range.Cell.Value )[ 1, 1 ] ).ToString( );
0
Lutinore Messages postés 3246 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 octobre 2012 41
10 août 2005 à 04:06
Oups.. Cells ( avec un s ) pas Cell.

Vive la classe Object et les méthodes virtuelles : )
0
el_teedee Messages postés 497 Date d'inscription mercredi 7 juillet 2004 Statut Membre Dernière intervention 13 juillet 2015 9
10 août 2005 à 08:58
Re,



lol maintenant je suis bloqué dans
l'autre sens, c'est-à-dire, que bien évidemment j'ai réussi à extraire
le contenu du classeur dans un tableau de string. Dans celui-ci je fais
mes recherches et modifiations. Mais le problème, c'est pour
enregistrer les modifications dans le fichier Excel.

Au début je faisais xlClasseur.SaveCopyAs mais
je me suis vite rendu compte que je ne touchais pas à la variable
xlClasseur, donc que j'aurais du mal à enregistrer les modifications.



Alors j'ai pensé faire la méthode inverse proposée dans ConvertToStringArray. C'est jouable ou pas de convertir string[,] vers Array d'un classeur excel



Si qqln avait déjà le code pour enregistrer les modifs



PS : c'est pas urgent...
0
Rejoignez-nous