导出EXCEL表格时 如何优化代码适应大数据量

问题描述

网站后台代码数据量不大或者逻辑不复杂的情况下秒导一旦数据量超过W或者逻辑复杂就容易浏览器未响应不知道该如何优化下有过经验的给点思路publicActionResultExportByExcel(){List<Vinotes.Model.GrapeType>list=WServices.GrapeTypeList(0).ToList();IWorkbookworkbook=newHSSFWorkbook();ISheetsheet=workbook.CreateSheet("test");IRowrow=sheet.CreateRow(0);ICellcell=row.CreateCell(0,CellType.String);cell.SetCellValue("类型名");cell=row.CreateCell(1,CellType.String);cell.SetCellValue("译名");cell=row.CreateCell(2,CellType.String);cell.SetCellValue("关联酒款");for(inti=0;i<list.Count;i++){IRowrow2=sheet.CreateRow(i+1);for(intj=0;j<4;j++){ICellcell2=row2.CreateCell(j,CellType.String);if(j==0){cell2.SetCellValue(list[i].Name);}elseif(j==1){cell2.SetCellValue(list[i].Translation);}elseif(j==2){cell2.SetCellValue(list[i].Wines.Count);}}}stringxlsxpath=System.Web.HttpContext.Current.Server.MapPath("~/Uploads/")+Guid.NewGuid()+".xls";using(FileStreamfs=newSystem.IO.FileStream(xlsxpath,FileMode.Create)){workbook.Write(fs);}stringresult=xlsxpath.Substring(xlsxpath.LastIndexOf("\")+1);returnContent(result);}

解决方案

解决方案二:
多线程,或是你弄个进度条,显示导出进度,防止让别人看到是假死状态。
解决方案三:

解决方案四:
用流导出....毫秒级的.
解决方案五:
既然你都用nopi了..道理来说不能啊..你说的卡是有多卡...
解决方案六:
我正在做一个项目,SQL对数据进行检索后先放入一个dt通过nopi直接将DT直接转换为EXCEL文件,速度比较快,因为DT就是在内存里面的临时表NOPI要用2.4以上版本的,有这个功能其实,EXCEL文件有缺陷,记录行超过5W多,老版本就不支持了。另一种思路,用文件流方式,将DT直接写成CVS文件进行保存,EXCEL也可以直接打开,我试过每秒写个几万条记录不成问题的
解决方案七:
for(intj=0;j<4;j++)只有3列,为什么循环4次,后面加个空单元格?还有,处理数据和导出的过程最好分开,尽量不要一次执行太复杂的逻辑导出前在别的地方把数据处理好,直接导出
解决方案八:
如三楼的,可以试下用流导出
解决方案九:
lz如果不要是格式,就使用流导出。发个链接,
解决方案十:
如果可以接受xml格式的excel的话,是个不错的选项,速度足够快,不调用任何组件。以XML形式的Excel方式(可以设置丰富的样式,并可以有多个sheet,但需要模版。速度很快,但生成的文件较大,且无法保留VBA代码)
解决方案十一:
批量导出Excel文件到指定数据库//导出按钮事件privatevoidbtn_Export_Click(objectsender,EventArgse){string[]P_str_Names=txt_Path.Text.Split(',');//存储所有选择的Excel文件名stringP_str_Name="";//存储遍历到的Excel文件名List<string>P_list_SheetNames=newList<string>();//实例化泛型集合对象,用来存储工作表名称for(inti=0;i<P_str_Names.Length-1;i++)//遍历所有选择的Excel文件名{P_str_Name=P_str_Names[i];//记录遍历到的Excel文件名P_list_SheetNames=GetSheetName(P_str_Name);//获取Excel文件中的所有工作表名for(intj=0;j<P_list_SheetNames.Count;j++)//遍历所有工作表{if(rbtn_Access.Checked)//判断Access数据库连接设置单选按钮选中{//CodeGo.net/ImportDataToAccess(P_str_Name,P_list_SheetNames[j]);//将将工作表内容导出到Access}elseif(rbtn_Sql.Checked)//判断SqlServer数据库连接设置单选按钮选中{if(ckbox_Windows.Checked)//如果用Windows身份验证登录SqlServerImportDataToSql(P_str_Name,P_list_SheetNames[j],"DataSource="+txt_Server.Text+";InitialCatalog="+cbox_Server.Text+";IntegratedSecurity=SSPI;");//将工作表内容导出到SqlServerelseif(ckbox_SQL.Checked)//如果用SqlServer身份验证登录SqlServerImportDataToSql(P_str_Name,P_list_SheetNames[j],"DataSource="+txt_Server.Text+";Database="+cbox_Server.Text+";Uid="+txt_Name.Text+";Pwd="+txt_Pwd.Text+";");//将工作表内容导出到SqlServer}}}MessageBox.Show("已经将所有选择的Excel工作表导入到了指定的数据库中!","提示",MessageBoxButtons.OK,MessageBoxIcon.Information);}//存储泛型集合privateList<string>GetSheetName(stringP_str_Excel)//获取所有工作表名称{List<string>P_list_SheetName=newList<string>();//实例化泛型集合对象//连接Excel数据库OleDbConnectionolecon=newOleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;DataSource="+P_str_Excel+";ExtendedProperties=Excel8.0");olecon.Open();//打开数据库连接System.Data.DataTableDTable=olecon.GetSchema("Tables");//实例化表对象DataTableReaderDTReader=newDataTableReader(DTable);//实例化表读取对象while(DTReader.Read())//循环读取{stringP_str_Name=DTReader["Table_Name"].ToString().Replace('$','').Trim();//记录工作表名称if(!P_list_SheetName.Contains(P_str_Name))//判断泛型集合中是否已经存在该工作表名称P_list_SheetName.Add(P_str_Name);//将工作表名添加到泛型集合中}DTable=null;//清空表对象DTReader=null;//清空表读取对象olecon.Close();//关闭数据库连接returnP_list_SheetName;//返回得到的泛型集合}//导入指定数据库privatevoidImportDataToAccess(stringP_str_Excel,stringP_str_SheetName){objectmissing=System.Reflection.Missing.Value;//声明object缺省值Microsoft.Office.Interop.Excel.Applicationexcel=newMicrosoft.Office.Interop.Excel.Application();//实例化Excel对象//打开Excel文件Microsoft.Office.Interop.Excel.Workbookworkbook=excel.Workbooks.Open(P_str_Excel,missing,missing,missing,missing,missing,missing,missing,missing,missing,missing,missing,missing,missing,missing);Microsoft.Office.Interop.Excel.Worksheetworksheet;//声明工作表Microsoft.Office.Interop.Access.Applicationaccess=newMicrosoft.Office.Interop.Access.Application();//实例化Access对象worksheet=((Microsoft.Office.Interop.Excel.Worksheet)workbook.Worksheets[P_str_SheetName]);//获取选择的工作表worksheet.Move(workbook.Sheets[1],missing);//将选择的工作表作为第一个工作表objectP_obj_Name=(object)worksheet.Name;//获取工作表名称excel.DisplayAlerts=false;//设置Excel保存时不显示对话框workbook.Save();//保存工作簿CloseProcess("EXCEL");//关闭所有Excel进程try{access.OpenCurrentDatabase(txt_Access.Text,true,"");//打开Access数据库//将Excel指定工作表中的数据导入到Access中access.DoCmd.TransferSpreadsheet(Microsoft.Office.Interop.Access.AcDataTransferType.acImport,Microsoft.Office.Interop.Access.AcSpreadSheetType.acSpreadsheetTypeExcel97,P_obj_Name,P_str_Excel,true,missing,missing);access.Quit(Microsoft.Office.Interop.Access.AcQuitOption.acQuitSaveAll);//关闭并保存Access数据库文件CloseProcess("MSACCESS");//关闭所有Access数据库进程}catch{MessageBox.Show("Access数据库中已经存在"+P_str_SheetName+"表!","警告",MessageBoxButtons.OK,MessageBoxIcon.Warning);CloseProcess("MSACCESS");//关闭所有Access数据库进程}}
解决方案十二:

解决方案十三:
引用4楼diaodiaop的回复:

既然你都用nopi了..道理来说不能啊..你说的卡是有多卡...

就是数据过W基本要等20多秒
解决方案十四:
引用6楼Z65443344的回复:

for(intj=0;j<4;j++)只有3列,为什么循环4次,后面加个空单元格?还有,处理数据和导出的过程最好分开,尽量不要一次执行太复杂的逻辑导出前在别的地方把数据处理好,直接导出

嗯是3写错了
解决方案十五:
我这个例子测试33333行数据每行10列数据全都是GUID很快..
解决方案:
求解,大数据导出慢问题http://bbs.csdn.net/topics/390881667
解决方案:
List<Vinotes.Model.GrapeType>list=WServices.GrapeTypeList(0).ToList();我估计你这里已经花了4,5秒
解决方案:
之前写过用流导出,速度确实很快,但是没法设置一些格式。

时间: 2024-10-05 00:38:24

导出EXCEL表格时 如何优化代码适应大数据量的相关文章

MySQL大数据量时提高分页效率

我的这段代码是大数据量时提高分页的效率的测试代码 --提高分页效率:实现分页时只读取显示数据,需要先在数据库创建数据库"TestForPaging" use TestForPaging go --创建表SomeData create table SomeData ( id int primary key, name varchar(30) null, description text ) go --插入数据 insert into SomeData values(1,'num1','第

跪求java导出excel表格代码

问题描述 跪求java导出excel表格代码 方法执行了一点效果也没有,后台也没报错 解决方案 你可以 断点看下处理流程 及返回结果 解决方案二: 你可以 断点看下处理流程 及返回结果 解决方案三: 导出EXCEL表格的代码java写的excel表格数据导出代码java导出excel表格 解决方案四: 自己要学会排错,导出还是很简单的 解决方案五: 分块判断代码,先注释掉生成Excel代码,直接返回一个现有文件,看看浏览器上是否能收到返回流,这样确定响应返回文件的代码正确. 其次检查文件生成代码

Jquery ajax请求导出Excel表格的实现代码_jquery

直接贴代码吧 $("#btn-export").click(function(){ var exportExcel = "export_excel"; dataParams[exportExcel] = 1; var params = $.param(dataParams); var url = host+"&"+params; $('<form method="post" action="' + ur

代码-C#导入与导出Excel表格

问题描述 C#导入与导出Excel表格 C#中导入与导出Excel表格怎么弄,麻烦把每一行代码的意思都写上注释,本人比较笨,看不懂网上写的一大推的代码.谢谢了. 解决方案 http://www.cnblogs.com/xiaolifeidao/p/3651940.htmlhttp://blog.csdn.net/sunzongteng/article/details/7870081 如果需要详细注释,请采纳本回答,再开问题提问.每个问题可以为你解答不超过30行代码.

Java读写与导出Excel表格实例代码详解

正常导出报表的场景就是从数据库读取数据,然后按照指定的格式生成报表.其中可能涉及到的就是插入/复制行,单元格设置公式计算这些典型应用.下面就按这个需求给出解决方案.思路就是,首先制定一个Excel模板文档,暂命名为TEMPLATE.xls:然后读取该文档,插入/复制一些数据进去,另存为新的报表文件.这样就不需要在写入数据的时候考虑繁琐的表格样式问题了. 读取模板文件  代码如下 复制代码 POIFSFileSystem fs = new POIFSFileSystem(new FileInput

VB.NET版机房收费系统---导出Excel表格

       datagridview,翻译成中文的意思是数据表格显示,使用DataGridView控件,可以显示和编辑来自不同类型的数据源的表格,将数据绑定到DataGridView控件非常简单和直观,大多数情况下,只需要设置DataSource属性即可,在绑定到包含多个列表或表的数据库源时,只需将DataMember属性设置为绑定的列表或表的字符串即可.机房收费系统多次用到数据表格的显示,并且导出为Excel表格,第一次机房收费系统是用VB版本的,她导出Excel的方法如下:        

asp.net mvc 实现导出excel表格功能怎么做?谢谢

问题描述 asp.net mvc 实现导出excel表格功能怎么做?谢谢 我在做asp.net mvc项目时,想将查询出来的数据 导出到excel表格,请问如何实现,请求具体的代码,谢谢 解决方案 参考在MVC中实现和网站不同服务器的批量文件下载以及NOPI下载数据到Excel的简单学习 (注:NOPI应为NPOI,一个开源的项目)

如何让数据库的数据导出EXCEL表格里面并且四舍五入。

问题描述 总之就是运行VS的时候有个导出EXCEL功能的按钮,是从数据库提取数据的,VS显示的时候我用JS实现了小数点四舍五入功能,但是导出EXCEL表格不知道怎么实现因为它是直接从数据库提取数据的,不是从VS运行的页面显示的.我现在想要导出的EXCEL实现数据四舍五入.求各路大哥帮帮忙. 解决方案 解决方案二:那就修改从数据库提取数据的代码,往excel中写数据的时候就把数据四舍五入下.解决方案三:VS页面和数据,看申报单价和申报总价解决方案四:数据库数据解决方案五:这个是EXCEL数据解决方

ssh与ireport整合导出excel表格

问题描述 ssh与ireport整合导出excel表格 ssh与ireport整合导出excel时,如何设置导出的excel的sheet值,如何导出多个sheet 解决方案 http://blog.csdn.net/zhuaikunkun/article/details/6718079看看这能不能帮助到你