首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > asp.net >

100分征集解决方案,该如何处理

2012-01-03 
100分征集解决方案功能描述:一个DataSet里,数据有上几十万条;现需要对这里面的数据进行导出,导出文件是为.

100分征集解决方案
功能描述:一个DataSet里,数据有上几十万条;现需要对这里面的数据进行导出,导出文件是为.xls的。因此,我有这么一个方法叫GenerateExcel(ds),
public   string   GenerateExcel(DataSet   ds)
{
DataTable   dt   =   ds.Tables[0];
                  StringBuilder   strContent   =   new   StringBuilder();
for(int   i   =   0   ;   i   <   dt.Rows.Count;   i++)
{  

                          //这里面就生成如 <table> <tr> <td> 数据 </td> </tr> </table> 格式的数据
                          strContent.Append(...)
                    }              
                  return   strContent.ToString();
}

得到GenerateExcel方法返回的字符串后,我又将其转成Byte[],再用FileStream.Write方法,写成一个文件.
        现在出现的问题是:在执行GenerateExcel方法时,也就是将DataSet写到文件的过程中,相当的耗内存,以至于将32位操作系统所允许的最大内存使用量都用光了(注:32位操作系统允许使用的内存上限是3G),最后导致内存溢出的错误。
        现在暂时想到的解决方案,也就是分批次的将数据导入。但我不知还有没有更好的解决方案,故开此贴,征集一下各位兄弟们的宝贵建议。

[解决办法]
sqlserver吗?用bcp直接导出
[解决办法]
填充到数据显示控件然后用Excel类里面的导出,如果不需要在线导出的话可以直接使用SqlServer的导入导出功能,虽然还是慢不过不会导致内存溢出。
[解决办法]
用 XML + XSLT + 客户端EXCEL接口直接实现

xml : ds.GetXml()
xsl : <xsl:template match= "NewDataSet ">
接口:
Response.AppendHeader( "Content-Disposition ", "attachment;filename= " + fileName + ".xls ");
Response.ContentType = "application/ms-excel ";
Response.ContentEncoding=System.Text.Encoding.GetEncoding( "GB2312 ");

[解决办法]
推荐一个好方法,将你的ds转换为datatable即可
public static void DataTableToExcel(HttpResponse re, DataTable dt, string filename)
{
re.Clear();
re.ContentType = "application/vnd.ms-excel ";
re.AddHeader( "Content-Disposition ", "attachment; filename= " + System.Web.HttpUtility.UrlEncode(filename,System.Text.Encoding.UTF8)+ ".xls ");
re.Write(ExportHTML(dt));
re.End();
}
private static string ExportHTML(DataTable dt)
{
StringBuilder sb = new StringBuilder( " <table border=1> <thead> <tr> ");
foreach (DataColumn column1 in dt.Columns)
{
sb.Append( " <td> ");
sb.Append(column1.ColumnName);
sb.Append( " </td> ");
}
sb.Append( " </tr> </thead> <tbody> ");
foreach (DataRow row1 in dt.Rows)
{
sb.Append( " <tr> ");
foreach (DataColumn column2 in dt.Columns)
{
sb.Append( " <td> ");
sb.Append(row1[column2].ToString());
sb.Append( " </td> ");
}
sb.Append( " </tr> ");
}
sb.Append( " </tbody> </table> ");
return sb.ToString();
}
[解决办法]
private void ExportExcelFromDataGrid
( string filename , System.Web.UI.WebControls.DataGrid ToExcelGrid )


{
Response.Clear();
Response.Buffer= true;
Response.Charset= "utf-8 ";
Response.AppendHeader ( "Content-Disposition ", "attachment;filename= "+Server.UrlEncode ( filename ) );
Response.ContentEncoding=System.Text.Encoding.Default;//设置输出流为简体中文
Response.ContentType = "application/ms-excel ";//设置输出文件类型为excel文件。
this.EnableViewState = false;
System.Globalization.CultureInfo myCItrad =
new System.Globalization.CultureInfo( "ZH-CN ",true);
System.IO.StringWriter oStringWriter = new System.IO.StringWriter(myCItrad);
System.Web.UI.HtmlTextWriter oHtmlTextWriter =
new System.Web.UI.HtmlTextWriter(oStringWriter);
ToExcelGrid.RenderControl(oHtmlTextWriter);
Response.Write(oStringWriter.ToString());
Response.End();
}

private void Button4_Click(object sender, System.EventArgs e)
{
this.Panel1.Visible = false;
string filename = "内训师.xls ";
this.DataGrid1.Columns[6].Visible = true;
this.DataGrid1.Columns[7].Visible = true;
this.DataGrid1.Columns[this.DataGrid1.Columns.Count-1].Visible = false; // *
this.DataGrid1.Columns[this.DataGrid1.Columns.Count-2].Visible = false; // *
this.DataGrid1.AllowSorting = false; // *
this.DataGrid1.AllowPaging = false;
this.DataGrid1.SelectedIndex = -1; // *
this.BindGrid();
this.ExportExcelFromDataGrid ( filename , this.DataGrid1 );
}
}
[解决办法]
用 XML + XSLT + 客户端EXCEL接口直接实现
这方法好

[解决办法]
EXEC master..xp_cmdshell 'bcp 库名.dbo.表名out c:\Temp.xls -c -q -S "servername " -U "sa " -P " " '
参数:S 是SQL服务器名;U是用户;P是密码

你用这个直接把查询的数据生成xls文件,试一下。我用的感觉还可以。

热点排行