2010-04-06 7 views
2

J'ai 2 blocs de code, si quelqu'un pouvait m'aider à les assembler, j'aurais la fonctionnalité que je recherche. Le premier bloc de code télécharge un gridview pour exceller en utilisant la boîte de dialogue de téléchargement Je cherche:Création d'un rapport Excel créé dynamiquement Téléchargeable

Public Overloads Overrides Sub VerifyRenderingInServerForm(ByVal control As Control) 
    ' Verifies that the control is rendered 
End Sub 

Private Sub ExportToExcel(ByVal filename As String, ByVal gv As GridView, ByVal numOfCol As Integer) 
    Response.Clear() 
    Response.Buffer = True 
    Response.AddHeader("content-disposition", String.Format("attachment; filename={0}", filename)) 
    Response.Charset = "" 
    Response.ContentType = "application/vnd.ms-excel" 
    Dim sw As New StringWriter() 
    Dim hw As New HtmlTextWriter(sw) 

    gv.AllowPaging = False 
    gv.DataBind() 

    'Change the Header Row back to white color 
    gv.HeaderRow.Style.Add("background-color", "#FFFFFF") 

    For i As Integer = 0 To numOfCol - 1 
     gv.HeaderRow.Cells(i).Style.Add("background-color", "blue") 
     gv.HeaderRow.Cells(i).Style.Add("color", "#FFFFFF") 

    Next 

    For i As Integer = 0 To gv.Rows.Count - 1 
     Dim row As GridViewRow = gv.Rows(i) 

     'Change Color back to white 
     row.BackColor = System.Drawing.Color.White 

     For j As Integer = 0 To numOfCol - 1 
      row.Cells(j).Style.Add("text-align", "center") 
     Next 


     'Apply text style to each Row 
     row.Attributes.Add("class", "textmode") 

     'Apply style to Individual Cells of Alternating Row 
     If i Mod 2 <> 0 Then 

      For j As Integer = 0 To numOfCol - 1 
       row.Cells(j).Style.Add("background-color", "#CCFFFF") 
       row.Cells(j).Style.Add("text-align", "center") 
       '#C2D69B 
       'row.Cells(j).Style.Add("font-size", "12pt") 
      Next 

     End If 
    Next 
    gv.RenderControl(hw) 

    'style to format numbers to string 
    Dim style As String = "<style> .textmode { mso-number-format:\@; } </style>" 
    Response.Write(style) 
    Response.Output.Write(sw.ToString()) 
    Response.Flush() 
    Response.End() 
End Sub 

Le deuxième bloc de code est un exemple de rapport que je suis souhaite télécharger. Donc, au lieu de télécharger un gridview, je veux que cette fonction accepte un objet de feuille de calcul.

Commentaire aux suggestions de Frank ... Merci pour votre aide, cela fonctionne presque pour moi. Le problème est le plantage de code si je n'ai pas un fichier factice appelé test.xls dans mon dossier racine. Et quand je l'ai mis là, il charge ensuite 2 cahiers d'exercices test.xls [1] et le livre 2 qui test.xls est un classeur vide et le livre 2 est le rapport dymanically créé correct. Je ne veux pas enregistrer ce fichier dans le dossier eroot si je n'ai pas trop, je veux que les utilisateurs s'ouvrent simplement de le télécharger à leur client. Le code im en utilisant après la création woorkbook est ... Dim fn As String = "RptCrd_" & "PAQUET" & ".xls" Dim EIO As String = "~/ContentDisposition /" & fn

Dim exData As Byte() = File.ReadAllBytes(Server.MapPath(eio)) 
    Response.AddHeader("content-disposition", String.Format("attachment; filename={0}", fn)) 
    Response.ContentType = "application/x-msexcel" 
    Response.BinaryWrite(exData) 
    Response.Flush() 
    Response.End() 
    releaseObject(xlApp) 
    releaseObject(xlWorkBook) 
+0

J'ai besoin de la fonction d'accepter un objet classeur pas une feuille de calcul au lieu d'un gridview –

+0

Peut-être que je ne comprends pas votre question. Je pensais que vous voulez envoyer les données à Excel. C'est ce qui m'a conduit dans le chemin de l'en-tête de réponse. –

+0

J'utilisais simplement une feuille de calcul enregistrée comme test pour montrer comment formuler un en-tête de réponse que le navigateur interpréterait comme une feuille de calcul MS Excel. –

Répondre

1

Peut-être que vous devez ajouter le type de contenu et l'en-tête appropriés à votre réponse afin que le navigateur sache que vous voulez gérer le téléchargement avec Excel. Vous mettriez probablement cela après le Response.Write (style); appel.

Essayez Google pour le type mime MS Excel, et aussi comment ajouter un en-tête et un type de contenu correctement formatés à votre réponse.

Je viens de jeter du code ensemble pour cracher un téléchargement dans le navigateur afin qu'il puisse le gérer comme une feuille de calcul Excel. Cela devrait vous donner un exemple de formatage des en-têtes de réponse.

Ceci lit juste dans une feuille de calcul existante puis l'envoie au flux de réponse. Cela montre juste comment formuler un en-tête de réponse.

byte[] excelData = File.ReadAllBytes(Server.MapPath("test.xls")); 

    Response.AddHeader("Content-Disposition", "attachment; filename=test.xls"); 
    Response.ContentType = "application/x-msexcel"; 
    Response.BinaryWrite(excelData); 
+0

J'ai très perdu sur celui-ci pourrait vraiment utiliser une aide détaillée si vous avez le temps. Si je retire simplement ma ligne de code qui lit xlWorksheet.SaveAs (nom de fichier), il me permettra d'enregistrer le fichier n'importe où, mais la boîte de dialogue qui me vient à l'esprit me demande si je veux enregistrer comme "Book 3" qui est un peu Wierd message pour les utilisateurs à voir. –

+0

J'ai modifié mon commentaire pour inclure du code simple qui forme un en-tête de réponse qui indique au navigateur que les données à traiter doivent être gérées par Excel. –

+0

Frank merci pour votre aide cela fonctionne presque pour moi. S'il vous plaît lire la question éditée –

Questions connexes