Conversion string[,] depuis System.Array [Résolu]

Messages postés
498
Date d'inscription
mercredi 7 juillet 2004
Dernière intervention
13 juillet 2015
- - Dernière réponse : el_teedee
Messages postés
498
Date d'inscription
mercredi 7 juillet 2004
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... ?
Afficher la suite 

Votre réponse

18 réponses

Meilleure réponse
Messages postés
6366
Date d'inscription
samedi 1 juin 2002
Dernière intervention
2 août 2014
3
Merci
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#

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources a aidé 106 internautes ce mois-ci

Commenter la réponse de cs_coq
Messages postés
5507
Date d'inscription
dimanche 4 août 2002
Dernière intervention
20 juin 2013
0
Merci
Salut,
Tu as essayé la méthode Copy de la class Array ?

[Pub] http://www.csharpfr.com/auteurdetail.aspx?ID=13319 [\Pub]
C# forever
Commenter la réponse de cs_Bidou
Messages postés
5507
Date d'inscription
dimanche 4 août 2002
Dernière intervention
20 juin 2013
0
Merci
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
Commenter la réponse de cs_Bidou
Messages postés
6366
Date d'inscription
samedi 1 juin 2002
Dernière intervention
2 août 2014
0
Merci
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#
Commenter la réponse de cs_coq
Messages postés
5507
Date d'inscription
dimanche 4 août 2002
Dernière intervention
20 juin 2013
0
Merci
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
Commenter la réponse de cs_Bidou
Messages postés
498
Date d'inscription
mercredi 7 juillet 2004
Dernière intervention
13 juillet 2015
0
Merci
> 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...
Commenter la réponse de el_teedee
Messages postés
3248
Date d'inscription
lundi 25 avril 2005
Dernière intervention
27 octobre 2012
0
Merci
// 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;
Commenter la réponse de Lutinore
Messages postés
3248
Date d'inscription
lundi 25 avril 2005
Dernière intervention
27 octobre 2012
0
Merci
C'est peut être un type d'Excel, Range ou Cell un truc comme ca:

Range r = ( Range )value;
Commenter la réponse de Lutinore
Messages postés
498
Date d'inscription
mercredi 7 juillet 2004
Dernière intervention
13 juillet 2015
0
Merci
> 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
Commenter la réponse de el_teedee
Messages postés
498
Date d'inscription
mercredi 7 juillet 2004
Dernière intervention
13 juillet 2015
0
Merci
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;

}
Commenter la réponse de el_teedee
Messages postés
3248
Date d'inscription
lundi 25 avril 2005
Dernière intervention
27 octobre 2012
0
Merci
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. : )
Commenter la réponse de Lutinore
Messages postés
498
Date d'inscription
mercredi 7 juillet 2004
Dernière intervention
13 juillet 2015
0
Merci
C vrai merci les gars,



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



@++
Commenter la réponse de el_teedee
Messages postés
6366
Date d'inscription
samedi 1 juin 2002
Dernière intervention
2 août 2014
0
Merci
Tssss, pas d'excuse, l'espion te le disais clairement pourtant ;-)

Cocoricoooooooo !!!!
coq
MVP Visual C#
Commenter la réponse de cs_coq
Messages postés
5507
Date d'inscription
dimanche 4 août 2002
Dernière intervention
20 juin 2013
0
Merci
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
Commenter la réponse de cs_Bidou
Messages postés
6366
Date d'inscription
samedi 1 juin 2002
Dernière intervention
2 août 2014
0
Merci
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#
Commenter la réponse de cs_coq
Messages postés
3248
Date d'inscription
lundi 25 avril 2005
Dernière intervention
27 octobre 2012
0
Merci
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( );
Commenter la réponse de Lutinore
Messages postés
3248
Date d'inscription
lundi 25 avril 2005
Dernière intervention
27 octobre 2012
0
Merci
Oups.. Cells ( avec un s ) pas Cell.

Vive la classe Object et les méthodes virtuelles : )
Commenter la réponse de Lutinore
Messages postés
498
Date d'inscription
mercredi 7 juillet 2004
Dernière intervention
13 juillet 2015
0
Merci
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...
Commenter la réponse de el_teedee

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.