数据量在十万级时多线程导出Excel,怎么做呢?

u012764390 2016-01-29 03:27:18
数据量在十万级时多线程导出Excel,怎么做呢?
(1),在导出Excel的时候遇到数据量较大的时候,出现假死,
(2),用一种思路就是多线程优化导出。
...全文
2433 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
FainSheeg 2018-01-15
  • 打赏
  • 举报
回复
引用 21 楼 xomix 的回复:
引用 20 楼 yangliu0512 的回复:
佩服13楼,答完才看到,尼玛都埋了两年了,还能让你给挖出来。
估计是摸金校尉来了。
IT圈也是卧虎藏龙啊。
  • 打赏
  • 举报
回复
引用 20 楼 yangliu0512 的回复:
佩服13楼,答完才看到,尼玛都埋了两年了,还能让你给挖出来。
估计是摸金校尉来了。
FainSheeg 2018-01-15
  • 打赏
  • 举报
回复
佩服13楼,答完才看到,尼玛都埋了两年了,还能让你给挖出来。
FainSheeg 2018-01-15
  • 打赏
  • 举报
回复
用EXCEL对象来导10W+的数据确实有点为难了,用OLEDB吧,10W而已小CASE。不过导出来又干什么呢,用EXCEL打开也是个问题呐。
  • 打赏
  • 举报
回复
用一个10000的队列,新开一个线程,从数据库读数据,每次读5000条,主线程负责写入excel文件,表示平均每秒可以写入2万条左右
fokus 2017-02-23
  • 打赏
  • 举报
回复
1-查詢結果保存到DataTable中: 就是執行SQL了 2-DataTable 轉為數組: Dim arr(0 To Myt.Rows.Count, 0 To Myt.Columns.Count - 1) '定义一个数组,数组行列从0开始 For iColumn = 0 To Myt.Columns.Count - 1 arr(0, iColumn) = Myt.Columns(iColumn).Caption '将列标题写入第一行 Next For iRow = 0 To Myt.Rows.Count - 1 For iColumn = 0 To Myt.Columns.Count - 1 arr(iRow + 1, iColumn) = Myt.Rows(iRow).Item(iColumn).ToString '将内存表赋予数组 Next Next 3-數組粘貼到:excel xlsheet.Range(xlsheet.Cells(1, 1), xlsheet.Cells(UBound(arr, 1) + 1, UBound(arr, 2) + 1)).Value = arr '指定EXCEL区域=数组
勤奋的小游侠 2017-02-23
  • 打赏
  • 举报
回复
csv 文件格式了解吧?excel支持的一种,就是 数据 table符数据... 所以,你直接写数组到一行就可以了。 10w级,随便开一个线程,一二分钟就写完。
loveshrimp423 2017-02-23
  • 打赏
  • 举报
回复
上面的都不是问题,最主要的问题在于你用什么导,用excel导10万条记录是找死,用NPOI吧,十来秒搞定了
大然然 2017-02-22
  • 打赏
  • 举报
回复
10万多的数据导出到excel,是导出到一个 excel,还是多个, 如果是一个我觉得你那个excel没法打开看了, 如果是多个你可以用分片导出 ,比如1--5000 导出一个, 5001--10000导出一个。。。。。 至于用不用多线程看你自己了。
一剂肠清茶 2017-02-22
  • 打赏
  • 举报
回复
引用 6 楼 wanghui0380 的回复:
额,几个线程写一个文件可以是可以 普通文件好操作,excel么因为规定问题,如果启用vsto,明显不划算,所以建议使用officexml直接写,开一个内存文件映射写,当然数据顺序无法保证,如果你是加锁写入,实际上跟一个线程没啥区别,当然vsto也有好处,你可以先算range,线程只对range区操作这样就能保证数据顺序不乱了,比如先给线程一分1w个数据,他只负责写range(1-10000)的区域,其他线程负责其他区域 。不过不建议,因为意外太多不好控制,而且10w级的excel,本身打开就慢,不小心还挂了,所以用处不大
正解, 按道理直接按月纬度生成每月的文件压缩包,感觉更靠谱
puler 2016-02-01
  • 打赏
  • 举报
回复
引用 9 楼 zbdzjx 的回复:
如果内容比较简单,而且格式没什么复杂的要求,一个方式:将结果用字符串来保存,两列之间用TAB区分,两行之间用换行区分。全部生成完后,打开EXCEL,将这个字符串贴进去。 之前有试过,速度会快很多。
思路挺有意思的,下次有机会试试
BitCoffee 2016-02-01
  • 打赏
  • 举报
回复
不是早就放假了么,怎么还有作业题?
zbdzjx 2016-02-01
  • 打赏
  • 举报
回复
如果内容比较简单,而且格式没什么复杂的要求,一个方式:将结果用字符串来保存,两列之间用TAB区分,两行之间用换行区分。全部生成完后,打开EXCEL,将这个字符串贴进去。 之前有试过,速度会快很多。
泡泡龙 2016-02-01
  • 打赏
  • 举报
回复
十万级别数量很小,直接数组导出就行,不要操作单元格导出
guestb 2016-02-01
  • 打赏
  • 举报
回复
起一个后台线程执行导出。
圣殿骑士18 2016-01-29
  • 打赏
  • 举报
回复
10w级,不多吧。耗费时间不会太大。 如果只是为了防假死,你导出操作新启动一个线程来导出。 如果要提高效率,可以启动多个线程导出多个临时Excel,之后再合并Excel
wanghui0380 2016-01-29
  • 打赏
  • 举报
回复
额,几个线程写一个文件可以是可以 普通文件好操作,excel么因为规定问题,如果启用vsto,明显不划算,所以建议使用officexml直接写,开一个内存文件映射写,当然数据顺序无法保证,如果你是加锁写入,实际上跟一个线程没啥区别,当然vsto也有好处,你可以先算range,线程只对range区操作这样就能保证数据顺序不乱了,比如先给线程一分1w个数据,他只负责写range(1-10000)的区域,其他线程负责其他区域 。不过不建议,因为意外太多不好控制,而且10w级的excel,本身打开就慢,不小心还挂了,所以用处不大
exception92 2016-01-29
  • 打赏
  • 举报
回复
使用流导出,再做个进度条。
xdashewan 2016-01-29
  • 打赏
  • 举报
回复
多线程优化导出如果是解决界面卡死问题,那完全正确。但如果你想加快导出速度,那么这就是完全错误的想法。解决界面卡死说是多线程,其实也就是在主线程外另起一个导出线程,仅此一个而已
纸飞机_ 2016-01-29
  • 打赏
  • 举报
回复
(2),用一种思路就是多线程优化导出。 这是什么意思?多开几个线程可以优化导出的速度么?难道还能几个线程一起导出一份文件?
加载更多回复(2)

110,570

社区成员

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

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

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