VB .NET服务器即时生成Excel文件

时间:2014-10-16 18:35:57

标签: html asp.net .net vb.net excel

我在服务器上运行的VB .NET Web应用程序具有多个请求和性能要求。 我有一个从数据库中检索一些数据的函数,并且必须生成一个excel报告以显示给系统用户。 我以某种方式做到了,但我的解决方案没有我想要的性能:基本上我的代码所做的是:

  • 服务器接受生成报告的请求
  • 服务器填写excel文件
  • 服务器本地保存 xls文件
  • 服务器将文件附加到html响应,用户下载
  • 服务器删除文件(何时?我还需要处理边界情况)

代码段如下:

Public Sub ExportaDataTableToExcel(ByVal dt As System.Data.DataTable, ByVal Page As System.Web.UI.Page, ByVal ReportName As String)
        Dim oExcel As Excel.Application
        Dim oBook As Excel.Workbook
        Dim oSheet As Excel.Worksheet
        Dim colIndex As Integer
        Dim rowIndex As Integer

        oExcel = New Excel.Application
        oBook = oExcel.Workbooks.Add(Type.Missing)
        oSheet = oBook.Worksheets(1)


        'Export the Columns to excel file
        For Each dc In dt.Columns
            colIndex = colIndex + 1
            oSheet.Cells(1, colIndex) = dc.ColumnName

        Next

        oBook.SaveAs("C:\file.xls")
        oSheet = Nothing
        oBook.Close()

        Page.Response.AddHeader("content-disposition", "attachment;filename=" & ReportName & ".xls")
        Page.Response.Charset = String.Empty
        Page.Response.ContentType = "vnd.application/ms-excel"


        Page.Response.TransmitFile("C:\file.xls")

        Page.Response.Flush()

        Page.Response.End()

        oExcel.Quit()
    End Sub

正如您所看到的,服务器在C:\ file.xls中本地生成xls文件,然后在响应页面中传输该文件。

我想做什么,我真的不知道是否有可能,因为我没有找到任何这方面的例子,是动态生成xls文件而不保存本地(可能返回为流字节或类似的东西)然后在响应页面中将其组装为xls文件,而不在本地保存文件。

我尝试使用Page和System.IO.StringWriter没有运气,也许我做错了。 以下代码异常行为,要求我在文件上保存修改(在服务器端),并下载包含页面html部分的xls文件,生成有关缺少css文件的错误并显示页面的一部分。所以,通过这种方法,我几乎为零。这是代码:

Public Sub ExportaDataTableToExcel(ByVal dt As System.Data.DataTable, ByVal Page As System.Web.UI.Page, ByVal ReportName As String)
        Dim oExcel As Excel.Application
        Dim oBook As Excel.Workbook
        Dim oSheet As Excel.Worksheet
        Dim colIndex As Integer
        Dim rowIndex As Integer

        oExcel = New Excel.Application
        oBook = oExcel.Workbooks.Add(Type.Missing)
        oSheet = oBook.Worksheets(1)


        'Export the Columns to excel file
        For Each dc In dt.Columns
            colIndex = colIndex + 1
            oSheet.Cells(1, colIndex) = dc.ColumnName

        Next

        oSheet = Nothing
        oBook.Close()


        Dim stringWrite As System.IO.StringWriter = New System.IO.StringWriter
        Dim htmlWrite As System.Web.UI.Html32TextWriter = New System.Web.UI.Html32TextWriter(stringWrite)
        Page.Response.Clear()
        Page.Response.AddHeader("content-disposition", "attachment;filename=" & ReportName & ".xls")
        Page.Response.Charset = String.Empty
        Page.Response.ContentType = "vnd.application/ms-excel"




        Page.Response.WriteFile(stringWrite.ToString)
        Page.Response.Flush()

        Page.Response.End()

        oExcel.Quit()
    End Sub

1 个答案:

答案 0 :(得分:2)

我知道我至少可以解决你遇到的其中一个问题,Lateralus。我从这里的实时服务器上拿了一个片段给你看。

编辑:这个传输一个CSV文件,我们最初遇到的问题是文件中出现的HTML。我们选择不在这个特定情况下使用excel,但问题可能是同一个问题。

我认为您需要在页面响应中添加额外的标头,以便删除您在文件中获得的HTML。

这是一个例子。作为警告,我不完全确定这种方法的安全性。我们在网络中使用它,因此它不需要像锁定一样。

Dim LiveFileStream As FileStream = New FileStream("C:\inetpub\wwwroot\" &_
"Website\CSVFile.csv", FileMode.Open, FileAccess.Read)
Dim fileBuffer(CInt(LiveFileStream.Length)) As Byte

LiveFileStream.Read(fileBuffer, 0, CInt(LiveFileStream.Length)) 
LiveFileStream.Close()

Response.Clear()
Response.Charset = "utf-8"
Response.ContentType = "text/plain"
'I believe if you are to add the following header
'it will fix the problem with HTML showing in document
Response.AddHeader("Content-Length", fileBuffer.Length.ToString) 
Response.AddHeader("Content-Disposition", "attachment; filename=CSVFile.csv")
Response.BinaryWrite(fileBuffer)
Response.End()