C# asp.net中的ExportToExcel

C# asp.net中的ExportToExcel,c#,asp.net,C#,Asp.net,导出到excel的代码如下: Destinations || DeparturePort || Count || % of Search || -------------------------------------------------------------- Caribbean Eastern || FLL,MIA || 2 || 0.03 || South America || LIM || 1

导出到excel的代码如下:

 Destinations      || DeparturePort  || Count || % of Search ||
 --------------------------------------------------------------
 Caribbean Eastern || FLL,MIA     || 2     || 0.03           ||
 South America     || LIM         || 1     || 0.02           ||
使用(System.IO.StreamWriter tempFile=new System.IO.StreamWriter(Response.OutputStream))
{
字符串cols=“”;
foreach(dt1.Columns中的数据列dc)
{
cols+=dc.ColumnName.ToString()+“,”;
}
#区域写入文件
System.Collections.Generic.List fileRows=新的System.Collections.Generic.List();
for(int i=0;i
在excel中导出的实际代码如下所示:

using (System.IO.StreamWriter tempFile = new System.IO.StreamWriter(Response.OutputStream))
{
    string cols = "";

    foreach (DataColumn dc in dt1.Columns)
    {
        cols += dc.ColumnName.ToString() + ",";
    }

    #region Writetofile
    System.Collections.Generic.List<string> fileRows = new System.Collections.Generic.List<string>();

    for (int i = 0; i < dt1.Rows.Count; i++)
    {
        string strToWrite = string.Empty;

        for (int j = 0; j < dt1.Columns.Count; j++)
        {
            if (dt1.Rows[i][j].ToString().IndexOf(',') != 0)
            {
                strToWrite += "\"" + dt1.Rows[i][j].ToString() + "," + "\"";
            }
            else
                strToWrite += dt1.Rows[i][j].ToString() + ",";
        }
        fileRows.Add(strToWrite);
    }
    #endregion

    this.CreateExportFile(cols, fileRows, fileName, string.Empty);
    Response.End();
}
内部void CreateExportFile(字符串colHeader、列表arrL、字符串文件名、字符串文件类型)
{
#地区新代码
如果(arrL!=null&&arrL.Count>0)
{
Response.ContentType=(fileType==null | | fileType==string.Empty)?“text/csv”:fileType;
Response.AddHeader(“内容处置”、“附件;文件名=“+filename”);
使用(System.IO.StreamWriter sw=new System.IO.StreamWriter(Response.OutputStream))
{
sw.WriteLine(colHeader);
对于(int i=0;i
当一个列只有一个值时,这种方法可以正常工作。但由于列有多个值作为MIA,FLL它将它们分隔在不同的列中。我可以在这里做什么改变


提前感谢。

您可以使用以下使用反射的类,在代码中将行建模为类,每个条目都有一个对象,将数据作为列表传递,列将成为该类中的属性

对于多个值,您可以创建一个类DeparturePort,例如包含列表FLL,MIA和一个返回“FLL,MIA”的ToString,并且主记录类中的属性将包含DeparturePort的实例

internal void CreateExportFile(string colHeader, List<string> arrL, string fileName, string fileType)
{
    #region New code
    if(arrL != null && arrL.Count > 0)
    {
        Response.ContentType = (fileType == null || fileType == string.Empty) ? "text/csv" : fileType;
        Response.AddHeader("Content-Disposition", "attachment;filename=" + fileName);

        using(System.IO.StreamWriter sw = new System.IO.StreamWriter(Response.OutputStream))
        {
            sw.WriteLine(colHeader);

            for(int i = 0; i < arrL.Count; i++)
                sw.WriteLine(arrL[i]);

            sw.Flush();
        } // using 
        Response.End();
    } // if we have data
    #endregion
}
公共类csveexport,其中T:class
{
/// 
///物体
/// 
公开列出对象;
/// 
///初始化类的新实例。
/// 
///物体。
公共CsvExport(列出对象)
{
对象=对象;
}
/// 
///导出此实例。
/// 
/// 
公共字符串导出()
{
退货出口(真实);
}
/// 
///导出指定的包含标题行。
/// 
///如果设置为true[包括标题行]。
/// 
公共字符串导出(bool includeHeaderLine)
{
StringBuilder sb=新的StringBuilder();
//使用反射获取属性。
IList propertyInfos=typeof(T).GetProperties();
如果(包括领头线)
{
//添加标题行。
foreach(PropertyInfo PropertyInfo in propertyInfos中的PropertyInfo)
{
sb.Append(propertyInfo.Name);
}
删除(sb.Length-1,1.AppendLine();
}
//为每个属性添加值。
foreach(对象中的对象)
{
foreach(PropertyInfo PropertyInfo in propertyInfos中的PropertyInfo)
{
sb.Append(MakeValueCsvFriendly(propertyInfo.GetValue(obj,null)).Append(“,”);
}
删除(sb.Length-1,1.AppendLine();
}
使某人返回字符串();
}
//导出到文件。
/// 
///导出自动文件。
/// 
///这条路。
公共void导出文件(字符串路径)
{
writealText(路径,Export());
}
//导出为二进制数据。
/// 
///导出自动字节。
/// 
/// 
公共字节[]导出字节()
{
返回Encoding.UTF8.GetBytes(Export());
}
//获取字段的csv值。
/// 
///使值CSV友好。
/// 
///价值。
/// 
私有字符串MakeValueCsvFriendly(对象值)
{
如果(value==null)返回“”;
if(value可为null&((INullable)value).IsNull)返回“”;
if(值为DateTime)
{
如果(((DateTime)值).TimeOfDay.TotalSeconds==0)
返回((日期时间)值).ToString(“yyyy-MM-dd”);
返回((日期时间)值).ToString(“yyyy-MM-dd-HH:MM:ss”);
}
字符串输出=value.ToString();
if(output.Contains(“,”)| output.Contains(“\”)
输出='“'+输出。替换(“\”,“\”)+';
返回输出;
}
}

您需要将值括在引号符号中,并在必要时转义引号。CSV文件没有标准,但大多数阅读器(包括Excel)都支持引号分隔。请再次查看您的代码
Response.ContentType=text/csv
。csv=逗号分隔的值。因此,当然,任何逗号都将充当分隔符。您必须查看引号分隔。
Response.ContentType=(fileType==null | | fileType==string.Empty)?“文本/csv”:文件类型您的内容类型是CSV,它将把您的列值(MIA,FLL)视为不同的列。
  public class CsvExport<T> where T : class
    {
        /// <summary>
        /// The objects
        /// </summary>
        public List<T> Objects;

        /// <summary>
        /// Initializes a new instance of the <see cref="CsvExport{T}"/> class.
        /// </summary>
        /// <param name="objects">The objects.</param>
        public CsvExport(List<T> objects)
        {
            Objects = objects;
        }

        /// <summary>
        /// Exports this instance.
        /// </summary>
        /// <returns></returns>
        public string Export()
        {
            return Export(true);
        }

        /// <summary>
        /// Exports the specified include header line.
        /// </summary>
        /// <param name="includeHeaderLine">if set to <c>true</c> [include header line].</param>
        /// <returns></returns>
        public string Export(bool includeHeaderLine)
        {

            StringBuilder sb = new StringBuilder();
            //Get properties using reflection.
            IList<PropertyInfo> propertyInfos = typeof(T).GetProperties();

            if (includeHeaderLine)
            {
                //add header line.
                foreach (PropertyInfo propertyInfo in propertyInfos)
                {
                    sb.Append(propertyInfo.Name).Append(",");
                }
                sb.Remove(sb.Length - 1, 1).AppendLine();
            }

            //add value for each property.
            foreach (T obj in Objects)
            {
                foreach (PropertyInfo propertyInfo in propertyInfos)
                {
                    sb.Append(MakeValueCsvFriendly(propertyInfo.GetValue(obj, null))).Append(",");
                }
                sb.Remove(sb.Length - 1, 1).AppendLine();
            }

            return sb.ToString();
        }

        //export to a file.
        /// <summary>
        /// Exports the automatic file.
        /// </summary>
        /// <param name="path">The path.</param>
        public void ExportToFile(string path)
        {
            File.WriteAllText(path, Export());
        }

        //export as binary data.
        /// <summary>
        /// Exports the automatic bytes.
        /// </summary>
        /// <returns></returns>
        public byte[] ExportToBytes()
        {
            return Encoding.UTF8.GetBytes(Export());
        }

        //get the csv value for field.
        /// <summary>
        /// Makes the value CSV friendly.
        /// </summary>
        /// <param name="value">The value.</param>
        /// <returns></returns>
        private string MakeValueCsvFriendly(object value)
        {
            if (value == null) return "";
            if (value is Nullable && ((INullable)value).IsNull) return "";

            if (value is DateTime)
            {
                if (((DateTime)value).TimeOfDay.TotalSeconds == 0)
                    return ((DateTime)value).ToString("yyyy-MM-dd");
                return ((DateTime)value).ToString("yyyy-MM-dd HH:mm:ss");
            }
            string output = value.ToString();

            if (output.Contains(",") || output.Contains("\""))
                output = '"' + output.Replace("\"", "\"\"") + '"';

            return output;

        }
    }