用多线程导出excel 100万条,提示没有足够的内存执行该程序,求大神指教

qq_36929384 2017-03-28 11:41:38
public void thread()
{
getId();
System.Data.DataTable db = DB(this.sqlwhere.Text.Trim()).Tables[0];
size = (int)this.number.Value;
int number = (int)Math.Ceiling((Double)db.Rows.Count / size);
// 线程池
workbooks = xlApp.Workbooks;
workbook = workbooks.Add(XlWBATemplate.xlWBATWorksheet);
worksheet = (Worksheet)workbook.Worksheets[1];//取得sheet
List<Thread> listthread = new List<Thread>();
for (int i = 0; i < number; i++)
{
listthread.Add(new Thread(new ParameterizedThreadStart(dowork),2048));
listthread[i].IsBackground = true;
listthread[i].Start(i);
}
path = this.position.Text.Trim() + "wo2.xls";
if (!Directory.Exists(Path.GetDirectoryName(path)))//判断是否有此目录。
{
Directory.CreateDirectory(Path.GetDirectoryName(path));
}
if (File.Exists(path))//判断文件是否存在
{
File.Delete(path);//存在就删除
}
GC.Collect();//强行销毁
}
Workbook workbook;
string path;
// int state;
Microsoft.Office.Interop.Excel.Application xlApp = new Microsoft.Office.Interop.Excel.Application();
Workbooks workbooks;
Worksheet worksheet;
public void dowork(object nowPage)
{
lock (this)
{
int threadIndex = (int)nowPage;
string where = "select top "+size +" * from (select row_number()over(order by "+id+")rownumber,* from "+tableName+")a where rownumber>("+size+"*"+threadIndex+")";

System.Data.DataTable db = DB(where).Tables[0];
long pageRows = (long)this.number.Value;//定义每页显示的行数,行数必须小于
//nowPage++;//委託
xlApp.Visible = true;
if (xlApp == null)
{
return;
}
long rows = db.Rows.Count;
if (rows > 0)
{
int scount = (int)(rows / pageRows);//总页数
if (scount * pageRows < db.Rows.Count)//当总行数不被pageRows整除时,经过四舍五入可能页数不准
{
scount = scount + 1;
}
int sc = threadIndex + 1;
if (sc > 1)
{
object missing = System.Reflection.Missing.Value;
Microsoft.Office.Interop.Excel.Worksheet sheet = (Microsoft.Office.Interop.Excel.Worksheet)workbook.Sheets.get_Item(workbook.Sheets.Count);
worksheet = (Microsoft.Office.Interop.Excel.Worksheet)workbook.Worksheets.Add(missing, sheet, missing, missing);//添加一个sheet
}
else
{
worksheet = (Worksheet)workbook.Worksheets[sc];//取得sheet1
}
string[,] datas = new string[pageRows + 1, db.Columns.Count + 1];
for (int i = 0; i < db.Columns.Count; i++) //写入字段
{
datas[0, i] = db.Columns[i].Caption;
}
Range range = worksheet.Range[worksheet.Cells[1, 1], worksheet.Cells[1, db.Columns.Count]];
range.Interior.ColorIndex = 15;//15代表灰色
range.Font.Bold = true;
range.Font.Size = 9;
// int init = int.Parse(((sc - 1) * pageRows).ToString());
int r = 0;
int Index = 0;
int result;
if (pageRows * sc >= db.Rows.Count)
{
result = db.Rows.Count;
}
else
{
result = int.Parse((pageRows * sc).ToString());
}
for (r = 0; r < result; r++)
{
Index = Index + 1;
for (int i = 0; i < db.Columns.Count; i++)
{
object obj = db.Rows[r][db.Columns[i].ColumnName];
datas[Index, i] = obj == null ? "" : "'" + obj.ToString().Trim();//在obj.ToString()前加单引号是为了防止自动转化格式
}
//System.Windows.Forms.Application.DoEvents();
}
Range fchR = worksheet.Range[worksheet.Cells[1, 1], worksheet.Cells[Index + 2, db.Columns.Count + 1]];
fchR.Value2 = datas; //报错 没有足够的内存
worksheet.Columns.EntireColumn.AutoFit();//列宽自适应。
range = worksheet.Range[worksheet.Cells[1, 1], worksheet.Cells[Index + 1, db.Columns.Count]];

range.Font.Size = 9;
range.RowHeight = 14.25;
range.Borders.LineStyle = 1;
range.HorizontalAlignment = 1;
}
Thread.Sleep(100);
workbook.Saved = true;
workbook.SaveCopyAs(path);
//if (nowPage<=maxnumber)
//{
// mydel md = new mydel(dowork);
// md(ref nowPage);
//}
}
}
#endregion
...全文
452 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
wrzs 2018-09-05
  • 打赏
  • 举报
回复
感觉封神就是屌。。。还知道卖手抓饼的,珍惜不错。

引用 4 楼 diaodiaop 的回复:
我们先不谈问题的所在性..

你知道100W条数据的xls是多大吗?

你曾经打开过 20W条数据的xls吗?

我们假设你解决了这个问题 把100W 甚至更多 保存到了xls里.

请问这个xls给谁?干嘛用? 你确定你能打开读取? 所以问题不在 代码如何写 而是先确定思路是否正确?

以前有一个人跟你一样 他要把2E的数据导到xls里 导了好几个小时也没导完.. 现在不知道手抓饼生意做的如何了..
正怒月神 2017-03-28
  • 打赏
  • 举报
回复
System.Data.DataTable db = DB(this.sqlwhere.Text.Trim()).Tables[0];
可能是你加载了太多的数据到datatable了。导致内存不够了。 先试试加载1W条,然后使用这个导出功能,有没有问题
by_封爱 版主 2017-03-28
  • 打赏
  • 举报
回复
我们先不谈问题的所在性.. 你知道100W条数据的xls是多大吗? 你曾经打开过 20W条数据的xls吗? 我们假设你解决了这个问题 把100W 甚至更多 保存到了xls里. 请问这个xls给谁?干嘛用? 你确定你能打开读取? 所以问题不在 代码如何写 而是先确定思路是否正确? 以前有一个人跟你一样 他要把2E的数据导到xls里 导了好几个小时也没导完.. 现在不知道手抓饼生意做的如何了..
qq_36929384 2017-03-28
  • 打赏
  • 举报
回复
我已经是利用分页导出了 ,sql语句就是分页上边代码有啊
Mooyi_水 2017-03-28
  • 打赏
  • 举报
回复
如你说,内存不足 你一次缓存几百万条数据,还是操作Excel 这明显不是很合理的,你可以用分页的思想来导出导完一个回收下内存 这样内存应该是够用的
qq_36929384 2017-03-28
  • 打赏
  • 举报
回复
求大神帮忙解决 一下
qq_36929384 2017-03-28
  • 打赏
  • 举报
回复
我的100万已成功导出,我的确要上亿数据导出领导安排的没办法啊
YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明

110,535

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧