2010-05-11 57 views
0

我试图创建一些数据的csv文件。我已经写了一个函数,成功地做到这一点....在Streamwriter对象中使用本地文件路径ASP.Net

Private Sub CreateCSVFile(ByVal dt As DataTable, ByVal strFilePath As String) 
     Dim sw As New StreamWriter(strFilePath, False) 
     ''# First we will write the headers. 
     ''#DataTable dt = m_dsProducts.Tables[0]; 
     Dim iColCount As Integer = dt.Columns.Count 
     For i As Integer = 0 To iColCount - 1 
      sw.Write(dt.Columns(i)) 
      If i < iColCount - 1 Then 
       sw.Write(",") 
      End If 
     Next 
     sw.Write(sw.NewLine) 
     ''# Now write all the rows. 
     For Each dr As DataRow In dt.Rows 
      For i As Integer = 0 To iColCount - 1 
       If Not Convert.IsDBNull(dr(i)) Then 
        sw.Write(dr(i).ToString()) 
       End If 
       If i < iColCount - 1 Then 
        sw.Write(",") 
       End If 
      Next 
      sw.Write(sw.NewLine) 
     Next 
     sw.Close() 

    End Sub 

问题是我没有正确使用我想要完成的Streamwriter对象。由于这是一个asp.net,我需要用户选择一个本地文件路径来放置文件。如果我传递了这个函数的任何路径,它会尝试将它写入代码所在的服务器上指定的目录。我想这个弹出并让用户选择他们的本地机器上的一个地方放文件....

Dim exData As Byte() = File.ReadAllBytes(Server.MapPath(eio)) 
     File.Delete(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() 

我打电话这样的代码的第一个函数...

Dim emplTable As DataTable = SiteAccess.DownloadEmployee_H() 
    CreateCSVFile(emplTable, "C:\\EmplTable.csv") 

我不想指定文件位置(因为这会将文件放在服务器上而不是客户机上),而是让用户在其客户机上选择位置。

有人可以帮我把它放在一起吗?提前致谢。

我已经重新创建了我的导出函数,现在它让usr选择一个下载路径,但是下载的数据中的一列有“Doe,John”形式的数据,这一列被称为“EPLNME”输出文件,因为它读取数据中的逗号,现在数据已关闭输出文件中的一列可以有人帮我阻止这个特定的事件我不知道我怎么能。这里是代码...

Private Sub ExportCSV(ByVal data As DataTable, ByVal nameOfFile As String) 
    Dim context As HttpContext = HttpContext.Current 
    context.Response.Clear() 
    context.Response.ContentType = "text/csv" 
    context.Response.AddHeader("Content-Disposition", "attachment; filename=" + nameOfFile + ".csv") 

    ''#Write column header names 
    For i = 0 To data.Columns.Count - 1 
     If (i > 0) Then 
      context.Response.Write(",") 
     End If 
     context.Response.Write(data.Columns(i).ColumnName) 
    Next 
    context.Response.Write(Environment.NewLine) 

    ''#Write data 
    For Each row As DataRow In data.Rows 
     For i = 0 To data.Columns.Count - 1 
      If (i > 0) Then 
       context.Response.Write(",") 
      End If 
      context.Response.Write(row.Item(i).ToString()) 
     Next 
     context.Response.Write(Environment.NewLine) 
    Next 
    context.Response.End() 

End Sub 
+0

我想对您的问题进行排序的格式这是非常难以理解的。 – Yoda 2010-05-11 16:10:34

回答

2

首先替换的最后一行,你需要重载你的函数这样的,允许直接将您的输出到任何一个流或路径:

Private Sub CreateCSVFile(ByVal dt As DataTable, ByVal strFilePath As String) 
    Using sw As New StreamWriter(strFilePath) 
     CreateCSVFile(dt, sw) 
    End Using 
End Sub 

Private Sub CreateCSVFile(ByVal dt As DataTable, ByVal outStream As TextWriter) 
    ''# First we will write the headers. 
    Dim delimiter As String = String.Empty 
    For Each col As DataColumn in dt.Columns 
     outStream.Write(delimiter) 
     outStream.Write(col.ColumnName) 
     delimiter = "," 
    Next col   
    outStream.Write(outStream.NewLine) 

    int flushCount = 0; 

    ''# Now write all the rows. 
    For Each dr As DataRow In dt.Rows 
     delimiter = String.Empty 
     For i As Integer = 0 To dt.Columns.Count -1 
      outStream.Write(delimiter) 

      If Not Convert.IsDBNull(dr(i)) Then 
       outStream.Write("""") ''#Wrap fields in quotes to allow for commas in field data 

       ''# Need to escape the quotes as well 
       outStream.Write(dr(i).ToString().Replace("""", """""")) 

       outStream.Write("""") 
      End If 
      delimiter = "," 
     Next i 
     outStream.Write(outStream.NewLine) 

     ''# Flush the buffer periodically 
     flushCount += 1 
     If flushCount > 100 Then 
      outStream.Flush() 
      flushCount = 0 
     End If 
    Next dr 
End Sub 

请注意,您的函数与以前几乎完全相同,但您现在可以写入文件或直接写入流,并且不必重新编写大量代码即可使其工作。几乎所有你用文件编写的东西都应该这样写。我还对代码做了一些其他的改进,但最主要的是这样一种方法,实际的工作应该是总是接受TextWriter,然后只要添加重载,如果你想能够接受任何其他的文件路径。

现在你能做的就是头球奔罗宾逊的回答内容类型和并使用这个新的方法来直接写asp.net响应缓冲区:

Response.ContentType = "text/csv"; 
Response.AddHeader("Content-Disposition", "attachment; filename=NameOfFile"); 
CreateCSVFile(SiteAccess.DownloadEmployee_H(), Response.Output) 
Response.Flush() 
Response.End() 
+0

它告诉我响应不是TextWriter对象 – 2010-05-11 16:55:44

+0

@Nick - 糟糕,固定那个函数调用。我需要'Response.Output'。 – 2010-05-11 16:57:23

+0

我想我创造了适当的功能,但仍然不得不处理员工姓名的数据格式为“Doe,John”这个逗号正在搞乱我的功能。查看编辑的问题。谢谢你的帮助! – 2010-05-11 16:58:17

0

您可以使用MemoryStream将二进制数据保存在服务器上,而不是将它们写入文件。

1)写渊希望把在CSV为在需要时从MemoryStream的读入响应内存流

2)中的内容。

希望它有帮助!

1

你真的不喜欢一个Streamwriter,它是用来在代码运行的机器上创建文件的。使用StringBuilder建立表示CSV字符串文件,然后执行以下操作:

Response.ContentType = "text/csv"; 
Response.AddHeader("Content-Disposition", "attachment; filename=NameOfFile"); 
Response.Write(MyStringBuilder.ToString()); 

如果你需要创建一个文件,因为你需要将其存储在服务器上,也将其发送给用户。创建文件,你正在做的和与

Response.TransmitFile("filePath");