数据量在十万级时多线程导出Excel,怎么做呢? 数据量在十万级时多线程导出Excel,怎么做呢?(1),在导出Excel的时候遇到数据量较大的时候,出现假死,(2),用一种思路就是多线程优化导出。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 额,几个线程写一个文件可以是可以普通文件好操作,excel么因为规定问题,如果启用vsto,明显不划算,所以建议使用officexml直接写,开一个内存文件映射写,当然数据顺序无法保证,如果你是加锁写入,实际上跟一个线程没啥区别,当然vsto也有好处,你可以先算range,线程只对range区操作这样就能保证数据顺序不乱了,比如先给线程一分1w个数据,他只负责写range(1-10000)的区域,其他线程负责其他区域。不过不建议,因为意外太多不好控制,而且10w级的excel,本身打开就慢,不小心还挂了,所以用处不大 10w级,不多吧。耗费时间不会太大。如果只是为了防假死,你导出操作新启动一个线程来导出。如果要提高效率,可以启动多个线程导出多个临时Excel,之后再合并Excel 如果内容比较简单,而且格式没什么复杂的要求,一个方式:将结果用字符串来保存,两列之间用TAB区分,两行之间用换行区分。全部生成完后,打开EXCEL,将这个字符串贴进去。之前有试过,速度会快很多。 10万多的数据导出到excel,是导出到一个 excel,还是多个,如果是一个我觉得你那个excel没法打开看了,如果是多个你可以用分片导出 ,比如1--5000 导出一个, 5001--10000导出一个。。 至于用不用多线程看你自己了。 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 Next3-數組粘貼到:excelxlsheet.Range(xlsheet.Cells(1, 1), xlsheet.Cells(UBound(arr, 1) + 1, UBound(arr, 2) + 1)).Value = arr '指定EXCEL区域=数组 上面的都不是问题,最主要的问题在于你用什么导,用excel导10万条记录是找死,用NPOI吧,十来秒搞定了 csv 文件格式了解吧?excel支持的一种,就是 数据 table符数据...所以,你直接写数组到一行就可以了。10w级,随便开一个线程,一二分钟就写完。 用一个10000的队列,新开一个线程,从数据库读数据,每次读5000条,主线程负责写入excel文件,表示平均每秒可以写入2万条左右 用EXCEL对象来导10W+的数据确实有点为难了,用OLEDB吧,10W而已小CASE。不过导出来又干什么呢,用EXCEL打开也是个问题呐。 C#中如何设定textbox中只能输入半角数字 请教个问题,关于写程序C#自动登录MSN的 初学者问关于C#中的属性问题 用foreach进行遍历时,出现错误! 如何根据DataSet中自已构建的DataTable在数据库中创建表格 webbrowser的documentcomplete事件问题 一个取时间的小问题 在ascx文件中如何调用ascx.cs中得属性和方法 请问如何隐藏datagrid中的行 DataGid数据量大时的分页代码? C#通过IronPython调用python脚本中的函数报错 no module named… C#实现操作ppt使屏幕自动无限循环播放指定幻灯片
普通文件好操作,excel么因为规定问题,如果启用vsto,明显不划算,所以建议使用officexml直接写,开一个内存文件映射写,当然数据顺序无法保证,如果你是加锁写入,实际上跟一个线程没啥区别,当然vsto也有好处,你可以先算range,线程只对range区操作这样就能保证数据顺序不乱了,比如先给线程一分1w个数据,他只负责写range(1-10000)的区域,其他线程负责其他区域。不过不建议,因为意外太多不好控制,而且10w级的excel,本身打开就慢,不小心还挂了,所以用处不大
如果只是为了防假死,你导出操作新启动一个线程来导出。
如果要提高效率,可以启动多个线程导出多个临时Excel,之后再合并Excel
之前有试过,速度会快很多。
如果是一个我觉得你那个excel没法打开看了,
如果是多个你可以用分片导出 ,比如1--5000 导出一个, 5001--10000导出一个。。 至于用不用多线程看你自己了。
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区域=数组
所以,你直接写数组到一行就可以了。
10w级,随便开一个线程,一二分钟就写完。