2017-09-27 5 views
0

J'utilise des données d'exportation C# pour exceller. Cela fonctionne bien au début. L'exportation est déclenchée via un événement bouton, si l'utilisateur demande plusieurs exportations de la même page dans une ligne, je commence à recevoir l'erreur "Impossible de lire le fichier". Si je sélectionne le fichier "SAVE" au lieu d'ouvrir, alors il écrit bien le fichier. Il ne suffit pas d'ouvrir le fichier dans le navigateur.Impossible de lire le fichier lors de l'exportation vers Excel en C#

Je suis assez certain que l'erreur provient d'Excel, car Excel s'ouvre mais ne charge pas mon fichier.

Je lis à propos de Response.End et de Response.Close ... Certains disent ne jamais les utiliser pour les utiliser. J'ai essayé toutes les combinaisons de Fin et de Fermeture. Mon instinct que quelque chose est en train d'être mis en cache en mémoire, parce que je ferme mon navigateur (ou attendez longtemps), cela semble éclaircir le problème. Est-ce que quelqu'un a une idée de ce qui pourrait être faux, ou du moins comment dire pourquoi Excel est incapable de lire mon fichier quand je peux l'écrire et l'ouvrir à partir de mon disque dur sans problème?

 protected void btnSaveToXls_Click(object sender, EventArgs e) 
{ 

    Response.ClearHeaders(); 
    Response.Cache.SetCacheability(HttpCacheability.Private); 
    Response.Buffer = true; 
    Response.AddHeader("content-transfer-encoding", "binary"); 
    Response.Clear();   
    Response.AddHeader("Content-Disposition", "attachment; filename=myFileName.xls"); 
    Response.AddHeader("pragma", "private"); 
    Response.ContentType = "application/vnd.ms-excel"; 

    using (StringWriter sw = new StringWriter()) 
    { 
     // The main purpose of these next two writes are to name the worksheet and add the gridlines to the excel sheet 
     sw.Write(@"<html xmlns:x=""urn:schemas-microsoft-com:office:excel"">"); 
     sw.Write(@"<head> 
       <xml> 
       <x:ExcelWorkbook> 
        <x:ExcelWorksheets> 
         <x:ExcelWorksheet> 
          <x:Name>Clients Contacted</x:Name> 
          <x:WorksheetOptions> 
           <x:Panes></x:Panes> 
           <x:Print><x:Gridlines /></x:Print> 
          </x:WorksheetOptions> 
         </x:ExcelWorksheet> 
        </x:ExcelWorksheets> 
       </x:ExcelWorkbook> 
       </xml> 
      </head>"); 

     using (HtmlTextWriter htw = new HtmlTextWriter(sw)) 
     { 
      Label newLine = new Label(); 
      newLine.Text = "<br/>"; 
      GridView gv = new GridView(); 
      gv.GridLines = GridLines.Both; 
      gv.HeaderStyle.Font.Bold = true; 

      //. . . 
      // a bunch of code here to populate my gridview 
      //. . . 

      Panel p = new Panel(); 
      p.Controls.Add(lblTitle); 
      p.Controls.Add(new Label { Text = "<BR/>" }); 
      p.Controls.Add(lblReportTitle); 
      p.Controls.Add(new Label { Text = "<BR/>" }); 
      p.Controls.Add(new Label { Text = string.Format("Run Date {0}", DateTime.Now.ToString("MM/dd/yyyy")) }); 
      p.Controls.Add(new Label { Text = "<BR/>" }); 
      p.Controls.Add(new Label { Text = "<BR/>" }); 
      p.Controls.Add(gv); 

      p.RenderControl(htw); 
      try 
      { 
       // Response.Clear(); 
       sw.Write("</html>"); 
       Response.Buffer = true; 
       Response.Output.Write(sw.ToString()); 
       // Response.Output.Flush(); 
       Response.Flush(); 
       // Response.End(); 
      } 
      catch (Exception ex) 
      { 
       //... Logging the error ... 
      } 
      finally 
      { 
       Response.Close(); 
      } 
     } 
    } 
} 
+1

formatez votre pièce jointe correctement par exemple, essayez de le faire fonctionner en utilisant ce style de syntaxe sans la chaîne.Format fonction d'abord. 'Response.AddHeader" Content-Disposition "," pièce jointe; nomfichier = monNomFichier.xls "' – MethodMan

+0

@MethodMan Ok. J'ai pris votre suggestion et j'ai veillé à ce que mon exemple fonctionne. Avant de couper les bits pour rendre l'exemple plus court et pour des raisons de sécurité. Le code mis à jour a toujours le même problème. – rnesolydev

Répondre

0

Voici ce que j'ai découvert. Le problème semble être que la deuxième fois autour de vous devez attendre la boîte de dialogue de I.E. (qui vous invite à "Ouvrir", "Enregistrer" ou "annuler") pour changer sa couleur de fond. Dans mon cas, il est passé d'un fond blanc à un fond jaune. Je suppose que le document n'a pas été entièrement téléchargé sur le client avant Excel a essayé de l'ouvrir. Chrome m'a donné une erreur si je suis allé trop vite, mais il l'a quand même ouvert, et le fichier semblait bien.