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

ASP.Net 海量数据导出到EXCEL (,有关问题很老,但是很急)

2012-08-10 
ASP.Net 海量数据导出到EXCEL (求救,问题很老,但是很急)论坛的帖子http://topic.csdn.net/u/20080827/11/e

ASP.Net 海量数据导出到EXCEL (求救,问题很老,但是很急)
论坛的帖子
http://topic.csdn.net/u/20080827/11/e8eb5429-1f76-4ad5-9fe0-db217bf991e6.html
讨论海量数据导出到EXCEL ,不太适用于asp.net 
还有人总结Asp.net 数据导出到EXCEL 
http://www.cnblogs.com/lishengpeng1982/archive/2008/04/03/1135490.html
数据量大了(一万条以上),恐怕也不行,
我们目前采用的是下面的方法 ,6000条数据可以导出,速度也可以,数据再多就不行了,希望大家指点,谢谢了。

public void CreateExcel(System.Web.UI.Page page,string strHtml)
{
HttpResponse resp;
string strOutputHtml="";
strOutputHtml=strHtml;
string strFileName = System.DateTime.Now.ToString("yyyyMMddHHmmss") + ".xls"; //xlsx xls
resp = page.Response;
resp.Clear();
resp.Buffer = false;
resp.ContentEncoding = System.Text.Encoding.GetEncoding("GB2312");
resp.AppendHeader("Content-Disposition", "attachment;filename=" + strFileName); //inline,attachment
resp.ContentType = "application/ms-excel"; //vnd.ms-excel vnd.xls
//向HTTP输出流中写入 
resp.Write(strOutputHtml);
resp.Flush();
resp.End();

}
其中方法的第二个参数 strHtml 是 html格式的数据的字符串,如下:
<html xmlns:v='urn:schemas-microsoft-com:vml' xmlns:o='urn:schemas-microsoft-com:office:office'
  xmlns:w='urn:schemas-microsoft-com:office:word' xmlns:x='urn:schemas-microsoft-com:office:excel'
  xmlns='http://www.w3.org/TR/REC-html40'>
<head>
  <meta http-equiv='Content-Type' content='application/ms-excel; charset=gb2312'>
  <meta name='ProgId' content='Excel.Sheet'>
  <meta name='Generator' content='Microsoft Excel 12'>
</head>
<body lang='ZH-CN' style='tab-interval: 21.0pt; text-justify-trim: punctuation'>
  <table border='1'>
  <tr height='36'>
  <td align='center' colspan='27' style='font-size: 18px; font-family: 宋体;'>
  查询列表</td>
  </tr>
  <tr height='25'>
  <td width='120' align='LEFT' style='font-family: 宋体; font-size: 12px;' nowrap>
  WN_ID</td>
  <td width='120' align='LEFT' style='font-family: 宋体; font-size: 12px;' nowrap>
  WT_ID</td>
  <td width='120' align='LEFT' style='font-family: 宋体; font-size: 12px;' nowrap>
  WN_Name</td>
  <td width='120' align='LEFT' style='font-family: 宋体; font-size: 12px;' nowrap>
  WN_Code</td>
  <td width='120' align='LEFT' style='font-family: 宋体; font-size: 12px;' nowrap>
  WN_IsMailStone</td>
  <td width='120' align='LEFT' style='font-family: 宋体; font-size: 12px;' nowrap>
  WN_Status</td>
  <td width='120' align='LEFT' style='font-family: 宋体; font-size: 12px;' nowrap>
  Creater</td>
  <td width='120' align='LEFT' style='font-family: 宋体; font-size: 12px;' nowrap>
  CreateTime</td>
   
   
  </tr>
   
  <tr height='25'>
  <td align='LEFT' style="font-family: 宋体; font-size: 12px; height: 25px;" x:str="\"'WN070130000007\">
  WN070130000007</td>
  <td align='LEFT' style="font-family: 宋体; font-size: 12px; height: 25px;" x:str="\"'WT0000000000000001\">
  WT0000000000000001</td>
  <td align='LEFT' style="font-family: 宋体; font-size: 12px; height: 25px;" x:str="\"'茨哈峡水电站可研设计\">


  茨哈峡水电站可研设计</td>
  <td align='LEFT' style="font-family: 宋体; font-size: 12px; height: 25px;" x:str="\"'200704541\">
  200704541</td>
  <td align='LEFT' style="font-family: 宋体; font-size: 12px; height: 25px;" x:str="\"'0\">
  0</td>
  <td align='LEFT' style="font-family: 宋体; font-size: 12px; height: 25px;" x:str="\"'2\">
  2</td>
  <td align='LEFT' style="font-family: 宋体; font-size: 12px; height: 25px;" x:str="\"'SU000000000001\">
  SU000000000001</td>
   
  </tr>
  <tr height='25'>
  <td align='LEFT' style='font-family: 宋体; font-size: 12px;' x:str="\"'WN070130000008\">
  WN070130000008</td>
  <td align='LEFT' style='font-family: 宋体; font-size: 12px;' x:str="\"'WT0000000000000001\">
  WT0000000000000001</td>
  <td align='LEFT' style='font-family: 宋体; font-size: 12px;' x:str="\"'山坪水电站预可研设计\">
  山坪水电站预可研设计</td>
  <td align='LEFT' style='font-family: 宋体; font-size: 12px;' x:str="\"'200607822\">
  200607822</td>
  <td align='LEFT' style='font-family: 宋体; font-size: 12px;' x:str="\"'0\">
  0</td>
  <td align='LEFT' style='font-family: 宋体; font-size: 12px;' x:str="\"'2\">
  2</td>
  <td align='LEFT' style='font-family: 宋体; font-size: 12px;' x:str="\"'SU000000000001\">
  SU000000000001</td>
   
  </tr>
  </table>
</body>
</html>



[解决办法]

[解决办法]
帮你顶下
[解决办法]

探讨
引用:
帮你顶下

谢谢,不能沉下去

[解决办法]
我来顶一下
[解决办法]
数据很多还是要用多线程导出数据。,同时显示进度条
Excel文件有最多65535行数据的限制
[解决办法]
是啊,把你的数据分块,多线程+多个Excel。就跟快车下载一样。
[解决办法]
Excel文件有最多65535行数据的限制,所以你最好分成多个文件
[解决办法]
把数据分成好几段来查:
比如:一万条数据,我查的是六千多的数据,
那么我可以才用从后面往前查的方式查询或我一六千为标准,
从六千开始查前面的六千就不用了
[解决办法]
数据太多的excel就装不下了吧
[解决办法]
像这种量太大的数据导出,建立还是不用这种方式。
一个2w多条的数据放在一个string对象中,没办法不慢。
可以考虑自己往流中写数据。

[解决办法]
我没遇到过,不过想了解下
[解决办法]
这样滴话,数据太多,用输入输出流应该可以吧
[解决办法]
我纯属来学习的。
------解决方案--------------------


帮顶....
[解决办法]
可以使用内存流,可以使用文件流,还可以使用response的流。

[解决办法]
顶!
[解决办法]
public static bool ExportExcel(string strFileName, DataTable dt, string strTempFileName)
{
if(dt==null ||dt.Rows.Count==0)
return false;


Excel.Application appExcel = new Excel.Application();
Excel.Workbook workbookData;
Excel.Worksheet worksheetData;

// set culture to US
System.Globalization.CultureInfo CurrentCI = System.Threading.Thread.CurrentThread.CurrentCulture;
System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("en-US");

workbookData = appExcel.Workbooks.Open(strTempFileName, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value,
Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value);

worksheetData = (Excel.Worksheet)workbookData.Sheets[1];



for (int i = 0; i < dt.Columns.Count; i++)
{
worksheetData.Cells[1, i + 1] = dt.Columns[i].ColumnName.Trim();
}
 

Excel.Range xlRang = null;
int iRowCount = dt.Rows.Count ;
int iParstedRow = 0, iCurrSize = 0;
int iEachSize = 1000; // each time you 
int iColumnAccount = dt.Columns.Count;
int iCurrentRow = 0;
int iSheet = 1;

object[,] objVal = new object[iEachSize, iColumnAccount];
try
{
iCurrSize = iEachSize;
while (iParstedRow < iRowCount)
{
if ((iRowCount - iParstedRow) < iEachSize)
iCurrSize = iRowCount - iParstedRow;
for (int i = 0; i < iCurrSize; i++)
{
for (int j = 0; j < iColumnAccount; j++)
objVal[i, j] = dt.Rows[iParstedRow + i][j].ToString();
}
// Get Save Range from Excel WorkSheet
// such as A1 H10, means From A to H Columns, and 1 to 10 rows
xlRang = worksheetData.get_Range("A" + ((int)(iParstedRow + 1)).ToString(), ((char)('A' + iColumnAccount - 1)).ToString()
+ (((int)(iParstedRow + iCurrSize + 1)).ToString()));

xlRang.Value2 = objVal;

iParstedRow = iParstedRow + iCurrSize;
iCurrentRow = iCurrentRow + iCurrSize;

if (iCurrentRow > MaxRow)
{
worksheetData = (Excel.Worksheet)workbookData.Worksheets.Add(Missing.Value, workbookData.Worksheets.get_Item(iSheet), Missing.Value, Missing.Value);
iSheet += 1;

for (int i = 0; i < dt.Columns.Count; i++)
{
worksheetData.Cells[1, i + 1] = dt.Columns[i].ColumnName.Trim();
}

iCurrentRow = 0;
}
}


System.Runtime.InteropServices.Marshal.ReleaseComObject(xlRang);
xlRang = null;

}
catch
{
return false ;


}

// return to previous culture
System.Threading.Thread.CurrentThread.CurrentCulture = CurrentCI;

workbookData.Saved = false;
workbookData.SaveAs(strFileName, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Excel.XlSaveAsAccessMode. xlNoChange, Missing.Value, Missing.Value, Missing.Value, Missing.Value);

appExcel.Quit();

return true;
}
//MaxRow是设定的一个sheet得最大值,不知道能不能满足你的要求
[解决办法]
在web.config中设置 页面响应时间 ,长一些 。
[解决办法]
是否可以非即时导出,比如在系统比较清闲的时候使用数据库作业导出,然后提供下载
参考
[解决办法]
ding
[解决办法]
你说的是技术问题,还是太慢的问题啊

[解决办法]
学习
[解决办法]
顶起
[解决办法]
学做过导这么多数据的。。

[解决办法]
学习中
[解决办法]

探讨
引用:
你说的是技术问题,还是太慢的问题啊


多于6000条记录时,数据导不出去,是能不能导出去的问题。
C# codepublicvoid CreateExcel(System.Web.UI.Page page,string strHtml)
{
HttpResponse resp;string strOutputHtml="";
strOutputHtml=strHtml;string strFileName= System.DateTime.Now.ToString("yyyyMMddHHmmss")+".xls";//xlsx xlsresp= page.Response;
resp.Clear();
resp.Buffer=false;
resp.ContentEncoding= System.Text.Encoding.GetEncoding("GB2312");
resp.AppendHeader("Content-Disposition","attachment;filename="+ strFileName);//inline,attachmentresp.ContentType="application/ms-excel";//vnd.ms-excel vnd.xls//向HTTP输出流中写入resp.Write(strOutputHtml);//strOutputHtml 是拼成的一个很长的字符串,记录少于6000条时,这条语句就执行需要一小段时间,记录多于6000条时,这条语句就一闪而过resp.Flush();
resp.End();

}


[解决办法]
另外你的数据是从什么地方来呢? 数据库?还是只拿显示页面的数据?
[解决办法]
学习
[解决办法]
学习中..
[解决办法]
学习
[解决办法]
如果是报表的话,
建议不要用这种方法

我们以前遇到过
后来报表改成了Reporting Service
打印,导出功能全部解决
还能选择多种导出格式

Good Luck
[解决办法]
关注中。和你一起期待高手
[解决办法]
mark 学习
[解决办法]
up up
[解决办法]
http://topic.csdn.net/u/20071015/12/a9c49cb4-a83e-44ae-bdca-5b942b920003.html
不知道有没有帮助...
[解决办法]
if(!反對)
{
忍受蹂躏;
}
else
{
 忍受挨踢;
}
while(NOT 死)
{
敲代碼;敲死;
}
------解决方案--------------------


菜鸟,学习
[解决办法]
同样问题,期待好的解决方法。
[解决办法]
把60000多数据分成6000条一组 用10个进程来插入同一个库中,这样是不是能快些。
这里的多少 条记录和多少个进程自己写程序来控制。
应该可以 实现的。
[解决办法]
1、分多次导入同一个excel。可以用10楼他们说的多线程
2、如50楼引得资料,第三方控件或者服务

你的数据导入要求顺序吗?
[解决办法]
1、用BCP导出
2、看到别人个比较好的思路,在服务器上放置个EXCEL模板,从数据库中取出数据插入到EXCEL然后下载EXCEL文件。
祝你好运~~
[解决办法]
没试过海量 但我现在用的是通过XML中转 比你这个效率应该是要高
[解决办法]
我博客里有篇新写的文章,支持大量数据导出excel.
http://blog.csdn.net/jiezigege
[解决办法]

探讨
数据很多还是要用多线程导出数据。,同时显示进度条
Excel文件有最多65535行数据的限制

[解决办法]
Excel导出工具GemBox.Spread,这个工具还不错

貌似网上有源代码版本的,官方的需要花钱的
[解决办法]
需要一个excel.dll,有需要的可以qq联系我415548110
[解决办法]
直接写文本,CSV文件!快!
[解决办法]
学习血虚
[解决办法]
我也有相似问题,顶一贴
[解决办法]
楼主到网上搜一下“Smart Excel Library”吧,搜不到给我发消息,我这里有。
http://bigmango.bokee.com/viewdiary.17844445.html
用vb写的一个Excel导出的dll,可以在服务器不安装Excel的情况下支持导出,
速度非常非常快,我试过,20M的文件应该在2秒内执行完毕,剩下的就是下载的时间。

[解决办法]
那么多数据啊 没遇到过 学习下
[解决办法]
如果你不需要花钱,可以这样,在服务器写成excel,然后下载此excel,目前你用gridview导出excel很慢,大数据量最好使用服务器写成excel存在服务器上然后下载下来。
[解决办法]
先回个,表沉
[解决办法]
俺看了就头晕啊
[解决办法]
写一个C/S程序,用多线程导出。B/s你就别想了,数量大了就会出现超时,而且还会假死,用户也等不急
[解决办法]
我不会,看看
[解决办法]
路过
[解决办法]
很强大的问题。学习了。

热点排行