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

el_teedee 498 Messages postés mercredi 7 juillet 2004Date d'inscription 13 juillet 2015 Dernière intervention - 6 août 2005 à 22:17 - Dernière réponse : el_teedee 498 Messages postés mercredi 7 juillet 2004Date d'inscription 13 juillet 2015 Dernière intervention
- 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 

18 réponses

Répondre au sujet
cs_coq 6366 Messages postés samedi 1 juin 2002Date d'inscription 2 août 2014 Dernière intervention - 7 août 2005 à 11:54
+3
Utile
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#
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de cs_coq
cs_Bidou 5507 Messages postés dimanche 4 août 2002Date d'inscription 20 juin 2013 Dernière intervention - 6 août 2005 à 22:29
0
Utile
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
cs_Bidou 5507 Messages postés dimanche 4 août 2002Date d'inscription 20 juin 2013 Dernière intervention - 6 août 2005 à 22:32
0
Utile
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
cs_coq 6366 Messages postés samedi 1 juin 2002Date d'inscription 2 août 2014 Dernière intervention - 6 août 2005 à 22:37
0
Utile
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
cs_Bidou 5507 Messages postés dimanche 4 août 2002Date d'inscription 20 juin 2013 Dernière intervention - 6 août 2005 à 22:44
0
Utile
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
el_teedee 498 Messages postés mercredi 7 juillet 2004Date d'inscription 13 juillet 2015 Dernière intervention - 7 août 2005 à 03:02
0
Utile
> 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
Lutinore 3248 Messages postés lundi 25 avril 2005Date d'inscription 27 octobre 2012 Dernière intervention - 7 août 2005 à 03:40
0
Utile
// 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
Lutinore 3248 Messages postés lundi 25 avril 2005Date d'inscription 27 octobre 2012 Dernière intervention - 7 août 2005 à 04:31
0
Utile
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
el_teedee 498 Messages postés mercredi 7 juillet 2004Date d'inscription 13 juillet 2015 Dernière intervention - 7 août 2005 à 12:06
0
Utile
> 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
el_teedee 498 Messages postés mercredi 7 juillet 2004Date d'inscription 13 juillet 2015 Dernière intervention - 7 août 2005 à 12:08
0
Utile
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
Lutinore 3248 Messages postés lundi 25 avril 2005Date d'inscription 27 octobre 2012 Dernière intervention - 7 août 2005 à 15:21
0
Utile
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
el_teedee 498 Messages postés mercredi 7 juillet 2004Date d'inscription 13 juillet 2015 Dernière intervention - 7 août 2005 à 15:27
0
Utile
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
cs_coq 6366 Messages postés samedi 1 juin 2002Date d'inscription 2 août 2014 Dernière intervention - 7 août 2005 à 15:30
0
Utile
Tssss, pas d'excuse, l'espion te le disais clairement pourtant ;-)

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

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