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;
}
EPPlus导出两千万行记录到xlsx的c#代码的更多相关文章
- EPPlus导出两千万记录的测试代码
采用导入100w条记录一个文件,然后合并的方式 using System; using System.IO; using OfficeOpenXml; using System.Data; using ...
- C# NPOI导出Excel和EPPlus导出Excel比较
系统中经常会使用导出Excel的功能. 之前使用的是NPOI,但是导出数据行数多就报内存溢出. 最近看到EPPlus可以用来导出Excel,就自己测了下两者导出上的差异. NPIO官网地址:http: ...
- C# NPOI导出Excel和EPPlus导出Excel
转自:http://www.cnblogs.com/tanpeng/p/6155749.html 系统中经常会使用导出Excel的功能.之前使用的是NPOI,但是导出数据行数多就报内存溢出. 最近看到 ...
- C# 使用Epplus导出Excel [2]:导出动态列数据
C# 使用Epplus导出Excel [1]:导出固定列数据 C# 使用Epplus导出Excel [2]:导出动态列数据 C# 使用Epplus导出Excel [3]:合并列连续相同数据 C# 使用 ...
- C# 使用Epplus导出Excel [1]:导出固定列数据
C# 使用Epplus导出Excel [1]:导出固定列数据 C# 使用Epplus导出Excel [2]:导出动态列数据 C# 使用Epplus导出Excel [3]:合并列连续相同数据 C# 使用 ...
- linux下python导出sybase 数据库 表记录的方式
导出sybase 数据库 表记录的方式 1 执行启动sybase 数据库命令 code : dbeng7 gkdb 2 执行 连接sybase 数据库命令code : dbisql -c " ...
- XE中FMX操作ListBox,添加上千条记录(含图片)
我之前是想在ListBox的每个Item上添加一个图片,Item上所有的内容都是放在Object里赋值,结果发现加载一百条记录耗时四五秒: procedure TMainForm.AddItem; v ...
- C# 使用Epplus导出Excel [5]:样式
C# 使用Epplus导出Excel [1]:导出固定列数据 C# 使用Epplus导出Excel [2]:导出动态列数据 C# 使用Epplus导出Excel [3]:合并列连续相同数据 C# 使用 ...
- C# 使用Epplus导出Excel [4]:合并指定行
C# 使用Epplus导出Excel [1]:导出固定列数据 C# 使用Epplus导出Excel [2]:导出动态列数据 C# 使用Epplus导出Excel [3]:合并列连续相同数据 C# 使用 ...
随机推荐
- Android图文具体解释属性动画
Android中的动画分为视图动画(View Animation).属性动画(Property Animation)以及Drawable动画.从Android 3.0(API Level 11)開始. ...
- 【转】priority_queue的用法
http://www.cnblogs.com/flyoung2008/articles/2136485.html priority_queue调用 STL里面的 make_heap(), pop_he ...
- [WebGL入门]十三,minMatrix.js和坐标变换矩阵
注:文章译自http://wgld.org/,原作者杉本雅広(doxas),文章中假设有我的额外说明,我会加上[lufy:],另外,鄙人webgl研究还不够深入,一些专业词语,假设翻译有误,欢迎大家指 ...
- Xcode编译Undefined symbols for architecture xxx 错误总结
可能会遇到这几种错误:Undefined symbols for architecture armv7Undefined symbols for architecture armv7sUndefine ...
- Tomcat启动失败问题解决
1. 系统框架加载正常,但是Tomcat启动失败,报错如下: 2013-7-26 17:18:33 org.apache.catalina.core.StandardContext startInte ...
- webpack单独构建scss文件与.vue组件里构建scss的一个坑
在入口main.js里构建scss是通过引入模块的方式 import './assets/_reset.scss'; import './assets/_flex.scss'; import './a ...
- OpenVZ安装指南,一种操作系统级别的虚拟化技术
鼎鼎大名的 OpenVZ 谁不知道?在主机行业被使用(滥用)很多年,依然在茁壮发展.作为一种操作系统级别的虚拟化技术,运行 OpenVZ 没有硬性的硬件要求.OpenVZ 能够创建被称为容器(cont ...
- 相关ubuntu有几个细节有用的工具系列
前言 于Linux制,FTPserver有许多软件,我们已经成熟,像vsftpd, wu-ftp, Pure-FTPd等一下.不过该软件的安装一切,配置比较麻烦,建立个人FTPserver,仍是Pro ...
- html head标签的内容跑到body标签中 , 并且body中多了个空格
今天遇到一个奇怪的问题 , 就是在head标签中写的内容跑到body标签中 , 第一种也是经常遇到的情况就是编码 UTF-8 格式带BOM的 , 这种情况是会多一个空格 , 这个基本都知道 , 按ut ...
- ADO.NET - 批量更新或添加数据
方法一:使用SqlBulkCopy实现批量更新或添加数据. SqlBulkCopy类一般只能用来将数据批量插入打数据库中,如果数据表中设置了主键,出现重复数据的话会报错,如果没有设置主键,那么将会添加 ...