IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

ASP.NET Discussion :

refresh après export Excel avec HttpContext.Current.Response


Sujet :

ASP.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2012
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2012
    Messages : 17
    Par défaut refresh après export Excel avec HttpContext.Current.Response
    Bonjour,

    Pour placer le contexte, j'ai une petite interface avec 2 paramètres à choisir puis un bouton qui va lancer le traitements des données que j'enregistre dans une base SQL server. Puis à la fin du traitement, je transfert des données de la base SQL via une requête incluant les paramètres dans une datatable, que j'exporte vers le client sous Excel via cette méthode:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
     private void ExporttoExcel(DataTable table)
            {
                HttpContext.Current.Response.Clear();
                HttpContext.Current.Response.ClearContent();
                HttpContext.Current.Response.ClearHeaders();
                HttpContext.Current.Response.Buffer = true;
                HttpContext.Current.Response.ContentType = "application/ms-excel";
                HttpContext.Current.Response.Write(@"<!DOCTYPE HTML PUBLIC ""-//W3C//DTD HTML 4.0 Transitional//EN"">");
                HttpContext.Current.Response.AddHeader("Content-Disposition", "attachment;filename=detail.xls");
                HttpContext.Current.Response.Charset = "utf-8";
                HttpContext.Current.Response.ContentEncoding = System.Text.Encoding.GetEncoding("windows-1250");
                //sets font
                HttpContext.Current.Response.Write("<font style='font-size:10.0pt; font-family:Calibri;'>");
                HttpContext.Current.Response.Write("<BR><BR><BR>");
                //sets the table border, cell spacing, border color, font of the text, background, foreground, font height
                HttpContext.Current.Response.Write("<Table border='1' bgColor='#ffffff' " +
                    "borderColor='#000000' cellSpacing='0' cellPadding='0' " +
                    "style='font-size:11.0pt; font-family:Calibri;'> <TR>");
                //am getting my grid's column headers
                int columnscount = table.Columns.Count;
     
                for (int j = 0; j < columnscount; j++)
                {      //write in new column
                    HttpContext.Current.Response.Write("<Td>");
                    //Get column headers  and make it as bold in excel columns
                    HttpContext.Current.Response.Write("<B>");
                    HttpContext.Current.Response.Write(table.Columns[j].Caption);
     
                    HttpContext.Current.Response.Write("</B>");
                    HttpContext.Current.Response.Write("</Td>");
                }
                HttpContext.Current.Response.Write("</TR>");
                foreach (DataRow row in table.Rows)
                {//write in new row
                    HttpContext.Current.Response.Write("<TR>");
                    for (int i = 0; i < table.Columns.Count; i++)
                    {
                        HttpContext.Current.Response.Write("<Td>");
                        HttpContext.Current.Response.Write(row[i].ToString());
                        HttpContext.Current.Response.Write("</Td>");
                    }
     
                    HttpContext.Current.Response.Write("</TR>");
                }
                HttpContext.Current.Response.Write("</Table>");
                HttpContext.Current.Response.Write("</font>");
                try
                {
                    HttpContext.Current.Response.Flush();
                    HttpContext.Current.Response.End();
                }
                catch(Exception e)
                {
                    string msg = e.Message;
                    HttpContext.Current.Response.End();
                }
            }
    Pendant le traitement des données, j'affiche un petit élément dynamique javascript (type gif animé) que je lance via l'évènement "OnClientClick" de cette manière :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <asp:Button ID="btnCalculer" runat="server" Text="Calculer" Width="122px" OnClick="btnCalculer_Click" OnClientClick="javascript:showWait();" />
    J'ai mon bouton dans une div nommé id="lebouton" et mon élément indiquant le traitement en cours dans une div nommé id="patienter". Voici mes 2 fonctions en javascript:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    <script lang="javascript" type="text/javascript">
        function showWait() {
            var opts = {
                lines: 11, // The number of lines to draw
                length: 5, // The length of each line
                width: 3, // The line thickness
                radius: 7, // The radius of the inner circle
                corners: 1, // Corner roundness (0..1)
                rotate: 12, // The rotation offset
                direction: 1, // 1: clockwise, -1: counterclockwise
                color: '#000', // #rgb or #rrggbb or array of colors
                speed: 1, // Rounds per second
                trail: 60, // Afterglow percentage
                shadow: false, // Whether to render a shadow
                hwaccel: false, // Whether to use hardware acceleration
                className: 'spinner', // The CSS class to assign to the spinner
                zIndex: 2e9, // The z-index (defaults to 2000000000)
                top: 2, // Top position relative to parent in px
                left: 5 // Left position relative to parent in px
            };
            var target = document.getElementById('patienter');
            var spinner = new Spinner(opts).spin(target);
            target.style.display = '';
            document.getElementById('lebouton').style.display = 'none';
        }
        function showBtn() {
            var target = document.getElementById('patienter');
            target.style.display = 'none';
            document.getElementById('lebouton').style.display = '';
        }
    </script>
    Le téléchargement du fichier Excel se fait très bien pas de problème et mon élément dynamique s'affiche parfaitement bien.

    Mon problème est qu'à la fin de l'export du fichier Excel, je n'arrive pas à cacher ma div "patienter" et afficher ma div "lebouton". D'après ce que j'ai pu lire, c'est à cause de la fonction "HttpContext.Current.Response.End();" mais je ne vois pas du tout comment contourner ça...

    Ce que j'ai déjà essayé:
    - ce code avant ou après l'export
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Page.ClientScript.RegisterStartupScript(Page.GetType(), "showBtn", "<script language='javascript'> showBtn(); </script>");
    - avant le End()
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Response.Write("<script language='javascript'> showBtn(); </script>");
    - remplacer Response.End() par Response.Close() et HttpContext.Current.ApplicationInstance.CompleteRequest();

    Donc en gros après la fonction Response.End() je ne sais pas comment reprendre la main pour soit réafficher ou ma div ou même actualiser la page...

    Quelqu'un pour m'orienter?

  2. #2
    Expert confirmé

    Avatar de FirePrawn
    Homme Profil pro
    Consultant technique
    Inscrit en
    Mars 2011
    Messages
    3 179
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Consultant technique

    Informations forums :
    Inscription : Mars 2011
    Messages : 3 179
    Par défaut


    J'aurais tendance à dire que c'est logique vu que tu clos la requête HTTP

    Une solution pourrait être un script js sur ta page qui au chargement de celle ci (onload) affiche la bonne div.
    Avant toute chose : lire le mode d'emploi du forum et ses règles.
    Je ne réponds pas aux questions techniques en MP.

  3. #3
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2012
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2012
    Messages : 17
    Par défaut
    C'est pas faux...

    J'ai oublié de le noter, j'ai essayé aussi cette fonction dans le Page_Load() du mon code behind:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Page.ClientScript.RegisterStartupScript(Page.GetType(), "showBtn", "<script language='javascript'> showBtn(); </script>");
    Ca ne marche pas...

    Petite indiquation aussi (ça peut peut-être aider) mon mon spin animé javascript s'arrête au moment au le téléchargement de mon fichier se déclenche!

  4. #4
    Expert confirmé

    Avatar de FirePrawn
    Homme Profil pro
    Consultant technique
    Inscrit en
    Mars 2011
    Messages
    3 179
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Consultant technique

    Informations forums :
    Inscription : Mars 2011
    Messages : 3 179
    Par défaut
    Pourquoi faire ça dans le PageLoad ?

    Tu veux exécuter du javascript au chargement de la page, fais le.

    Avec jquery :

    Code javascript : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $(document).ready(function() {
    $('#tadiv').css('display', 'block');
    });
    Avant toute chose : lire le mode d'emploi du forum et ses règles.
    Je ne réponds pas aux questions techniques en MP.

  5. #5
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2012
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2012
    Messages : 17
    Par défaut
    Je n'avais pas pensé à jquery...

    Mais j'ai toujours le même problème
    J'ai essayé ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <script src="jquery-1.9.1.js"></script>
    <script lang="javascript" type="text/javascript">
        $(document).ready(function () {
            $('#lebouton').css('display', 'block');
            $('#patienter').css('display', 'none');
        });</script>
    J'ai l'impression que le "HttpContext.Current.Response.End();" fige complètement tous les traitements et mon interface.

  6. #6
    Expert confirmé

    Avatar de FirePrawn
    Homme Profil pro
    Consultant technique
    Inscrit en
    Mars 2011
    Messages
    3 179
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Consultant technique

    Informations forums :
    Inscription : Mars 2011
    Messages : 3 179
    Par défaut
    Tu es sûr que tu as pas une erreur JavaScript ?
    Avant toute chose : lire le mode d'emploi du forum et ses règles.
    Je ne réponds pas aux questions techniques en MP.

  7. #7
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2012
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2012
    Messages : 17
    Par défaut
    J'ai contourné mon problème en plaçant mon code de génération de mon fichier dans une autre page que j'appelle à la fin du traitements des données dans ma page accueil via:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Response.Write("<script type='text/javascript'>window.open('download.aspx','_blank');</script>");
    Donc quand le nouvel onglet s'ouvre avec ma page "download.aspx" mes div s'actualisent bien. Dans le "Page_Load" du code behind de ma page download.aspx, je fais ma requête sql avec les données dont j'ai besoin puis j'utilise ma fonction "ExportToExcel(madatatable)", le popup de téléchargement s'affiche et l'onglet ouvert pour le téléchargement se ferme tout seul

    Merci pour les réponses!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Tutoriel Microsoft BI : Import/Export Excel avec SSIS
    Par Fleur-Anne.Blain dans le forum SSIS
    Réponses: 0
    Dernier message: 01/05/2008, 20h40
  2. Export Excel avec POI
    Par fiatlux dans le forum Documents
    Réponses: 4
    Dernier message: 10/12/2007, 17h29
  3. Export Excel avec format sans Excel
    Par Seb.26 dans le forum Windows Forms
    Réponses: 11
    Dernier message: 07/02/2007, 12h18
  4. export -> excel avec insertion d'une colonne vide
    Par Gary_Stoupy dans le forum Access
    Réponses: 5
    Dernier message: 16/01/2007, 11h11
  5. Export excel avec JRCsvExporter !
    Par eric95 dans le forum JSF
    Réponses: 9
    Dernier message: 30/11/2006, 18h16

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo