之前不知设计原理,发生了大量数据(超过100w行)直接从数据库读取加载到网页中,直接导致内存溢出。

Rediculous!

所以,现在改为分页查询到页面中。

由于其有全局逻辑,故折中每次加载1w条数据进行计算,网页打开速度大大加快。

所需耗时皆来自count的统计。

下载时,可做每5w行进行一波读取与写入excel。

但需注意两点:

1.前台ajax的响应时间经测试不超过1小时。需要缩短后台执行的时间以达到及时响应的效果。前台也可稍作提示,预估响应时间超过1小时则提示用户重新选择下载时间段和数据量。

2.Excel的最大行数为Excel2007开始最大行是1048576行。注意不可超出这个范围,可在前台做相应提示用户重新选择。

具体代码:

前台js:

 //数据透视下载
$("#download").on("click", function () {
var pivottime=<%=pivotcount%>;
if (pivottime>)
{
alert("It will take more than 1 hour,please choose the date again.");
}
else
{
if(confirm("It will take about <%=pivotcount%> seconds to download the file.\nConfirm to download?"))
{
$("#download_center").show();
i=;
doProgress();
$.ajax({
type: "Post",
url: "DataPivotList.aspx/DownloadPivot",
contentType: "application/json; charset=utf-8",
dataType: "json",
success: function (res) {
//返回的数据用data.d获取内容
var r = eval("(" + res.d + ")");
$("#download_loading > div").css("width", "0px"); //控制#loading div宽度
$("#download_loading > div").html(""); //显示百分比
$("#download_center").hide();
if (r.message) {
window.open('/ExportFiles/' + r.value);
}
else { alert(r.value+"\nPlease choose the date again."); }
},
error: function (err) {
alert(err);
}
}); //禁用按钮的提交
return false;
}
}
});

下载进度条js:

  var progress_id = "download_loading";
function SetProgress(progress) {
if (progress) {
$("#" + progress_id + " > div").css("width", String(progress) + "%"); //控制#loading div宽度
$("#" + progress_id + " > div").html(String(progress) + "%"); //显示百分比
}
}
var i = ;
function doProgress() {
var time=;
time=<%=pivotcount%>*/;
if (i > ) {
//$("#download_message").html("加载完毕!").fadeIn("slow");//加载完毕提示
return;
}
if (i <= ) {
setTimeout("doProgress()", time);
SetProgress(i);
i++;
}
}

div+css:

 <div id="download_center" style="display: none;">
<div id="download_message">It will take about <%=pivotcount%> seconds to download the file.</div>
<div id="download_loading"><div style="width:0px;"></div></div>
</div> /*-----------------------------------------processing----------------------------------------------------*/
#download_center{ margin: auto;float:left; position:absolute; top: %; left: %; width: %; height: %;background-color:rgba(,,,0.5);z-index:; }
#download_loading{ margin: auto;float:left; position:absolute;top: %;left: %;width:397px; height:49px; /*background:url(bak.png) no-repeat;*/ }
#download_loading div{ width:0px; height:48px; background:url(process.png) no-repeat; color:#535a73; text-align:center; font-size:18px; line-height:48px; }
#download_message {margin: auto;float:left; position:absolute;top: %;left: %;width: 600px;height: 35px;font-size: 18px;color:#e4ebf6;line-height: 35px;text-align: center;margin-bottom: 10px;}

后台计算所需时间:

 pivotCount = GetTotalCount();
//显示时间
var ipivotCount = Convert.ToInt32(pivotCount);
if (ipivotCount / == )
DataPivotList.pivotcount = "";
else
DataPivotList.pivotcount = (Math.Pow(Convert.ToDouble((ipivotCount / + ) / ), Convert.ToDouble()) * ).ToString();

下载:

   [WebMethod]
public static string DownloadPivot()
{
DataTable dt = new DataTable();
DataTable dtTemp = new DataTable();
int pageCount = ;
int currentCount = ;
string uploadPath = string.Empty;
string sFileName = string.Empty;
string sTagName = string.Empty;
string sReturn = string.Empty; var mo = Convert.ToInt32(pivotCount) % ;
if (mo == )
pageCount = Convert.ToInt32(pivotCount) / ;
else
pageCount = Convert.ToInt32(pivotCount) / + ; dt.Columns.Add("url");
dt.Columns.Add("标题");
dt.Columns.Add("正文");
dt.Columns.Add("发布时间");
dt.Columns.Add("作者"); if (Convert.ToInt32(pivotCount) > )//超出excel最大行数限制
{
sReturn = "{\"message\":false,\"value\":\"Beyond the excel maximum number of rows\"}";
}
else
{
for (int i = ; i < pageCount; i++)
{
dt.Clear();
currentCount = * i; dtTemp = GetArticleByPage(currentCount); if (dtTemp.Rows.Count > )
foreach (DataRow dr in dtTemp.Rows)
{
DataRow drInsert = dt.NewRow();
drInsert["url"] = dr["URL"].ToString();
drInsert["标题"] = dr["Title"].ToString();
drInsert["正文"] = dr["Content"].ToString();
drInsert["发布时间"] = dr["ReleaseDate"].ToString();
drInsert["作者"] = dr["Author"].ToString();
。。。 dt.Rows.Add(drInsert);
}
dt.AcceptChanges(); try
{
if (dt.Rows.Count > )
{
if (currentCount == )
{
sTagName = "DataPivot";
uploadPath = HttpContext.Current.Server.MapPath(ExcelHelper.GetWebKeyValue()) + "\\";
sFileName = sTagName + "_" + DateTime.Now.ToString("yyyyMMddHHmmss") + ".xlsx";
ExcelHelper.ExportExcel(dt, uploadPath, sFileName);
}
else if (dt.Rows.Count > && currentCount > )
{
ExcelHelper.AppendToExcel(dt, uploadPath, sFileName, currentCount);
} sReturn = "{\"message\":true,\"value\":\"" + sFileName + "\"}";
}
else
{
sReturn = "{\"message\":false,\"value\":\"No result can be exported\"}";
}
}
catch (Exception ex)
{
sReturn = "{\"message\":false,\"value\":\"" + ex.Message + "\"}";
}
}
}
return sReturn;
}

从SQL下载大量数据到Excel的更多相关文章

  1. sql server复制数据到excel格式变成字符串

    sql server复制数据到excel格式变成字符串,结果数据都保存在第一个格子里面. 我点击连同标题一起复制,然后粘贴到excel,结果是这样子的.... 这不是我想要的结果,在网上查询了好多,结 ...

  2. pl/sql developer导出数据到excel的方法

    http://yedward.net/?id=92 问题说明:使用pl/sql developer导出数据到excel表格中是非常有必要的,一般的可能直接在导出的时候选择csv格式即可,因为该格式可以 ...

  3. SQL server 导入数据 (excel导入到SQL server数据库)

    打开数据库SQL server ,右键数据库,任务,导入数据 点击下一步 选择数据源类型 选择路径,点击下一步 选择将要生成的类型 选择登陆方式 选中,点击下一步 点击编辑映射可以修改将要生成的表,点 ...

  4. 【SQL】导出表数据到Excel中

    打开数据库之后点击新建表查询: ------------------------------------------------------------------------------------ ...

  5. 自动更新开奖数据的excel文件,供大家下载

    自动更新开奖数据的excel文件,供大家下载 2010-03-14 20:22 228492人阅读打印来源:乐彩网 作者:eren 很多人拥有自制excel电子表格,常要更新最基本的开奖信息.如有多期 ...

  6. SQL SERVER 与ACCESS、EXCEL的数据导入导出转换

    * 说明:复制表(只复制结构,源表名:a 新表名:b)      select * into b from a where 1<>1 * 说明:拷贝表(拷贝数据,源表名:a 目标表名:b) ...

  7. 在MVC中实现和网站不同服务器的批量文件下载以及NPOI下载数据到Excel的简单学习

    嘿嘿,我来啦,最近忙啦几天,使用MVC把应该实现的一些功能实现了,说起来做项目,实属感觉蛮好的,即可以学习新的东西,又可以增加自己之前知道的知识的巩固,不得不说是双丰收啊,其实这周来就开始面对下载在挣 ...

  8. SQL SERVER 和ACCESS、EXCEL的数据导入导出

    SQL SERVER 与ACCESS.EXCEL之间的数据转换SQL SERVER 和ACCESS的数据导入导出[日期:2007-05-06]     来源:Linux公社  作者:Linux 熟 悉 ...

  9. PHP实时生成并下载超大数据量的EXCEL文件

    最近接到一个需求,通过选择的时间段导出对应的用户访问日志到excel中, 由于用户量较大,经常会有导出50万加数据的情况.而常用的PHPexcel包需要把所有数据拿到后才能生成excel, 在面对生成 ...

随机推荐

  1. HEVC学习之一编码框架

    接触H265时间不是很长,看了一些东西,但是一直没有时间静下心来整理.H265的学习主要是参考万帅.杨付正的<新一代高效视频编码 H265/HEVC 原理.标准与实现>移书,这本书对H26 ...

  2. Windows Server 2012重复数据删除技术体验

    在企业环境中,对磁盘空间的需求是惊人的.数据备份.文件服务器.软件镜像.虚拟磁盘等都需要占据大量的空间.对此,微软在Windows Server 2012中引入了重复数据删除技术.重复数据删除技术通过 ...

  3. Javascript猜数字游戏

    <!DOCTYPE html> <html> <head> <title></title> <meta charset="u ...

  4. Git self-learning

    ---恢复内容开始--- 使用后的总结 git config --global user.name "" #设置和查看用户名git config --global user.ema ...

  5. 学习的目的:理解<转>

    http://www.hkuspacechina.com/chs/news-and-events/news/detail/news-first-day-of-school-2015-04-23 学习的 ...

  6. ssh 的搭建

    struts包的下载:http://struts.apache.org/download.cgi#struts252 string包的下载: http://repo.spring.io/release ...

  7. 使用 jquery 获取当前时间的方法

    我们在写一些效果时,经常要用到 jquery 获取当前时间,但是jquery 目前并没有提供直接获取当前时间的 api 或者函数,所以我们还是得用原生的 javascript 时间对象 Date 来获 ...

  8. 关于MAC

    以太LAN网中发送的分组称做帧,包含7个字段 MAC帧格式 前同步码 SFD DA SA 长度或类型 数据域 CRC 7字节,物理层加入 帧首定界符,1字节 目的地址,6字节 源地址,6字节 2字节 ...

  9. NK3C:关于svg文件使用

    我们从 http://iconfont.cn/ 上下载的SVG文件由以下构成,系统中使用的时候请做适当的修改: 1.width.Height:设置为100%: 2.defs模块去掉:(如果不去掉,IE ...

  10. redis集群同步迁移方法(二):通过redis-migrate-tool实现

    前篇介绍的redis replication方法,操作步骤多,而且容易出错.在git上看到一些开源工具也能实现同步迁移功能,而且步骤简单,比如redis-port,redis-migrate-tool ...