SQL数据库,一个一万条数据,其中要经过一些处理后导出EXCEL文件,请问高手是以什么样的方案来实现!谢谢!

解决方案 »

  1.   

    我的处理是合并行列数据,我想在存储过程中处理后直接从数据库中导出,或者在SQL中处理,因为在存储过程中处理很复杂,我只有800多行数据,只是把每行中的三列合并,就花了12秒。
      

  2.   

    如果你的数据是以DataGrid显示的那么DataGrid已经提供了导出成Excel的方法,如果不是,那就使用流
      

  3.   

    流?怎么解释呢?abandonship(焚酒煮剑)
      

  4.   

    我自己写的一段导出为excel的代码,SQL语句中未处理,导出时碰到重复数据后合并行
    private void ExportBtn_Click(object sender, System.Web.UI.ImageClickEventArgs e)
    {
    string strFileName="";
    System.Web.UI.WebControls.CheckBox chkExport=null;
    Excel.ApplicationClass excel=null;
    Excel.Workbook workbook=null;
    Excel.Worksheet activeSheet=null;
    Excel.Worksheet sheet=null;
    strFileName="平台和项目周总结和计划";
    if( System.IO.File.Exists( Server.MapPath(strFileName+".xls") ) )
    System.IO.File.Delete( Server.MapPath(strFileName+".xls") );
    try
    {
    excel=new Excel.ApplicationClass();
    workbook = excel.Workbooks.Add(Type.Missing);
    activeSheet=(Excel.Worksheet)workbook.ActiveSheet;
    int week=0;
    int rowStart=1;
    int rowCur=1;
    string strItem=null;
    int iItem=2;
    foreach(DataGridItem oDataGridItem in dgWP.Items)
    {
    chkExport = (System.Web.UI.WebControls.CheckBox)oDataGridItem.FindControl("WPCheckBox");
    if(chkExport.Checked==true)
    {
    string strWeek=((System.Web.UI.WebControls.Label)(oDataGridItem.FindControl("weekLabel"))).Text;
    if(week!=int.Parse(strWeek))//以周为单位分页
    {
    sheet = (Excel.Worksheet)excel.Sheets.Add(activeSheet,Type.Missing,Type.Missing,Type.Missing);
    DateTime dt=Convert.ToDateTime(oDataGridItem.Cells[4].Text);
    DateTime dtStart=(int)dt.DayOfWeek==0?dt.AddDays(1):dt.AddDays(6-(int)dt.DayOfWeek);
    sheet.Name=dtStart.ToShortDateString()+"计划";
    FillExcelTitle(sheet);
    week=int.Parse(strWeek);
    rowStart=2;
    rowCur=2;
    }
    //填写该计划的详细内容
    System.Data.DataTable dtWPContent=wpContent.SelectWPContentbyWPID(oDataGridItem.Cells[1].Text).Tables[0];
    if(dtWPContent.Rows.Count>0)
    {
    sheet.Cells[rowCur,1]=dtWPContent.Rows[0]["ProductLineName"].ToString();
    for(int i=0;i<dtWPContent.Rows.Count;i++)

    if(strItem==dtWPContent.Rows[i]["ProductTypeName"].ToString())
    {
    sheet.get_Range("B"+iItem.ToString(),"B"+(rowCur).ToString()).Merge(0);
    sheet.get_Range("C"+iItem.ToString(),"C"+(rowCur).ToString()).Merge(0);
    }
    else
    {
    if(strItem==null) strItem=dtWPContent.Rows[i]["ProductTypeName"].ToString();
    sheet.Cells[rowCur,2]=dtWPContent.Rows[i]["ProductTypeName"].ToString();
    sheet.Cells[rowCur,3]=dtWPContent.Rows[i]["Frequency"].ToString();
    strItem=dtWPContent.Rows[i]["ProductTypeName"].ToString();
    iItem=rowCur;
    }
    sheet.Cells[rowCur,4]=dtWPContent.Rows[i]["ProductSpec"].ToString();
    sheet.Cells[rowCur,5]=dtWPContent.Rows[i]["Content"].ToString()+"  "+dtWPContent.Rows[i]["Tester"].ToString();
    if(dtWPContent.Rows[i]["bTempFlag"].ToString()=="1")
    {
    ((Excel.Range)sheet.Cells[rowCur,5]).Font.Color=0xFF0000;
    ((Excel.Range)sheet.Cells[rowCur,5]).Font.Bold=true;
    }
    sheet.Cells[rowCur,6]=exFunc.FormatDateString(dtWPContent.Rows[i]["PlanStartTime"].ToString())
    +"-"+exFunc.FormatDateString(dtWPContent.Rows[i]["PlanEndTime"].ToString());
    sheet.Cells[rowCur,7]=exFunc.FormatDateString(dtWPContent.Rows[i]["ExecStartTime"].ToString())
    +"-"+exFunc.FormatDateString(dtWPContent.Rows[i]["ExecEndTime"].ToString());
    sheet.Cells[rowCur,8]=dtWPContent.Rows[i]["FinishState"].ToString();
    if(dtWPContent.Rows[i]["FinishState"].ToString()=="未完成")
    {
    ((Excel.Range)sheet.Cells[rowCur,8]).Font.Color=0x00FF;
    ((Excel.Range)sheet.Cells[rowCur,8]).Font.Bold=true;
    }
    sheet.Cells[rowCur,9]=dtWPContent.Rows[i]["Conclusion"].ToString();
    rowCur++;
    }
    sheet.get_Range("A"+rowStart.ToString(),"A"+(rowCur-1).ToString()).Merge(0);
    sheet.get_Range("A"+rowStart.ToString(),"I"+(rowCur-1).ToString()).Interior.Color=RandomColor();
    iItem=rowCur;
    rowStart=rowCur;
    }
    }
    }
    workbook.SaveAs(Server.MapPath(strFileName),Excel.XlFileFormat.xlWorkbookNormal, 
    null,null,false,false,Excel.XlSaveAsAccessMode.xlShared,false,false,null,
    null,null);
    Response.AppendHeader("Content-Disposition","attachment;filename="+Server.UrlEncode(strFileName)+".xls");   
    Response.ContentEncoding=System.Text.Encoding.GetEncoding("gb2312");
    Page.Response.ContentType = "Application/ms-excel";
    Response.WriteFile(strFileName+".xls");
    Response.Flush();
    Response.Clear();
    Response.End();
    workbook.Close(null,null,null);
    workbook=null;
    GC.Collect();
    GC.WaitForPendingFinalizers();
    excel.Workbooks.Close();
    excel.Quit();
    excel=null;
    GC.Collect();
    GC.WaitForPendingFinalizers();
    }
    catch(Exception ex)
    {
    workbook.Close(null,null,null);
    workbook=null;
    GC.Collect();
    GC.WaitForPendingFinalizers();
    excel.Workbooks.Close();
    excel.Quit();
    excel=null;
    GC.Collect();
    GC.WaitForPendingFinalizers();
    }
    }
    private void FillExcelTitle(Excel.Worksheet sheet)
    {
    sheet.Columns.HorizontalAlignment=Excel.XlHAlign.xlHAlignLeft;
    sheet.Columns.VerticalAlignment=Excel.XlVAlign.xlVAlignCenter;
    sheet.Columns.Font.Size=10;
    sheet.Columns.Borders.Color=0x000000;
    sheet.Columns.Borders.LineStyle=1;
    sheet.get_Range("A1","I1").Font.Bold=true;
    sheet.get_Range("A1","I1").Interior.Color=0xE0FFFF;
    sheet.get_Range("A1","I1").HorizontalAlignment=Excel.XlHAlign.xlHAlignLeft;
    sheet.get_Range("A1","I1").VerticalAlignment =Excel.XlVAlign.xlVAlignCenter;
    sheet.get_Range("A1","A1").ColumnWidth=8;
    sheet.get_Range("A1","A1").Value2="产品线";
    sheet.get_Range("B1","B1").ColumnWidth=10;
    sheet.get_Range("B1","B1").Value2="产品型号";
    sheet.get_Range("C1","C1").ColumnWidth=8;
    sheet.get_Range("C1","C1").Value2="频段";
    sheet.get_Range("D1","D1").ColumnWidth=12;
    sheet.get_Range("D1","D1").Value2="产品规格";
    sheet.get_Range("E1","E1").ColumnWidth=35;
    sheet.get_Range("E1","E1").Value2="工作内容和责任人";
    sheet.get_Range("F1","F1").ColumnWidth=20;
    sheet.get_Range("F1","F1").Value2="计划起止时间";
    sheet.get_Range("G1","G1").ColumnWidth=20;
    sheet.get_Range("G1","G1").Value2="执行起止时间";
    sheet.get_Range("H1","H1").ColumnWidth=8;
    sheet.get_Range("H1","H1").Value2="完成情况";
    sheet.get_Range("I1","I1").ColumnWidth=10;
    sheet.get_Range("I1","I1").Value2="总结";
    sheet.get_Range("E1","E1").EntireColumn.WrapText=true;
    sheet.get_Range("I1","I1").EntireColumn.WrapText=true;
    }
      

  5.   

    如果是C#导出,只需要改变HTTP输出流就行
      

  6.   

    我现在客户那边的数据大概有3万以上,客户要求导出(B/S),这么多数据,一次性导出会死人的。我之前做的是,先在存储过程中把相同的行列合并,再到程序中导出EXCEL,但就那存储过程就执行了30多秒,郁闷!只要是在存储过程中执行行列合并占用了大量时间,这里面太多判断。请问大家的具体方案!如有代码最好!谢谢!
      

  7.   

    crossbet()  在程序处理合并行列,这样处理速度不是更慢吗?
      

  8.   

    网页上操作excel代价也是很大的
    先开个fso写csv,之后一次性贴到excel合适的位置就ok拉