在页面上把数据导出到Excel中,如果导出的数据为都为数字的字符串时,导出Excel中后认为是数值进行显示(前几位为零时不显示,如果字符串过长时,Excel中显示的数据为科学计数法,把单元格的属性设为文本也不起作用),这样的数据能后以字符串的形式显示。代码如下:
static public void ToExcel(DataTable dtData)
{
string filename="SaiLun-Report-"+System.DateTime.Now.ToString("yyyyMMddhhmmss") +".csv";
StringWriter sw=new StringWriter();
//列数
int ColumnCount=dtData.Columns.Count;
//标题
string strTitle="";
for(int i=0;i<dtData.Columns.Count;i++)
{
strTitle=strTitle+dtData.Columns[i].ColumnName+",";
}
sw.WriteLine(strTitle);
string strRead="";
for(int i=0;i<ColumnCount;i++)
{
if(i==ColumnCount-1)
{
strRead=strRead+"dr["+dtData.Columns[i].ColumnName+"]";
}
else
{
strRead=strRead+"dr["+dtData.Columns[i].ColumnName+"]+','+";
}
}
//写数据
foreach(DataRow dr in dtData.Rows) 
{
for(int i=0;i<ColumnCount;i++)
{
if(dtData.Columns[i].ColumnName=="身份证号")
{
sw.Write("'"+dr[i].ToString());
}
else
{
sw.Write(dr[i].ToString());
}
sw.Write(",");
}
sw.WriteLine("\t");

sw.Close();
System.Web.HttpContext.Current.Response.AddHeader("Content-Disposition", "attachment; filename=" +filename); 
System.Web.HttpContext.Current.Response.ContentType = "application/ms-excel";// 指定返回的是一个不能被客户端读取的流,必须被下载 
System.Web.HttpContext.Current.Response.ContentEncoding=System.Text.Encoding.GetEncoding("GB2312");
System.Web.HttpContext.Current.Response.Write(sw); // 把文件流发送到客户端 
System.Web.HttpContext.Current.Response.End(); 
}
谢谢大家!

解决方案 »

  1.   

    sigh,你用的是 .csv 实际上是个文本文件——仅仅是因为 Excel 能够识别出其中的行和列罢了,当然不支持高级的格式化单元格等功能换个方法,输出 xls 就可以控制了:1、服务器端调用 Excel.Application; 2、采用诸如 Aspose.Excel 这类第三方控件
      

  2.   

    http://www.aspxboy.com/private/497/default.aspx
      

  3.   

    应该不是程序的问题,是Excel自动识别的吧
      

  4.   

    和程序没关系,如果是数字格式的xls都会被自动识别为科学计数,方法自有在数字上下功夫了,尽量避免数字,比如:money可以加个$.... 变通一下.
      

  5.   

    不会的,参照这个方法http://dotnet.aspx.cc/article/700BD3FA-A17F-41DC-B258-0DC572625700/read.aspx
      

  6.   

    http://dotnet.aspx.cc/article/8A4CBF47-B888-4832-3389-ED3A3A3C8AAB/read.aspx
    http://dotnet.aspx.cc/Exam/OutPutExcel.aspx
      

  7.   

    谢谢大家的答复,大家举的例子都是给予页面上的DataGrid导出数据,在DataGrid的DataBound事件中设定列的属性,我要问的是直接用DataTable传递数据,然后以Excel的形式导出,因为我很多地方都是给予我上面给出代码的方法直接调用的,望大家给与指导,谢谢!
      

  8.   

    public static void meDataGirdToExcel(System.Web.UI.Page pPage,DataTable dt,string str1,string str2,string str3)
    {
    System.Web.HttpResponse resp = pPage.Response; if(dt.Rows.Count==0)
    {
    resp.Write("<script>alert('对不起,没有查询到任何记录,无法导出')</script>");
    resp.End();
    } resp.ContentEncoding = System.Text.Encoding.GetEncoding("GB2312"); 
    resp.ContentType = "application/ms-excel";
    resp.AppendHeader("Content-Disposition", "attachment;filename=HrExport.xls");

    int colCount = dt.Columns.Count;
    StringBuilder sb = new StringBuilder();
    sb.Append("<html><head>\n");
    sb.Append("<meta http-equiv=\"Content-Language\" content=\"zh-cn\">\n");
    sb.Append("<meta http-equiv=\"Content-Type\" content=\"text/html; charset=gb2312\">\n");
    sb.Append("</head>\n");
    sb.Append("<table border=1>");
    //大标题
    if(str1 != "")
    {
    string sTitle = "<font size=4><b>"+str1+"</b></font>";
    //副标题
    if(str2 != "") sTitle += "("+str2+")"; sb.Append("<tr><td colspan="+colCount+">"+sTitle+"</td></tr>");
    }

    //查询时间
    sb.Append("<tr><td colspan="+colCount+" valign=middle height=24>");
    sb.Append("查询时间:"+System.DateTime.Now.ToString()+"</td></tr>");
    //表标题
    sb.Append("<tr>\n");
    for(int i=0; i<colCount; i++)
    {
    string sCaption = dt.Columns[i].Caption.ToString();
    if(sCaption.ToLower() != "id")
    sb.Append("<td bgcolor=#969696><b>"+dt.Columns[i].Caption.ToString()+"</b></td>\n");
    }
    //表内容
    foreach(DataRow dr in dt.Rows)
    {
    sb.Append("<tr>");
    for(int j=0; j<colCount; j++)
    {
    if(dt.Columns[j].Caption.ToString().ToLower() != "id")
    sb.Append("<td style='vnd.ms-excel.numberformat:@'>"+dr[j].ToString()+"</td>");
    }
    sb.Append("</tr>\n");
    }
    sb.Append("</table>\n"); resp.Write(sb.ToString());
    resp.End();
    }
      

  9.   

    DataGrid1_ItemDataBound
    {
       if (e.Item.ItemType == ListItemType.Item ||
    e.Item.ItemType == ListItemType.AlternatingItem)
    {

    e.Item.Cells[列].Attributes.Add("style","vnd.ms-excel.numberformat:@");
    }}
      

  10.   

    private void DataGrid1_ItemDataBound(object sender, System.Web.UI.WebControls.DataGridItemEventArgs e)
    {
    if(e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
    {
    e.Item.Cells[0].Attributes.Add("style","vnd.ms-excel.numberformat:@");
    e.Item.Cells[3].Attributes.Add("style","vnd.ms-excel.numberformat:¥#,###.00");
    }
    }