数据量在十万级时多线程导出Excel,怎么做呢?
(1),在导出Excel的时候遇到数据量较大的时候,出现假死,
(2),用一种思路就是多线程优化导出。

解决方案 »

  1.   

    额,几个线程写一个文件可以是可以
    普通文件好操作,excel么因为规定问题,如果启用vsto,明显不划算,所以建议使用officexml直接写,开一个内存文件映射写,当然数据顺序无法保证,如果你是加锁写入,实际上跟一个线程没啥区别,当然vsto也有好处,你可以先算range,线程只对range区操作这样就能保证数据顺序不乱了,比如先给线程一分1w个数据,他只负责写range(1-10000)的区域,其他线程负责其他区域。不过不建议,因为意外太多不好控制,而且10w级的excel,本身打开就慢,不小心还挂了,所以用处不大
      

  2.   

    10w级,不多吧。耗费时间不会太大。
    如果只是为了防假死,你导出操作新启动一个线程来导出。
    如果要提高效率,可以启动多个线程导出多个临时Excel,之后再合并Excel
      

  3.   

    如果内容比较简单,而且格式没什么复杂的要求,一个方式:将结果用字符串来保存,两列之间用TAB区分,两行之间用换行区分。全部生成完后,打开EXCEL,将这个字符串贴进去。
    之前有试过,速度会快很多。
      

  4.   

    10万多的数据导出到excel,是导出到一个 excel,还是多个,
    如果是一个我觉得你那个excel没法打开看了,
    如果是多个你可以用分片导出 ,比如1--5000 导出一个, 5001--10000导出一个。。  至于用不用多线程看你自己了。
      

  5.   

    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区域=数组
      

  6.   

    上面的都不是问题,最主要的问题在于你用什么导,用excel导10万条记录是找死,用NPOI吧,十来秒搞定了
      

  7.   

    csv 文件格式了解吧?excel支持的一种,就是 数据 table符数据...
    所以,你直接写数组到一行就可以了。
    10w级,随便开一个线程,一二分钟就写完。
      

  8.   

    用一个10000的队列,新开一个线程,从数据库读数据,每次读5000条,主线程负责写入excel文件,表示平均每秒可以写入2万条左右
      

  9.   

    用EXCEL对象来导10W+的数据确实有点为难了,用OLEDB吧,10W而已小CASE。不过导出来又干什么呢,用EXCEL打开也是个问题呐。