采用导入100w条记录一个文件,然后合并的方式

using System;
using System.IO;
using OfficeOpenXml;
using System.Data;
using System.Diagnostics;
using System.ComponentModel;
using System.Collections.Generic; namespace ConsoleApp2
{
class Program
{
static void Main(string[] args)
{ Stopwatch watch = new Stopwatch();
watch.Start();
List<string> zlist = new List<string>(); using (DataTable sourceTable = new DataTable())
{
sourceTable.TableName = "test";
sourceTable.Columns.Add("NO", typeof(string));
sourceTable.Columns.Add("a", typeof(int));
sourceTable.Columns.Add("b", typeof(float)); for (int i = 0; i < 40000000 / 1; i++)
{
DataRow dr = sourceTable.NewRow();
dr["NO"] = "#" + (i + 1).ToString(); ;
dr["a"] = i;
dr["b"] = i;
sourceTable.Rows.Add(dr);
dr = null;
} int dd = 1000000 / 1;
int pages = (int)sourceTable.Rows.Count / dd + 1;
if (sourceTable.Rows.Count % dd == 0)
pages = pages - 1; for (int i = 1; i <= pages; i++)
{
string zfilename = Guid.NewGuid().ToString() + ".xlsx";
zlist.Add(zfilename); FileInfo zfile = new FileInfo(AppDomain.CurrentDomain.BaseDirectory + zfilename); using (ExcelPackage excel = new ExcelPackage(zfile))
{
ExcelWorksheet ws = excel.Workbook.Worksheets.Add(sourceTable.TableName + i.ToString()); for (int zcol = 0; zcol < sourceTable.Columns.Count; zcol++)
{
ws.Cells[1, zcol + 1].Value = sourceTable.Columns[zcol].ColumnName;
} int zrow = 0;
while (sourceTable.Rows.Count > 0)
{
for (int zcol = 0; zcol < sourceTable.Columns.Count; zcol++)
{
ws.Cells[zrow + 2, zcol + 1].Value = sourceTable.Rows[0][zcol];
} sourceTable.Rows.RemoveAt(0);
zrow++;
if (zrow % dd == 0)
break;
} Console.WriteLine(string.Format("pageindex:{0}" ,i));
excel.Save(); } } sourceTable.Rows.Clear();
sourceTable.Columns.Clear();
sourceTable.Clear();
sourceTable.Reset(); }
GC.Collect();
GC.WaitForFullGCComplete(); string zpath = AppDomain.CurrentDomain.BaseDirectory;
zpath = zpath.Substring(0, zpath.Length - 1); MergeExcel(zpath, zlist, string.Format("{0}.xlsx" ,Guid.NewGuid())); foreach (string item in zlist)
{
File.Delete(zpath + "\\" + item);
}
watch.Stop(); Console.Write("用时:" + watch.Elapsed.ToString());
Console.ReadLine();
Console.ReadLine(); } public static 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;
} private static bool MergeExcel(string _stFilePath, List<string> _listFiles, string _stSaveFileName)
{
ExcelPackage epMergeFile = new ExcelPackage();
bool result = true;
try
{
string stSheetName = string.Empty;
int zi = 0;
foreach (string item in _listFiles)
{
zi++;
FileInfo newFile = new FileInfo(_stFilePath + "\\" + item); using (ExcelPackage pck = new ExcelPackage(newFile))
{ ExcelWorkbook workBook = pck.Workbook;
if (workBook != null)
{
if (workBook.Worksheets.Count > 0)
{ stSheetName = workBook.Worksheets[1].Name;
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导出两千万记录的测试代码的更多相关文章

  1. EPPlus导出两千万行记录到xlsx的c#代码

    private void button5_Click(object sender, EventArgs e) { Stopwatch watch = new Stopwatch(); Backgrou ...

  2. Android网络传输中必用的两个加密算法:MD5 和 RSA (附java完成测试代码)

    MD5和RSA是网络传输中最常用的两个算法,了解这两个算法原理后就能大致知道加密是怎么一回事了.但这两种算法使用环境有差异,刚好互补. 一.MD5算法 首先MD5是不可逆的,只能加密而不能解密.比如明 ...

  3. SQLServer中处理每天四亿三千万记录

    我是如何在SQLServer中处理每天四亿三千万记录的   首先声明,我只是个程序员,不是专业的DBA,以下这篇文章是从一个问题的解决过程去写的,而不是一开始就给大家一个正确的结果,如果文中有不对的地 ...

  4. 03_MyBatis基本查询,mapper文件的定义,测试代码的编写,resultMap配置返回值,sql片段配置,select标签标签中的内容介绍,配置使用二级缓存,使用别名的数据类型,条件查询ma

     1 PersonTestMapper.xml中的内容如下: <?xmlversion="1.0"encoding="UTF-8"?> < ...

  5. xilinx DMA IP核(一) —— loop测试 代码注释

    本篇笔记中的代码来自:米联科技的教程“第三季第一篇的DMA_LOOP环路测试” 硬件的连接如下图所示: 图:DMA Loop Block Design 橘色的线就是DMA加FIFO组成的一个LOOP循 ...

  6. .NET单元测试的艺术-3.测试代码

    开篇:上一篇我们学习单元测试和核心技术:存根.模拟对象和隔离框架,它们是我们进行高质量单元测试的技术基础.本篇会集中在管理和组织单元测试的技术,以及如何确保在真实项目中进行高质量的单元测试. 系列目录 ...

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

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

  8. .NET 程序启动调试器 .NET 测试代码耗费时间

    有些场景的.NET程序,不容易设置断点,可以用下面的方法,在.NET代码中增加启动调试器的代码: if (!Debugger.IsAttached) Debugger.Launch(); .cshar ...

  9. Git合并开发代码分支到测试代码分支

    ——转载请注明出自天外归云的博客园 用TortoiseGit下载代码到本地 首先需要在本机安装好TortoiseGit.然后在随便哪个路径下比如D盘,右键“Git Clone”: 然后URL处选择项目 ...

随机推荐

  1. ios开发不能不知的动态修复bug补丁第三方库JSPatch 使用学习:JSPatch导入、和使用、.js文件传输加解密

    JSPatch ios开发不能不知的动态修复bug补丁第三方库JSPatch 使用学习:JSPatch导入.和使用..js文件传输加解密 ios开发面临审核周期长,修复bug延迟等让人无奈的问题,所以 ...

  2. Net程序调试

    Net程序调试 前言 作为一个.net开发工程师,不管是在写桌面程序.服务程序或web程序,在开发阶段,我们必须非常熟悉vs的动态调试技能,当然web程序可能还需要调试前端的脚本或样式,这不在本文的讨 ...

  3. ssh连接上腾讯云、华为云Linux服务器,一会就自动断开

    客户端向服务端发送心跳 依赖 ssh 客户端定时发送心跳,putty.SecureCRT.XShell 都有这个功能. Linux / Unix 下,编辑 ssh 配置文件: # vim /etc/s ...

  4. Android有用的任务管理器—tractor

    在平时的android开发工作中,我们常常须要运行耗时操作,有时为了用户体验还须要显示个等待框,我之前的做法都是开一个线程,然后用handler发消息进行显示和关闭等待框以及相关的ui操作.假设任务比 ...

  5. Web自动化测试(全网最给力自动化教程)

    http://www.cnblogs.com/zidonghua/p/7430083.html python+selenium自动化软件测试(第2章):WebDriver API 欢迎您来阅读和练手! ...

  6. 看看是不是你想要的:pycharm永久激活!!!

    pycharm是很强大的开发工具,但是每次注册着实让人头疼.网络上很多注册码.注册服务器等等.但都只是一年或者不能用:为次有如下解决方案.亲测有效!!! 如果想让pycharm永久被激活,比如截止日到 ...

  7. effective c++ 条款7

    1.随着多态基类应该声明一个质virtual析构函数. 假定class由于不管是什么virtual析构函数, 它应该有一个virtual析构函数. 2.classed的设计目的假设不是作为base c ...

  8. MyCat负载均衡 下篇

    MyCat负载均衡 下篇   之前在 一步一步在Windows中使用MyCat负载均衡 上篇 中已经讲了如何配置出MyCat.下面讲其相关的使用. 五.配置MyCat-eye 对于MyCat监控官网还 ...

  9. gdal库集成MrSID库的做法

    作者:朱金灿 来源:http://blog.csdn.net/clever101 首先从Lizardtech网站:http://www.lizardtech.com/download/develope ...

  10. win10 uwp 使用 asp dotnet core 做图床服务器客户端

    原文 win10 uwp 使用 asp dotnet core 做图床服务器客户端 本文告诉大家如何在 UWP 做客户端和 asp dotnet core 做服务器端来做一个图床工具   服务器端 从 ...