问题描述
网站后台代码数据量不大或者逻辑不复杂的情况下秒导一旦数据量超过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秒
解决方案:
之前写过用流导出,速度确实很快,但是没法设置一些格式。