zoukankan      html  css  js  c++  java
  • EPPlus导出两千万行记录到xlsx的c#代码

         private void button5_Click(object sender, EventArgs e)
            {
                Stopwatch watch = new Stopwatch();
                BackgroundWorker bw = new BackgroundWorker();
                bw.DoWork += new DoWorkEventHandler(delegate
                {
                  
                    watch.Start();
                    using (SqlConnection conn = new SqlConnection("server=192.168.255.1; database=db1;uid=sa;pwd=sa;"))
                    {
                        conn.Open();
                        SqlCommand cmd = new SqlCommand("select * from tblMRP", conn);
    
                        SqlDataAdapter da = new SqlDataAdapter(cmd);
                        DataSet ds = new DataSet();
                        da.Fill(ds);
    
                        var col = ds.Tables[0].Columns.Add("NO", typeof(string));
                        col.SetOrdinal(0);
    
                        using (ExcelPackage p = new ExcelPackage(new FileInfo(AppDomain.CurrentDomain.BaseDirectory + Guid.NewGuid().ToString() + ".xlsx")))
                        {
                            int dd = 1000000;
                            int pages = (int)ds.Tables[0].Rows.Count / dd + 1;
                            if (ds.Tables[0].Rows.Count % dd == 0)
                                pages = pages - 1;
    
                            for (int i = 1; i <= pages; i++)
                            {
                                DataTable dt = DtSelectTop((i - 1) * dd, Math.Min(i * dd, ds.Tables[0].Rows.Count), ds.Tables[0]);
                                var ws = p.Workbook.Worksheets.Add(ds.Tables[0].TableName + i.ToString());
                                ws.Cells["A1"].LoadFromDataTable(dt, true);
                            }
                            p.Save();
                        }
                    }
    
                    watch.Stop();
                });
    
                bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(delegate
                {
                    MessageBox.Show("用时:" + watch.Elapsed.ToString());
                });
    
                bw.RunWorkerAsync();
    
               
               
            }
    
            public DataTable DtSelectTop(int from ,int to , DataTable oDT)
            {
                if (oDT.Rows.Count < from) return oDT;
    
                DataTable NewTable = oDT.Clone();
                DataRow[] rows = oDT.Select("1=1");
                for (int i = from; i < to; i++)
                {
                    ((DataRow)rows[i])["NO"] = "#" + (i+1).ToString() ;
                    NewTable.ImportRow((DataRow)rows[i]);
                }
                return NewTable;
            } 
    

      

    方法二

            public static void ExportByEPPlus(DataTable sourceTable)
            {
                Stopwatch watch = new Stopwatch();
                watch.Start();
    
                var col = sourceTable.Columns.Add("NO", typeof(string));
                col.SetOrdinal(0);
                FileInfo zfile = new FileInfo(AppDomain.CurrentDomain.BaseDirectory + Guid.NewGuid().ToString() + ".xlsx");
    
                int dd = 1000000 / 1;
                int pages = (int)sourceTable.Rows.Count / dd + 1;
                if (sourceTable.Rows.Count % dd == 0)
                    pages = pages - 1;
    
                using (ExcelPackage p = new ExcelPackage(zfile))
                {
                    using (sourceTable)
                    {
                        for (int i = 1; i <= pages; i++)
                        {
    
    
                            ExcelWorksheet ws = p.Workbook.Worksheets.Add(sourceTable.TableName + i.ToString());
                            int zstart = (i - 1) * dd;
                            int zend = Math.Min(i * dd, sourceTable.Rows.Count);
                            for (int zrow = zstart; zrow < zend; zrow++)
                            {
                                for (int zcol = 0; zcol < sourceTable.Columns.Count; zcol++)
                                {
                                    ws.Cells[zrow + 1 - zstart, zcol + 1].Value = sourceTable.Rows[zrow][zcol];
                                }
                                //Console.WriteLine($"pageindex:{i} ,rows:{zrow}");
                            }
    
    
                        }
                    }
    
                    GC.Collect(0, GCCollectionMode.Forced);
                    GC.WaitForPendingFinalizers();
    
                    p.Save();
                }
    
                watch.Stop();
    
                Console.Write("用时:" + watch.Elapsed.ToString());
                Console.Read();
    
    
    
            }
    

      

    private static bool MergeExcel(string _stFilePath, List<string> _listFiles, string _stSaveFileName)
           {
               ExcelPackage epMergeFile = new ExcelPackage();
               bool result = true;
               try
               {
                   string stSheetName = string.Empty;
                   foreach (string item in _listFiles)
                   {
                       if (!FileIsHave(_stFilePath + "\" + item)) continue;
                       FileInfo newFile = new FileInfo(_stFilePath + "\" + item);
                       //开启
                       using (ExcelPackage pck = new ExcelPackage(newFile))
                       {
                           //设定ExcelWorkBook
                           ExcelWorkbook workBook = pck.Workbook;
                           if (workBook != null)
                           {
                               if (workBook.Worksheets.Count > 0)
                               {
                                  //设置excel表格的页边距
                                   //workBook.Worksheets[1].PrinterSettings.TopMargin = 10M / 2.54M;
                                   stSheetName = item.Substring(0, item.LastIndexOf('.'));
                                   epMergeFile.Workbook.Worksheets.Add(stSheetName, workBook.Worksheets[1]);
                               }
                           }
                       }
                   }
               }
               catch (Exception ex)
               {
                   result = false;
                   Debug.WriteLine("合并文件失败:" + ex.Message);
                   throw new Exception("合并文件失败!");
               }
     
               if (result)
               {
                   string stFile = _stFilePath + "\" + _stSaveFileName;
                   epMergeFile.SaveAs(new FileInfo(stFile));
                   epMergeFile.Dispose();
               }
     
               return result;
           }
    

      

  • 相关阅读:
    如何使用phantomJS来模拟一个HTML元素的鼠标悬停
    nodejs中使用cheerio爬取并解析html网页
    Node.js 动态网页爬取 PhantomJS 使用入门(转)
    一口一口吃掉Hibernate(五)——一对多单向关联映射
    开源 免费 java CMS
    [WinForm]dataGridView导出到EXCEL
    关键帧和动画
    uva 696
    uva 11181
    IE下target获得焦点时存在虚线的问题
  • 原文地址:https://www.cnblogs.com/coolyylu/p/8043339.html
Copyright © 2011-2022 走看看