Associer une worksheet à un GridView, possible ?

Associer une worksheet à un GridView, possible ? - C#/.NET managed - Programmation

Marsh Posté le 01-07-2010 à 16:42:18    

Bonjour
 
Je récupère un fichier Excel d'une base de données, ce que je voudrais c'est retranscrire la feuille Excel dans mon GridView (avec les colonnes etc..) est ce que c'est possible ? Avez vous une piste à me donner ?
 
Actuellement, je bloque ici :

Code :
  1. ...
  2. Workbook theWorkbook = ExcelObj.Workbooks.Open(filePath, 0, true, 5, "", "", true, XlPlatform.xlWindows, "t", false, false, 0, true, null, null);
  3. Sheets sheets = theWorkbook.Worksheets;
  4. Worksheet worksheet = (Worksheet)sheets.get_Item(1);


J'ai donc ma worksheet, mais je ne sais pas comment l'associer à mon GridView.


---------------
Pire qu'une pierre dans la chaussure, est un grain de sable dans la capote.  Coluche.
Reply

Marsh Posté le 01-07-2010 à 16:42:18   

Reply

Marsh Posté le 05-07-2010 à 17:31:07    

Merci beaucoup pour ton lien.
 
J'ai un problème que je comprends pas malgré ça, le serveur est super long (j'arrive même pas à afficher la page tellement c'est long).
 
J'ai essayé de voir à quel niveau ca devenait long et c'est lors de l'ouverture du fichier excel et ce que je comprend pas c'est que le code est déjà utilisé ailleurs et ce n'est pas du tout long.

Code :
  1. Application ExcelObj = new Microsoft.Office.Interop.Excel.Application();
  2.         // See if the Excel Application Object was successfully constructed
  3.         if (ExcelObj == null)
  4.         {
  5.             LabelInfoTableau.Text = "Impossible de trouver Microsoft Excel.";
  6.             return;
  7.         }
  8.        
  9.         ExcelObj.Visible = false;
  10.         // Téléchargement de la base de données Excel de la fiche client
  11.         ParameterCollection p = new ParameterCollection();
  12.         p.Add("Client", CurrentUser.IdSociete.ToString());
  13.         System.Data.DataTable dt = ***WebTools.SelectAppQuery("SELECT Fichier FROM LogisticienXLSFichier WHERE (pk_idDoc = @Client)", p);
  14.        
  15.         string fichier = ***WebTools.Base64Decode(dt.Rows[0]["Fichier"].ToString());
  16.         byte[] fileinByte = Encoding.Default.GetBytes(fichier);
  17.         string filePath = Server.MapPath("~";) + "tmp" + ***WebTools.GetRandomString(5) + ".xls";
  18.         using (BinaryWriter binWriter = new BinaryWriter(File.Open(filePath, FileMode.Create)))
  19.         {
  20.             binWriter.Write(fileinByte);
  21.         }
  22.         try
  23.         {
  24.             // Ouverture du fichier temporaire
  25.             Workbook theWorkbook = ExcelObj.Workbooks.Open(filePath, 0, true, 5, "", "", true, XlPlatform.xlWindows, "t", false, false, 0, true, null, null);
  26.             Sheets sheets = theWorkbook.Worksheets;
  27.             Worksheet worksheet = (Worksheet)sheets.get_Item(1);
  28. ...


La suite du code c'est ce qu'il y a dans ton lien, mais en mettant des ligne en commentaire je constate que là où c'est super long c'est à ce niveau :
 

Code :
  1. Workbook theWorkbook = ExcelObj.Workbooks.Open(filePath, 0, true, 5, "", "", true, XlPlatform.xlWindows, "t", false, false, 0, true, null, null);


Et ce code là je l'utilise sur autre page sans soucis pourtant.
 
(mon fichier excel est enregistré en base sous forme binaire, ce que je fais ci-dessus c'est que je le récupère je créer un fichier xls temporaire que j'essaye d'ouvrir)
 
Note : J'ai demandé à l'admin réseaux d'analyser le serveur et il ne voit rien d'anormal apparemment.


Message édité par manu f le 05-07-2010 à 17:36:24

---------------
Pire qu'une pierre dans la chaussure, est un grain de sable dans la capote.  Coluche.
Reply

Marsh Posté le 05-07-2010 à 18:03:27    

C'est une première ouverture et oui j'ai tout fermer.


---------------
Pire qu'une pierre dans la chaussure, est un grain de sable dans la capote.  Coluche.
Reply

Marsh Posté le 06-07-2010 à 09:12:41    

En fait je travail directement sur le serveur de test et il y a pas de .sln donc je peux pas déboguer et je ne peux pas non plus importer les fichiers en local car mon pc rame de trop. (c'est pas moi qui ai codé 80% de l'appli.)
 
La ligne c'est exactement la même et dans mon catch j'envoie les éventuelles message d'erreur dans un fichier mais je viens de regarder et il n'y a rien.


---------------
Pire qu'une pierre dans la chaussure, est un grain de sable dans la capote.  Coluche.
Reply

Marsh Posté le 06-07-2010 à 13:51:28    

Le serveur http à souvent des problèmes donc je me demande si ça ne vient pas de là, au final à la place d'afficher mon fichier dans un GridView je vaisfaire beaucoup plus simple et le proposer en téléchargement.
 

Code :
  1. string fichier = *****.Base64Decode(tableFichier.Rows[0]["Fichier"].ToString());
  2.             byte[] fileinByte = Encoding.Default.GetBytes(fichier);
  3.             Response.AppendHeader("Content-Disposition", "attachment; filename=" + tableFichier.Rows[0]["LabelFichier"].ToString());
  4.             Response.ContentType = "application/octet-stream";
  5.             Response.OutputStream.Write(fileinByte, 0, fileinByte.Length);
  6.             //Response.BinaryWrite();
  7.             Response.End();


Là ça propose bien le fichier en téléchargement, le soucis c'est que l'utilisateur doit sélectionner avec quel logiciel l'ouvrir et c'est pas top.
 
Ce qu'il me manque c'est le contentType et le problème c'est que lors de la sauvegarde en base j'utilise une dll interne à ma boite qui sauvegarde le fichier en base mais pas le contentType...
 
Je me demande si à partir du fichier c'est possible de le récupérer (ce que je doute).

Message cité 1 fois
Message édité par manu f le 06-07-2010 à 13:52:02

---------------
Pire qu'une pierre dans la chaussure, est un grain de sable dans la capote.  Coluche.
Reply

Marsh Posté le 06-07-2010 à 21:24:05    

Pareil, il doit y avoir une astuce. Détecter le type d'un fichier est généralement possible à partir de l'entête pourvu qu'on s'en tienne aux formats les plus courants, mais c'est naze de devoir en passer par là, l'info n'aurait pas du se perdre en route. Et puis il faut bien qu'à un moment on nomme le fichier et qu'on dise à l'utilisateur ce qu'il est en train d'ouvrir...
De toute façon si tu voulais l'afficher dans un GV c'est qu'il était manipulable à un moment, à moins que tu ne te sois rendu compte que par la suite que tu n'as pas tjs affaire à du excel...

 

edit : rq dans une boite qui développe directement sur le serveur tt est possible :p.

Message cité 1 fois
Message édité par TotalRecall le 06-07-2010 à 21:26:17

---------------
Réalisation amplis classe D / T      Topic .Net - C# @ Prog
Reply

Marsh Posté le 07-07-2010 à 09:56:39    

TotalRecall a écrit :

Pareil, il doit y avoir une astuce. Détecter le type d'un fichier est généralement possible à partir de l'entête pourvu qu'on s'en tienne aux formats les plus courants, mais c'est naze de devoir en passer par là, l'info n'aurait pas du se perdre en route. Et puis il faut bien qu'à un moment on nomme le fichier et qu'on dise à l'utilisateur ce qu'il est en train d'ouvrir...
De toute façon si tu voulais l'afficher dans un GV c'est qu'il était manipulable à un moment, à moins que tu ne te sois rendu compte que par la suite que tu n'as pas tjs affaire à du excel...
 
edit : rq dans une boite qui développe directement sur le serveur tt est possible :p.


Normalement ça doit être que des fichiers excel. Mais j'ai vu des utilisateurs mettre n'importe quoi en pièce jointe(photo, pdf, fichier word...) et il faut que ça puisse être visualisé dans tous les cas...
 
Pour ton édit, c'est clair que développer directement sur le serveur de test c'est vraiment pas génial mais en local c'est vraiment impossible vu comment ca rame/bug etc...
Après je cracherais pas sur ma boite car elle me convient parfaitement (et elle vient de m'embaucher  :D ) seulement là c'est un projet un peu particulier ou plein de développeurs ont mis leur petite sauce et qui a été fait quasiment sans analyse d'après ce qu'on m'a dit donc forcément c'est pas top et je vois pas mal de perle :D


---------------
Pire qu'une pierre dans la chaussure, est un grain de sable dans la capote.  Coluche.
Reply

Marsh Posté le 07-07-2010 à 17:42:21    

J'approuve pour le fait d'utiliser l'entête, par contre j'espère bien qu'il y a des moyens moins lourds qu'appeler un EXE dont on grep la sortie standard :fouyaya:. Il doit bien avoir un mec qui a pondu une DLL managée ou au pire COM pour arriver au même résultat...

 

Cela dit, si tu as 3 DLs par heure TRID est un super outil :o (pense à prendre les définitions à jour, celles dans l'EXE ont au moins 5 ans)


Message édité par TotalRecall le 07-07-2010 à 17:42:50

---------------
Réalisation amplis classe D / T      Topic .Net - C# @ Prog
Reply

Marsh Posté le 08-07-2010 à 15:13:46    

Hello  
 
Je donne des petites nouvelles, en fait ce code :

Code :
  1. string fichier = *****.Base64Decode(tableFichier.Rows[0]["Fichier"].ToString());
  2. byte[] fileinByte = Encoding.Default.GetBytes(fichier);
  3. Response.AppendHeader("Content-Disposition", "attachment; filename=" + tableFichier.Rows[0]["LabelFichier"].ToString());
  4. Response.ContentType = "application/octet-stream";
  5. Response.OutputStream.Write(fileinByte, 0, fileinByte.Length);
  6. //Response.BinaryWrite();
  7. Response.End();


Me propose bien le téléchargement du fichier sans que l'utilisateur n'a à sélectionné le logiciel lui même.  
 
Le problème que je rencontrais, c'est apparemment uniquement lié à un certain type de fichier Excel, là j'ai refais des test avec des .xls, .pdf etc... et ça fonctionne.


Message édité par manu f le 08-07-2010 à 15:14:39

---------------
Pire qu'une pierre dans la chaussure, est un grain de sable dans la capote.  Coluche.
Reply

Marsh Posté le 08-07-2010 à 17:56:56    

Si je comprend bien, tableFichier.Rows[0]["LabelFichier"].ToString() contient le nom du fichier. Effectivement, ça contredit tes affirmations précédentes : tu connais donc l'extension.

 

Au risque de me tromper, je pense qu'envoyer en ContentType "application/octet-stream" c'est pas optimal, je ne sais pas trop ce que ça fait mais j'imagine que ça laisse le navigateur se démerder pour trouver l'applicatif à utiliser (certainement en fonction du nom fourni au content disposition ou de l'entête).
Tu pourrais peut être spécifier le bon type MIME directement selon l'extension, mais si ça marche ocmme ça sur tous les navigateurs laisse tomber.


Message édité par TotalRecall le 08-07-2010 à 17:57:08

---------------
Réalisation amplis classe D / T      Topic .Net - C# @ Prog
Reply

Marsh Posté le 08-07-2010 à 17:56:56   

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed