这是我已经得到了。它的工作。但是,有一个简单的或更好的办法?

一个ASPX页,我得下载链接...

<asp:HyperLink ID="HyperLinkDownload" runat="server" NavigateUrl="~/Download.aspx">Download as CSV file</asp:HyperLink>

然后我下载。aspx。vb码后面...

Public Partial Class Download
    Inherits System.Web.UI.Page

    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        'set header
        Response.Clear()
        Response.ContentType = "text/csv"
        Dim FileName As String = "books.csv"
        Response.AppendHeader("Content-Disposition", "attachment;filename=" + FileName)

        'generate file content
        Dim db As New bookDevelopmentDataContext
        Dim Allbooks = From b In db.books _
                       Order By b.Added _
                       Select b
        Dim CsvFile As New StringBuilder
        CsvFile.AppendLine(CsvHeader())
        For Each b As Book In Allbooks
            CsvFile.AppendLine(bookString(b))
        Next

        'write the file
        Response.Write(CsvFile.ToString)
        Response.End()
    End Sub

    Function CsvHeader() As String
        Dim CsvLine As New StringBuilder
        CsvLine.Append("Published,")
        CsvLine.Append("Title,")
        CsvLine.Append("Author,")
        CsvLine.Append("Price")
        Return CsvLine.ToString
    End Function

    Function bookString(ByVal b As Book) As String
        Dim CsvLine As New StringBuilder
        CsvLine.Append(b.Published.ToShortDateString + ",")
        CsvLine.Append(b.Title.Replace(",", "") + ",")
        CsvLine.Append(b.Author.Replace(",", "") + ",")
        CsvLine.Append(Format(b.Price, "c").Replace(",", ""))
        Return CsvLine.ToString
    End Function

End Class
有帮助吗?

解决方案

CSV格式有一些陷阱。你有没有问过自己这些问题:

  • 不我的任何数据埋有逗号?
  • 不我的任何数据埋有双引号?
  • 不我的任何数据必须具有新行?
  • 我需要的支持Unicode串?

我看到几个问题,在你的代码以上。逗号件事首先...你是剥逗号:

CsvLine.Append(Format(b.Price, "c").Replace(",", ""))

为什么?在CSV,你应该周围的任何有逗号与行情:

CsvLine.Append(String.Format("\"{0:c}\"", b.Price))

(或类似的东西...我VB不是非常好)。如果你不知道如果有逗号,而是放在引号。如果有引号,你需要逃离他们通过增加一倍。 " 变得 "".

b.Title.Replace("\"", "\"\"")

然后围绕这个报价如果你想要的。如果有内容的行在你的串,需要围绕串行情...是的,文字内容的行 允许在CSV文件。它看起来怪怪的人,但这一切都很好。

一个很好的CSV作家需要一些想法。一个很好的CSV读者(parser)只是普通的硬(无,regex不够好为解析CSV...这只会让你的大约95%的方式那里)。

然后有Unicode...或者更一般I18N(国际)问题。例如,你是剥逗号一格式的价格。但是,这是假定的价格格式化,正如你指望它在我们的。在法国,数字格式是相反的(期间用于替代逗号, 反之亦然).底线,使用文化无关的格式,无论可能的。

而这里的问题是 CSV,不可避免地你会需要分析CSV。中。净,最好的解析我们发现(免费)是 快CSV读者演示.我实际上已经使用了它在生产码它是真的真的很快,非常易于使用的!

其他提示

我通过我所有的CSV数据通过一种功能是这样的:

Function PrepForCSV(ByVal value As String) As String
    return String.Format("""{0}""", Value.Replace("""", """"""))
End Function

还有,如果你不服务html你可能想http处理程序(.作为hx文件),而不是一个完整的网页。如果创建一个新的处理程序在Visual Studio,赔率是你可能仅仅复制过去的现有码进入的主要方法,它只会的工作,与一个小型的性能提高你的努力。

你可以创造相当于bookString()在查询本身。这里是什么,我认为将是一个更简单的方法。

protected void Page_Load(object sender, EventArgs e)
{
    using (var db = new bookDevelopmentDataContext())
    {
        string fileName = "book.csv";
        var q = from b in db.books
                select string.Format("{0:d},\"{1}\",\"{2}\",{3:F2}", b.Published, b.Title.Replace("\"", "\"\""), b.Author.Replace("\"", "\"\""), t.price);

        string outstring = string.Join(",", q.ToArray());

        Response.Clear();
        Response.ClearHeaders();
        Response.ContentType = "text/csv";
        Response.AppendHeader("Content-Disposition", string.Format("attachment;filename={0}", fileName));
        Response.Write("Published,Title,Author,Price," + outstring);
        Response.End();
    }
}

如果你想要一个逗号分隔值转换器,然后还有一个第3方开放源码称为 FileHelpers.我不知道关于什么的开源许可下,但它已经帮了我很多。

有很多相关的开销页类。因为你只是吐出CSV文件并没有需要回发、服务器的控制,缓存,或者在它的其余部分,应使这成为一种处理程序。ashx扩展。 看看这里.

除了什么西蒙说你可能会想读的 CSV如何引导 确保你的输出不会遇到任何陷阱。

澄清的东西西蒙说:

然后围绕这个报价如果你想要的

领域,包含了一倍双引号("")将需要被完全包围与双引号。不应该有任何害处,只是包装的所有领域与双引号,除非你特别想要的分析器来去掉前后的空白(而不是修剪你自己)。

我时使用以下方法建设一个CSV文件从一个数据表。ControllerContext只是响应流对象那里的文件是书面的。对你来说只是要响应的对象。

public override void ExecuteResult(ControllerContext context)
        {
            StringBuilder csv = new StringBuilder(10 * Table.Rows.Count * Table.Columns.Count);

            for (int c = 0; c < Table.Columns.Count; c++)
            {
                if (c > 0)
                    csv.Append(",");
                DataColumn dc = Table.Columns[c];
                string columnTitleCleaned = CleanCSVString(dc.ColumnName);
                csv.Append(columnTitleCleaned);
            }
            csv.Append(Environment.NewLine);
            foreach (DataRow dr in Table.Rows)
            {
                StringBuilder csvRow = new StringBuilder();
                for(int c = 0; c < Table.Columns.Count; c++)
                {
                    if(c != 0)
                        csvRow.Append(",");

                    object columnValue = dr[c];
                    if (columnValue == null)
                        csvRow.Append("");
                    else
                    {
                        string columnStringValue = columnValue.ToString();


                        string cleanedColumnValue = CleanCSVString(columnStringValue);

                        if (columnValue.GetType() == typeof(string) && !columnStringValue.Contains(","))
                        {
                            cleanedColumnValue = "=" + cleanedColumnValue; // Prevents a number stored in a string from being shown as 8888E+24 in Excel. Example use is the AccountNum field in CI that looks like a number but is really a string.
                        }
                        csvRow.Append(cleanedColumnValue);
                    }
                }
                csv.AppendLine(csvRow.ToString());
            }

            HttpResponseBase response = context.HttpContext.Response;
            response.ContentType = "text/csv";
            response.AppendHeader("Content-Disposition", "attachment;filename=" + this.FileName);
            response.Write(csv.ToString());
        }

        protected string CleanCSVString(string input)
        {
            string output = "\"" + input.Replace("\"", "\"\"").Replace("\r\n", " ").Replace("\r", " ").Replace("\n", "") + "\"";
            return output;
        }

看多好除了在功能"BookString()"你应该通过所有这些字符串通过一个小的功能喜欢这首先:

Private Function formatForCSV(stringToProcess As String) As String
    If stringToProcess.Contains("""") Or stringToProcess.Contains(",") Then
        stringToProcess = String.Format("""{0}""", stringToProcess.Replace("""", """"""))
    End If
    Return stringToProcess
End Function

'So, lines like this:
CsvLine.Append(b.Title.Replace(",", "") + ",")
'would be lines like this instead:
CsvLine.Append(formatForCSV(b.Title)) + ",")

该功能将你的格式串好CSV。它取代了报价与双引号,并添加引号串如果有引号或逗号。

注意它不会账户,用于新行,但是只能够安全地保证良好的CSV出,对于那些弦,你知道都是免费的内容的行(输入从一个简单的行文本的形式,等等)。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top