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