C# asp.net中的ExportToExcel
导出到excel的代码如下: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
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;
}
}