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;
}

  

EPPlus导出两千万行记录到xlsx的c#代码的更多相关文章

  1. EPPlus导出两千万记录的测试代码

    采用导入100w条记录一个文件,然后合并的方式 using System; using System.IO; using OfficeOpenXml; using System.Data; using ...

  2. C# NPOI导出Excel和EPPlus导出Excel比较

    系统中经常会使用导出Excel的功能. 之前使用的是NPOI,但是导出数据行数多就报内存溢出. 最近看到EPPlus可以用来导出Excel,就自己测了下两者导出上的差异. NPIO官网地址:http: ...

  3. C# NPOI导出Excel和EPPlus导出Excel

    转自:http://www.cnblogs.com/tanpeng/p/6155749.html 系统中经常会使用导出Excel的功能.之前使用的是NPOI,但是导出数据行数多就报内存溢出. 最近看到 ...

  4. C# 使用Epplus导出Excel [2]:导出动态列数据

    C# 使用Epplus导出Excel [1]:导出固定列数据 C# 使用Epplus导出Excel [2]:导出动态列数据 C# 使用Epplus导出Excel [3]:合并列连续相同数据 C# 使用 ...

  5. C# 使用Epplus导出Excel [1]:导出固定列数据

    C# 使用Epplus导出Excel [1]:导出固定列数据 C# 使用Epplus导出Excel [2]:导出动态列数据 C# 使用Epplus导出Excel [3]:合并列连续相同数据 C# 使用 ...

  6. linux下python导出sybase 数据库 表记录的方式

    导出sybase 数据库 表记录的方式 1 执行启动sybase 数据库命令 code : dbeng7 gkdb 2 执行 连接sybase 数据库命令code : dbisql -c " ...

  7. XE中FMX操作ListBox,添加上千条记录(含图片)

    我之前是想在ListBox的每个Item上添加一个图片,Item上所有的内容都是放在Object里赋值,结果发现加载一百条记录耗时四五秒: procedure TMainForm.AddItem; v ...

  8. C# 使用Epplus导出Excel [5]:样式

    C# 使用Epplus导出Excel [1]:导出固定列数据 C# 使用Epplus导出Excel [2]:导出动态列数据 C# 使用Epplus导出Excel [3]:合并列连续相同数据 C# 使用 ...

  9. C# 使用Epplus导出Excel [4]:合并指定行

    C# 使用Epplus导出Excel [1]:导出固定列数据 C# 使用Epplus导出Excel [2]:导出动态列数据 C# 使用Epplus导出Excel [3]:合并列连续相同数据 C# 使用 ...

随机推荐

  1. 数据局部性(data locality)

    信息处理的典型模式是,将所有数据项视为一个集合,并将其组织为适宜的数据结构(或者说使用适宜的数据结构对之进行存储以及组织),进而借助操作接口高效访问. 为了考查和评价各操作接口的效率,除了从最坏情况的 ...

  2. Android 解决Android的TextView和EditText换行问题

    最近版本迭代的新增收货地址模块出现地址填写时点击换行,然后网络提交数据到后台,在地址列表查看地址时,也出现换行的问题. 问题效果图: 1.分析原因 用Google的DHC工具进行网络模拟请求,发现返回 ...

  3. [Angular] Working with FormArray

    'FormArray' can work with array of 'FormGroup' or 'FormControl'. form = new FormGroup({ stock: new F ...

  4. java完美equals方法代码段

    public boolean equals(Object otherObject) { if(this == otherObject) { // 检測this与otherObject是否引用同一个对象 ...

  5. NOIP模拟 Work - 二分 + 树状数组 / ???

    题目分析 如果没有最后的注意事项,此题就是二分裸题.有了注意事项,会有两种思路: 在线:二分天数t,并在主席树上求1~t天中大于d(浪费的时间)的时间之和以及数量,答案即为:sum - d * cnt ...

  6. Swagger与postman使用心得

    Swagger接口文档,在线自动生成模板和页面.服务器地址加上swagger-ui.html后缀即可访问到(https://域名:端口号/swagger-ui.html). 使用时在java代码中引用 ...

  7. lucene 7.x 查询

    @Test public void indexSearch() throws IOException, ParseException { //Termquery:精确string查询 // Query ...

  8. Babel与Polyfill的关系和区别

    很多同学搞不清楚babel与polyfill的关系以及区别,这儿给大家细致解惑. Babel:Babel 是一个广泛使用的 ES6 转码器,可以将 ES6 代码转为 ES5 代码.注意:Babel 默 ...

  9. AndroidStudio封装SDK的那些事

    来自自己简书博客:原文地址:https://www.jianshu.com/p/4d092c915ef1 首先SDK是提供给别人调用的工具.所以常见的SDK都是以jar包,so库,aar包等方式导入A ...

  10. java做微信支付notify_url异步通知服务端的写法

    最近团队在接入微信支付,APP和JSAPI的接口都需要填写一个notify_url回调地址,但是坑爹的官方文档并没有找到JSAPI模式的java版的demo,所以不得不自己看文档写了一个接受微信异步通 ...