Create text file and download

前端 未结 7 1106
日久生厌
日久生厌 2020-12-14 01:08

I\'m trying to write to a text file in memory and then download that file without saving the file to the hard disk. I\'m using the StringWriter to write the con

7条回答
  •  天涯浪人
    2020-12-14 01:38

    Extension of @Vinicious answer.

    I had data that could contain commas. The common solution is to escape that piece of data by enclosing it in quotes, while making sure to also escape quotes that could also be a part of the data.

    One rub I came against and a warning when writing CSV, excel will not like you if you put spaces trailing your commas. discovered solution to my problem from superuser answer

    protected void btnDownload_Click(object sender, EventArgs e)
    {
        MemoryStream ms = new MemoryStream();
        TextWriter tw = new StreamWriter(ms, System.Text.Encoding.UTF8);
        var structures = KAWSLib.BusinessLayer.Structure.GetStructuresInService();
        // *** comma delimited
        tw.Write("Latitude, Longitude, CountySerial, StructureType, Orientation, District, RoutePre, RouteNo, LocationDesc");
        foreach (var s in structures)
        {
            tw.Write(Environment.NewLine + string.Format("{0:#.000000},{1:#.000000},{2},{3},{4},{5},{6},{7},{8}", s.LATITUDE, s.LONGITUDE, s.CO_SER, EscapeIfNeeded(s.SuperTypeLookup.SHORTDESC), EscapeIfNeeded(s.OrientationLookup.SHORTDESC), s.DISTRICT, s.ROUTE_PREFIX, s.RouteValue, EscapeIfNeeded(s.LOC_DESC)));
        }
        tw.Flush();
        byte[] bytes = ms.ToArray();
        ms.Close();
    
        Response.Clear();
        Response.ContentType = "application/force-download";
        Response.AddHeader("content-disposition", "attachment;    filename=" + string.Format("kaws-structures-{0:yyyy.MM.dd}.csv", DateTime.Today));
        Response.BinaryWrite(bytes);
        Response.End();
    }
    
    string EscapeIfNeeded(string s)
    {
        if (s.Contains(","))
        {
            return "\"" + s.Replace("\"", "\"\"") + "\"";
        }
        else
        {
            return s;
        }
    }
    

    Below will cause a problem for excel. In excel the first quote will become part of the data and consequently than separate at the embedded comma. Spaces bad.

     tw.Write(Environment.NewLine + string.Format("{0:#.000000}, {1:#.000000}, {2}, {3}, {4}, {5}, {6}, {7}, {8}", s.LATITUDE, s.LONGITUDE, s.CO_SER, EscapeIfNeeded(s.SuperTypeLookup.SHORTDESC), EscapeIfNeeded(s.OrientationLookup.SHORTDESC), s.DISTRICT, s.ROUTE_PREFIX, s.RouteValue, EscapeIfNeeded(s.LOC_DESC)));
    

提交回复
热议问题