2010-04-06 53 views
2

我有2个代码块,如果有人可以帮我把它们放在一起,我会得到我正在寻找的功能。第一个代码块下载一个GridView使用下载对话框我要找擅长:制作动态创建的Excel报告可下载

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 

的第二个代码块是一个示例报告,我想下载。所以,而不是下载gridview我想这个函数接受工作表对象。

评论弗兰克的建议... 弗兰克感谢您的帮助,这几乎为我工作。问题是代码崩溃,如果我没有一个名为test.xls在我的根文件夹中的虚拟文件。当我把它放在那里它然后加载2工作簿test.xls [1]和书2其中test.xls是一个空白的工作簿,书2是正确的动态创建的报告。我不想将这个文件保存在eroot文件夹中,如果我没有,我希望用户只需打开下载到他们的客户端。在创建之后woorkbook使用代码IM是... 昏暗FN作为字符串= “RptCrd_” & “BUNDLE” & “的.xls” 昏暗EIO作为字符串= “〜/ 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

我需要的函数接受工作簿对象而不是工作表而不是gridview – 2010-04-06 16:21:23

+0

也许我不明白你的问题。我以为你想把数据发送到Excel。这是让我失望的响应头路径。 – 2010-04-06 16:37:34

+0

我只是使用保存的电子表格作为测试来展示如何制定浏览器将解释为MS Excel电子表格的响应标头。 – 2010-04-06 18:14:36

回答

1

也许您需要将正确的内容类型和标题添加到您的响应中,以便浏览器知道您想要使用Excel处理下载。你可能会把这个放在Response.Write(style)之后;呼叫。

尝试使用谷歌搜索MS Excel MIME类型,以及如何将正确格式的标题和内容类型添加到您的响应。

我只是扔了一些代码在一起,吐出一个下载到浏览器,以便它可以处理它作为Excel电子表格。这应该给你一个如何格式化响应头的例子。

这只是读入一个现有的电子表格,然后将其馈送到响应流。这只是演示如何制定一个响应头。

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

如果你有时间的话,我会非常迷茫,因为这真的可以使用一些详细的帮助。如果我只是取出我读取xlWorksheet.SaveAs(文件名)的代码行,它会让我将文件保存到任何地方,但是出现的对话框是询问我是否要保存为“Book 3”,这有点儿奇怪的消息让用户看到。 – 2010-04-06 16:06:55

+0

我编辑了我的评论,以包含一些简单的代码,它构成了一个响应标题,它告诉浏览器进入的数据是用于Excel处理的。 – 2010-04-06 16:34:03

+0

弗兰克感谢您的帮助,这几乎为我工作。请阅读已编辑的问题 – 2010-04-06 18:04:50