好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

大量数据导出Excel 之

大量数据导出Excel 之

刚才准备写这个文章的时候,看到同事发来的群消息,我邪恶了。 我相信看到这篇文章的人 都比较纯,我就跟大家分享一下吧! 主要内容:现在因为需求变化,公司需要一台服务器做中转,公司一MM 准备了一台普通PC机来做服务器,然后问我一同事看下是否可以。 同事A就回复说:不知道这台PC能不能经得住? MM回复:“呵呵.你觉得它哪个部位经受不住?”同事就回复说:“应该不会是暴露的部位 ,怕连续搞受不住,可能会影响使用次数。” ~~   之后各种联想。(看到这里,思想邪恶的人请点击下面的“推荐+1” 消除罪恶感! )

     好了, 冷笑话到此为止。直入主题吧 。  最近公司项目涉及到千百万级别的数据导出问题。 老外(客户)那边又需要整理导出的数据,所以指定需要导出Excel格式的。大家都知道Excel格式的文件最大支持数据是65535条,怎么让千百万级别的数据量显示到同一个Excel里面呢? 在网上浏览了一下,都不如意,最后听说office安装目录有API,于是整理了下。知道答案的请直接点击下面的“推荐+1”然后就可以关掉浏览器了,不知道答案的我也不绕弯子了,请蛋定的看完下面的code,然后点击"推荐+1"。 谢谢 ,供上code:

 BeginCode

    ///   <summary> 
         ///   大量数据导出
          ///   </summary> 
         ///   <param name="table"></param> 
         ///   <param name="saveFileName"></param> 
         public   static   void  ExportToExcel(System.Data.DataTable table,  string   saveFileName)
        {
              try  
            {
                  if  (table ==  null  )
                {
                      return  ;
                }
                  bool  fileSaved =  false  ;

                  //  ExcelApp xlApp = new ExcelApp(); 
 
                Application xlApp  =  new   Application();

                  if  (xlApp ==  null  )
                {
                      return  ;
                }

                Workbooks workbooks  =  xlApp.Workbooks;
                Workbook workbook  =  workbooks.Add(XlWBATemplate.xlWBATWorksheet);
                Worksheet worksheet  = (Worksheet)workbook.Worksheets[ 1 ]; //  取得sheet1 

                 long  rows =  table.Rows.Count;

                  /*  下边注释的两行代码当数据行数超过行时,出现异常:异常来自HRESULT:0x800A03EC。因为:Excel 2003每个sheet只支持最大行数据

                //Range fchR = worksheet.get_Range(worksheet.Cells[1, 1], worksheet.Cells[table.Rows.Count+2, gridview.Columns.View.VisibleColumns.Count+1]);

                //fchR.Value2 = datas;  */ 

                 if  (rows >  65535  )
                {

                      long  pageRows =  60000 ; //  定义每页显示的行数,行数必须小于 

                     int  scount = ( int )(rows /  pageRows);

                      if  (scount * pageRows < table.Rows.Count) //  当总行数不被pageRows整除时,经过四舍五入可能页数不准 
                     {
                        scount  = scount +  1  ;
                    }

                      for  ( int  sc =  1 ; sc <= scount; sc++ )
                    {
                          if  (sc >  1  )
                        {

                              object  missing =  System.Reflection.Missing.Value;

                            worksheet  =  (Microsoft.Office.Interop.Excel.Worksheet)workbook.Worksheets.Add(

                           missing, missing, missing, missing);  //  添加一个sheet 
 
                        }

                          else  
                        {
                            worksheet  = (Worksheet)workbook.Worksheets[sc]; //  取得sheet1 
                         }

                          string [,] datas =  new   string [pageRows +  1 , table.Columns.Count +  1  ];


                          for  ( int  i =  0 ; i < table.Columns.Count; i++)  //  写入字段 
                         {
                            datas[  0 , i] =  table.Columns[i].Caption;
                        }

                        Range range  = worksheet.get_Range(worksheet.Cells[ 1 ,  1 ], worksheet.Cells[ 1  , table.Columns.Count]);
                        range.Interior.ColorIndex  =  15 ; //  15代表灰色 
                        range.Font.Bold =  true  ;
                        range.Font.Size  =  9  ;

                          int  init =  int .Parse(((sc -  1 ) *  pageRows).ToString());
                          int  r =  0  ;
                          int  index =  0  ;
                          int   result;

                          if  (pageRows * sc >=  table.Rows.Count)
                        {
                            result  =  table.Rows.Count;
                        }
                          else  
                        {
                            result  =  int .Parse((pageRows *  sc).ToString());
                        }
                          for  (r = init; r < result; r++ )
                        {
                            index  = index +  1  ;
                              for  ( int  i =  0 ; i < table.Columns.Count; i++ )
                            {
                                  if  (table.Columns[i].DataType ==  typeof ( string ) || table.Columns[i].DataType ==  typeof (Decimal) || table.Columns[i].DataType ==  typeof (DateTime) || table.Columns[i].DataType ==  typeof ( int ) || table.Columns[i].DataType ==  typeof ( double  ))
                                {
                                      object  obj =  table.Rows[r][table.Columns[i].ColumnName];
                                    datas[index, i]  = obj ==  null  ?  ""  :  "  '  "  + obj.ToString().Trim(); //  在obj.ToString()前加单引号是为了防止自动转化格式 
 
                                }

                            }
                        }

                        Range fchR  = worksheet.get_Range(worksheet.Cells[ 1 ,  1 ], worksheet.Cells[index +  2 , table.Columns.Count +  1  ]);

                        fchR.Value2  =  datas;
                        worksheet.Columns.EntireColumn.AutoFit();  //  列宽自适应。 
 
                        range  = worksheet.get_Range(worksheet.Cells[ 1 ,  1 ], worksheet.Cells[index +  1  , table.Columns.Count]);

                          //  15代表灰色 
 
                        range.Font.Size  =  9  ;
                        range.RowHeight  =  14.25  ;
                        range.Borders.LineStyle  =  1  ;
                        range.HorizontalAlignment  =  1  ;

                    }

                }

                  else  
                {

                      string [,] datas =  new   string [table.Rows.Count +  2 , table.Columns.Count +  1  ];
                      for  ( int  i =  0 ; i < table.Columns.Count; i++)  //  写入字段          
                     {
                        datas[  0 , i] =  table.Columns[i].Caption;
                    }

                    Range range  = worksheet.get_Range(worksheet.Cells[ 1 ,  1 ], worksheet.Cells[ 1  , table.Columns.Count]);
                    range.Interior.ColorIndex  =  15 ; //  15代表灰色 
                    range.Font.Bold =  true  ;
                    range.Font.Size  =  9  ;

                      int  r =  0  ;
                      for  (r =  0 ; r < table.Rows.Count; r++ )
                    {
                          for  ( int  i =  0 ; i < table.Columns.Count; i++ )
                        {
                              if  (table.Columns[i].DataType ==  typeof ( string ) || table.Columns[i].DataType ==  typeof (Decimal) || table.Columns[i].DataType ==  typeof  (DateTime))
                            {
                                  object  obj =  table.Rows[r][table.Columns[i].ColumnName];
                                datas[r  +  1 , i] = obj ==  null  ?  ""  :  "  '  "  + obj.ToString().Trim(); //  在obj.ToString()前加单引号是为了防止自动转化格式 
 
                            }

                        }

                          //  System.Windows.Forms.Application.DoEvents(); 
 

                    }

                    Range fchR  = worksheet.get_Range(worksheet.Cells[ 1 ,  1 ], worksheet.Cells[table.Rows.Count +  2 , table.Columns.Count +  1  ]);

                    fchR.Value2  =  datas;

                    worksheet.Columns.EntireColumn.AutoFit();  //  列宽自适应。 
 
                    range  = worksheet.get_Range(worksheet.Cells[ 1 ,  1 ], worksheet.Cells[table.Rows.Count +  1  , table.Columns.Count]);

                      //  15代表灰色 
 
                    range.Font.Size  =  9  ;
                    range.RowHeight  =  14.25  ;
                    range.Borders.LineStyle  =  1  ;
                    range.HorizontalAlignment  =  1  ;
                }

                  if  (saveFileName !=  ""  )
                {
                      try  
                    {
                        workbook.Saved  =  true  ;
                        workbook.SaveCopyAs(saveFileName);
                        fileSaved  =  true  ;

                    }

                      catch   (Exception ex)
                    {
                        fileSaved  =  false  ;
                    }

                }

                  else  
                {

                    fileSaved  =  false  ;

                }

                xlApp.Quit();

                GC.Collect();  //  强行销毁   
                  //  web后台谈框框,winform可以使用messagebox.. 大家都懂的 
                System.Web.HttpContext.Current.Response.Write( "  <Script Language=JavaScript>...alert('Export Success! File path in D disk root directory.');</Script>  "  );
            }
              catch   (Exception)
            {
                System.Web.HttpContext.Current.Response.Write(  "  <Script Language=JavaScript>...alert('Export Error! please contact administrator!');</Script>  "  );
            }
        } 


EndCode

      ok,就这么多了,传递一个DataTable 和一个保存文件的路径即可实现,执行效果如下:(该图为30W条数据在Office 2007上的测试效果,没有计量执行时间,不过也就喝完一口水,在盖上盖子的时间) :)

     

图片二:

为了不想蹲局子,我小心翼翼的把敏感数据A掉,我突然发现QQ截图功能弱爆了,还是window自带的截图爽~~

ok就到这里,有错误的地方,敬请拍砖,期待砖砖砸脸  谢谢  再会~~


作者: 阿星  
出处: http://www.cnblogs.com/axing/  
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

 

标签:  大量数据 ,  Excel ,  导出 ,  DataTable

作者: Leo_wl

    

出处: http://www.cnblogs.com/Leo_wl/

    

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

版权信息

查看更多关于大量数据导出Excel 之的详细内容...

  阅读:54次

上一篇: 文件的压缩

下一篇:Flume日志收集