从SQL下载大量数据到Excel
之前不知设计原理,发生了大量数据(超过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的更多相关文章
- sql server复制数据到excel格式变成字符串
sql server复制数据到excel格式变成字符串,结果数据都保存在第一个格子里面. 我点击连同标题一起复制,然后粘贴到excel,结果是这样子的.... 这不是我想要的结果,在网上查询了好多,结 ...
- pl/sql developer导出数据到excel的方法
http://yedward.net/?id=92 问题说明:使用pl/sql developer导出数据到excel表格中是非常有必要的,一般的可能直接在导出的时候选择csv格式即可,因为该格式可以 ...
- SQL server 导入数据 (excel导入到SQL server数据库)
打开数据库SQL server ,右键数据库,任务,导入数据 点击下一步 选择数据源类型 选择路径,点击下一步 选择将要生成的类型 选择登陆方式 选中,点击下一步 点击编辑映射可以修改将要生成的表,点 ...
- 【SQL】导出表数据到Excel中
打开数据库之后点击新建表查询: ------------------------------------------------------------------------------------ ...
- 自动更新开奖数据的excel文件,供大家下载
自动更新开奖数据的excel文件,供大家下载 2010-03-14 20:22 228492人阅读打印来源:乐彩网 作者:eren 很多人拥有自制excel电子表格,常要更新最基本的开奖信息.如有多期 ...
- SQL SERVER 与ACCESS、EXCEL的数据导入导出转换
* 说明:复制表(只复制结构,源表名:a 新表名:b) select * into b from a where 1<>1 * 说明:拷贝表(拷贝数据,源表名:a 目标表名:b) ...
- 在MVC中实现和网站不同服务器的批量文件下载以及NPOI下载数据到Excel的简单学习
嘿嘿,我来啦,最近忙啦几天,使用MVC把应该实现的一些功能实现了,说起来做项目,实属感觉蛮好的,即可以学习新的东西,又可以增加自己之前知道的知识的巩固,不得不说是双丰收啊,其实这周来就开始面对下载在挣 ...
- SQL SERVER 和ACCESS、EXCEL的数据导入导出
SQL SERVER 与ACCESS.EXCEL之间的数据转换SQL SERVER 和ACCESS的数据导入导出[日期:2007-05-06] 来源:Linux公社 作者:Linux 熟 悉 ...
- PHP实时生成并下载超大数据量的EXCEL文件
最近接到一个需求,通过选择的时间段导出对应的用户访问日志到excel中, 由于用户量较大,经常会有导出50万加数据的情况.而常用的PHPexcel包需要把所有数据拿到后才能生成excel, 在面对生成 ...
随机推荐
- Win10 disable 最近打开
1. 开始菜单 -> Settings -> Personalization -> Start 2. Set "Show most used apps" Off ...
- EF初级入门 (一对多、多对多)
1.创建新项目并引入Entity Framework 然后就可以开始使用EF了 开始使用一对多 Users 用户类,UserDetail用户详情类:一个用户对应多个详情(仅用于测试) public c ...
- swift 键盘属性与事件
1.键盘的类型 textField1.keyboardType = UIKeyboardType.default //系统默认的虚拟键盘 textField1.keyboardType = UIKey ...
- C语言PIC18 serial bootloader和C#语言bootloader PC端串口通信程序
了解更多关于bootloader 的C语言实现,请加我QQ: 1273623966 (验证信息请填 bootloader),欢迎咨询或定制bootloader(在线升级程序). 新PIC18 Boot ...
- JS 取得一个区间的随机整数
function rnd(n, m){ var random = Math.floor(Math.random()*(m-n+1)+n); return random; ...
- cakephp 打印出SQL语句
最近一直在使用cakephp这个框架学习,最近发现了一些问题,就是怎样将SQL语句打印出来进行调试,方法如下: $db=ConnectionManager::getDataSource('defaul ...
- openssh升级至7.2
此处升级操作的原则是保留系统原有ssh服务,新安装高版本ssh服务 1.下载openssh源码包 http://www.openssh.com/portable.html 2.安装#tar zxvf ...
- Kibana安装与基本用法
Kibana也是一个开源和免费的工具,他可以帮助您汇总.分析和搜索重要数据日志并提供友好的web界面.他可以为Logstash 和ElasticSearch 提供日志分析的Web界面 它是一个基于浏览 ...
- Hibernate—— 一对多 和 多对多关联关系映射(xml和注解)总结(转载)
One to Many 映射关系 多对一单向外键关联(XML/Annotation) 一对多单向外键关联(XML/Annotation) 懒加载和积极加载 一对多双向外键关联(XML/Annotati ...
- Java Annotation 注解
java_notation.html div.oembedall-githubrepos { border: 1px solid #DDD; list-style-type: none; margin ...