Sauvegarde de stream dans un .csv, .xls...

Résolu
renyone Messages postés 71 Date d'inscription vendredi 9 mars 2007 Statut Membre Dernière intervention 12 avril 2010 - 27 janv. 2009 à 15:05
renyone Messages postés 71 Date d'inscription vendredi 9 mars 2007 Statut Membre Dernière intervention 12 avril 2010 - 29 janv. 2009 à 11:26
Bonjour à tous.
Je vous explique mon problème: j'interroge un server exchange pou récupérer des pieces jointes dans des mails. Ces pieces jointes sont de tout type: xls, csv etc. La réponse est sous la forme de stream et il faut que j enregistre le stream au bon format.

Voici mon bout de code:
                Stream sr = REPONDSEDUSERVER();
                string sa = sr.ReadToEnd();
                StreamWriter sw = new StreamWriter(@"C:toto.ext");
                sw.Write(sa);
                sw.Close();

Ca, ca marche que si ext est de type .txt ou .xml.

Comment enregistrer un stream dans un format tel csv ou xls dans ce cas ?

Merci d avance.

4 réponses

renyone Messages postés 71 Date d'inscription vendredi 9 mars 2007 Statut Membre Dernière intervention 12 avril 2010 3
28 janv. 2009 à 15:30
Salut!
En fait j'ai tout simplement recopié bit à bit le stream dans un filestream local.

Stream stream = REPONSE DU SERVER;
byte[] bytesTab = ReadFully(stream, 0);
FileStream s = new FileStream(fileName, FileMode.Create);
foreach (byte b in bytesTab)
{
      s.WriteByte(b);
 }
     s.Close();

public static byte[] ReadFully(System.IO.Stream stream, int initialLength)
        {
          
            if (initialLength < 1)
            {
                initialLength = 32768;
            }

            byte[] buffer = new byte[initialLength];
            int read = 0;

            int chunk;
            while ((chunk = stream.Read(buffer, read, buffer.Length - read)) > 0)
            {
                read += chunk;

              
                if (read == buffer.Length)
                {
                    int nextByte = stream.ReadByte();

                    // End of stream? If so, we're done
                    if (nextByte == -1)
                    {
                        return buffer;
                    }

                  
                    byte[] newBuffer = new byte[buffer.Length * 2];
                    Array.Copy(buffer, newBuffer, buffer.Length);
                    newBuffer[read] = (byte)nextByte;
                    buffer = newBuffer;
                    read++;
                }
            }
          
            byte[] ret = new byte[read];
            Array.Copy(buffer, ret, read);
            return ret;
        }

Voili voilou.
Je recupere tout type de format comme ca: csv, xls, zip etc.
:)
3
thristam Messages postés 23 Date d'inscription mercredi 16 juillet 2003 Statut Membre Dernière intervention 28 mars 2013
27 janv. 2009 à 17:26
Salut,

Pour le csv, je ne pense pas qu'il y ait une stream qui le lit directement. Il faut un peu coder . Tu lis ton csv comme un txt, et tu utilises la fonction Split() pour lire chaque "cellules" ( on utilisant le séparateur tab pour ce format, il me semble ).

Pour lire le xls, il faut que tu utilises la librairie Microsoft Excel Object. Pour cela il faut installer [ms-help://MS.VSCC.v80/MS.MSDN.v80/MS.VisualStudio.v80.en/dv_vstcore/html/92948fcc-76c6-4b08-ba63-cab59dd60eb1.htm Office Primary Interop Assemblies]. Il se trouve que j'ai exactement le même problème que toi mais pour le .doc . Voici le lien du post. Merci de ne pas y poser des questions par rapport à ton post. Lis-le, suis-le ( pour Excel, bien sur ). Et repose-moi des questions dans ton post, j'y répondrai toujours car c en lien avec mon problème. J'ai déjà potassé ce problème de lecture xls depuis longtemps, ensemble on trouvera surement la solution. 
0
thristam Messages postés 23 Date d'inscription mercredi 16 juillet 2003 Statut Membre Dernière intervention 28 mars 2013
28 janv. 2009 à 16:52
Tu récupères les csv, xls en binaire, d'accord. Mais comment tu vas les utiliser ? A un moment donné, il faudra les convertir en texte ?
0
renyone Messages postés 71 Date d'inscription vendredi 9 mars 2007 Statut Membre Dernière intervention 12 avril 2010 3
29 janv. 2009 à 11:26
Je sais pas si j ai bien compris ce que tu voulais dire. Mais ce que je fais c'est:

recuperation du stream (qui encode tout type de fichier: xls, csv, zip etc.) ==> je recupere tous ses bytes byte[] bytetab ==> j'ecris ces bytes dans un fichier avec la bonne extension (filename a la bonne extension. Dans mon cas j'ai l'adresse du fichier sur le server. Je sais qu'elle se termine par csv, j'ajoute .csv à mon filename) ==> mon fichier "filename" contient toutes mes données au bon format.
0