C# EPPlus使用200+;将datatable列转换为多个excel文件
我有一个使用EPPlus将所有记录从SQL表保存到excel工作表的函数。 如果我导出少量数据,一切正常,但对于200多个列和500000多个行,我得到了内存异常 我想修改我的代码,使每个文件能够保存50000条记录 以下是我针对小数据的代码:C# EPPlus使用200+;将datatable列转换为多个excel文件,c#,.net-4.5,epplus,epplus-4,C#,.net 4.5,Epplus,Epplus 4,我有一个使用EPPlus将所有记录从SQL表保存到excel工作表的函数。 如果我导出少量数据,一切正常,但对于200多个列和500000多个行,我得到了内存异常 我想修改我的代码,使每个文件能够保存50000条记录 以下是我针对小数据的代码: private Task SaveAsync(string tableName) { return Task.Run(() => { try { using (var con
private Task SaveAsync(string tableName)
{
return Task.Run(() =>
{
try
{
using (var conn = new SqlConnection(_connectionString))
{
using (var cmd = new SqlCommand(string.Format(DataQuery, tableName), conn))
{
cmd.CommandType = CommandType.Text;
cmd.CommandTimeout = 360;
conn.Open();
using (SqlDataReader sdr = cmd.ExecuteReader())
{
var fileName = string.Format(TargetFile, tableName);
if (File.Exists(fileName))
{
File.Delete(fileName);
}
sdr.Read();
var numberOfRecordsInTable = sdr.GetInt32(0);
sdr.NextResult();
using (ExcelPackage pck = new ExcelPackage(new FileInfo(fileName)))
{
ExcelWorksheet ws = pck.Workbook.Worksheets.Add("Results");
int count = sdr.FieldCount;
int col = 1, row = 1;
for (int i = 0; i < count; i++)
{
ws.SetValue(row, col++, sdr.GetName(i));
}
row++;
col = 1;
while (sdr.Read())
{
for (int i = 0; i < count; i++)
{
var val = sdr.GetValue(i);
ws.SetValue(row, col++, val);
}
row++;
col = 1;
}
//autosize
ws.Cells[ws.Dimension.Address].AutoFitColumns();
//autofiltr
ws.Cells[1, 1, 1, count].AutoFilter = true;
}
}
conn.Close();
}
}
}
catch (Exception e)
{
Debug.WriteLine("Error at: " + Thread.CurrentThread.ManagedThreadId);
Debug.WriteLine(e);
}
});
}
private Task SaveAsync(字符串tableName)
{
返回任务。运行(()=>
{
尝试
{
使用(var conn=newsqlconnection(_connectionString))
{
使用(var cmd=newsqlcommand(string.Format(DataQuery,tableName),conn))
{
cmd.CommandType=CommandType.Text;
cmd.CommandTimeout=360;
conn.Open();
使用(SqlDataReader sdr=cmd.ExecuteReader())
{
var fileName=string.Format(TargetFile,tableName);
if(File.Exists(fileName))
{
删除(文件名);
}
sdr.Read();
var NumberOfRecordsTable=sdr.GetInt32(0);
sdr.NextResult();
使用(ExcelPackage pck=新的ExcelPackage(新文件信息(文件名)))
{
Excel工作表ws=pck.Workbook.Worksheets.Add(“结果”);
int count=sdr.FieldCount;
int col=1,row=1;
for(int i=0;i
我修改过的代码将每个文件的记录拆分为50000条:
private Task SaveAsync2(string tableName)
{
return Task.Run(() =>
{
try
{
using (var conn = new SqlConnection(_connectionString))
{
using (var cmd = new SqlCommand(string.Format(DataQuery, tableName), conn))
{
cmd.CommandType = CommandType.Text;
cmd.CommandTimeout = 360;
conn.Open();
using (SqlDataReader sdr = cmd.ExecuteReader())
{
var fileName = string.Format(TargetFile, tableName,"");
if (File.Exists(fileName))
{
File.Delete(fileName);
}
sdr.Read();
var max = sdr.GetInt32(0);
int filesCount = 1;
if (max > 50000)
{
fileName = string.Format(TargetFile, tableName, filesCount);
}
sdr.NextResult();
ExcelPackage pck = new ExcelPackage(new FileInfo(fileName));
ExcelWorksheet ws = pck.Workbook.Worksheets.Add("RESULTS");
int count = sdr.FieldCount;
int col = 1, row = 1;
for (int i = 0; i < count; i++)
{
ws.SetValue(row, col++, sdr.GetName(i));
}
row++;
col = 1;
while (sdr.Read())
{
for (int i = 0; i < count; i++)
{
var val = sdr.GetValue(i);
ws.SetValue(row, col++, val);
}
row++;
col = 1;
if (row > 50000)
{
pck.Save();
filesCount++;
fileName = string.Format(TargetFile, tableName, filesCount);
pck = new ExcelPackage(new FileInfo(fileName));
ws = pck.Workbook.Worksheets.Add("RESULTS");
count = sdr.FieldCount;
col = 1;
row = 1;
for (int i = 0; i < count; i++)
{
ws.SetValue(row, col++, sdr.GetName(i));
}
row++;
col = 1;
}
}
//autosize
ws.Cells[ws.Dimension.Address].AutoFitColumns();
//autofiltr
ws.Cells[1, 1, 1, count].AutoFilter = true;
pck.Save();
}
}
conn.Close();
}
}
catch (Exception e)
{
Debug.WriteLine("Error at: " + Thread.CurrentThread.ManagedThreadId);
Debug.WriteLine(e);
}
});
}
private Task SaveAsync2(字符串tableName)
{
返回任务。运行(()=>
{
尝试
{
使用(var conn=newsqlconnection(_connectionString))
{
使用(var cmd=newsqlcommand(string.Format(DataQuery,tableName),conn))
{
cmd.CommandType=CommandType.Text;
cmd.CommandTimeout=360;
conn.Open();
使用(SqlDataReader sdr=cmd.ExecuteReader())
{
var fileName=string.Format(TargetFile,tableName,“”);
if(File.Exists(fileName))
{
删除(文件名);
}
sdr.Read();
var max=sdr.GetInt32(0);
int filescont=1;
如果(最大值>50000)
{
fileName=string.Format(TargetFile、tableName、filescont);
}
sdr.NextResult();
ExcelPackage pck=新的ExcelPackage(新文件信息(文件名));
Excel工作表ws=pck.Workbook.Worksheets.Add(“结果”);
int count=sdr.FieldCount;
int col=1,row=1;
for(int i=0;i50000)
{
pck.Save();
filescout++;
fileName=string.Format(TargetFile、tableName、filescont);
pck=新的ExcelPackage(新文件信息(文件名));
ws=pck.Workbook.Worksheets.Add(“结果”);
count=sdr.FieldCount;
col=1;
行=1;
for(int i=0;iconst int max = 10;
var loop = 0;
using (var sdr = cmd.ExecuteReader())
{
var fieldcount = sdr.FieldCount;
var getfi = new Func<int, FileInfo>(i =>
{
var fi = new FileInfo(String.Format(@"c:\temp\Multi_Files{0}.xlsx", i));
if (fi.Exists) fi.Delete();
return fi;
});
var savefile = new Action<FileInfo, List<Object[]>>((info, rows) =>
{
using (var pck = new ExcelPackage(info))
{
var wb = pck.Workbook;
var ws = wb.Worksheets.Add("RESULTS");
for (var row = 0; row < rows.Count; row++)
for (var col = 0; col < fieldcount; col++)
ws.SetValue(row + 1, col + 1, rows[row][col]);
pck.Save();
}
});
var rowlist = new List<Object[]>();
while (sdr.Read())
{
var rowdata = new Object[sdr.FieldCount];
sdr.GetValues(rowdata);
rowlist.Add(rowdata);
if (rowlist.Count == max)
{
savefile(getfi(++loop), rowlist);
rowlist.Clear();
}
}
if (rowlist.Count > 0)
savefile(getfi(++loop), rowlist);
}
using (var conn = new SqlConnection(_connectionString))
{
int filesCount = 1;
int col = 1, row = 1;
string fileName = String.Empty;
int count;
ExcelPackage pck;
ExcelWorksheet ws;
using (var cmd = new SqlCommand(string.Format(DataQuery, tableName), conn))
{
cmd.CommandType = CommandType.Text;
cmd.CommandTimeout = 360;
conn.Open();
using (SqlDataReader sdr = cmd.ExecuteReader())
{
while (sdr.Read())
{
if (row == 1)
{
fileName = string.Format(TargetFile, tableName, filesCount);
if (File.Exists(fileName))
{
File.Delete(fileName);
}
pck = new ExcelPackage(new FileInfo(fileName));
ws = pck.Workbook.Worksheets.Add("RESULTS");
}
count = sdr.FieldCount;
for (int i = 0; i < count; i++)
{
var val = sdr.GetValue(i);
ws.SetValue(row, col++, val);
}
row++;
col = 1;
if (row >= 50000)
{
ws.Cells[ws.Dimension.Address].AutoFitColumns();
ws.Cells[1, 1, 1, count].AutoFilter = true;
pck.Save();
row = 1;
filesCount+
}
}
}
if (row > 1)
{
ws.Cells[ws.Dimension.Address].AutoFitColumns();
ws.Cells[1, 1, 1, count].AutoFilter = true;
pck.Save();
}
}
}
conn.Close();