【问题标题】:VB .NET server generating Excel file on the flyVB .NET 服务器动态生成 Excel 文件
【发布时间】:2014-10-16 18:35:56
【问题描述】:

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

  • 服务器接受报表生成请求
  • 服务器填写一个excel文件
  • 服务器在本地保存 xls 文件
  • 服务器将文件附加到 html 响应中,用户下载它
  • 服务器删除文件(什么时候?我也需要处理临界情况)

sn-p的代码是这样的:

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 文件而不将其保存在本地(可能以 Stream 的形式返回字节或类似的东西),然后在响应页面中将其组装为 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

【问题讨论】:

  • 您不应该使用 Excel 自动化来进行服务器端报告:它有很多问题,还有其他可用的替代方法。 google.com/?gws_rd=ssl#safe=off&q=NET+Excel+reporting
  • 不幸的是我没有足够的运气在服务器上安装东西......我想我需要面对我所拥有的。

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


【解决方案1】:

我知道我至少可以帮助您解决其中一个问题,Lateralus。我已经从我们的实时服务器中获取了一个 sn-p 来向您展示。

编辑:这个传输一个 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()

【讨论】:

  • 因此,例如,设置 content-length 标头会将所有 html 内容发送出去吗?我可以添加我选择的标题吗?
  • content-length 标头指定响应正文中数据的字节数。话虽如此,变量“文件缓冲区”基本上指定了 HTML 的字节长度,允许您将其剪掉。
  • 没关系,谢谢。假设我不能在我的服务器上保存 xls,我不能从文件路径中检索 FileStream,所以我不能分配缓冲区。明天我会尝试添加一些其他标题,希望它至少对文件中的 html 噪音起作用。
  • 啊。这会导致一些问题。使用这种方法,我只是在站点上创建一个临时文件,然后在传输后删除。但是,在你的情况下,如果你不能保存它......好吧,那是另一个问题。希望我的回答背后的逻辑能够以某种方式提供帮助。
  • 我想我可以保存它,但我应该处理这个问题,以确保用户在删除之前保存了文件。有没有什么简单明了的东西可以完成这样的需求?
猜你喜欢
  • 2020-07-11
  • 1970-01-01
  • 2014-01-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多