如何快速将DataTable内容批量写入.xlsx文件,避免逐单元格写入耗时过长
性能优化解决方案
瓶颈分析
现有代码的性能损耗核心来自逐单元格写入:每次调用oSheet.Cells(row, col)都是一次跨进程的COM接口交互,单次调用开销极低但数万次叠加后就会出现数分钟的耗时,属于典型的Excel导出性能通病。
方案1:基于现有Excel Interop改造(无需更换依赖)
直接把整个DataTable的数据加载到二维数组,一次性写入Excel对应范围,写入效率可以提升几十到上百倍,10万行数据通常可以在10秒内完成。
修改后的核心代码:
你原有逻辑里的双重循环写入单元格的代码可以全部替换为以下内容:
Dim DttDatiEsporta2 As DataTable = CootralimDettagli.Tables(0) Dim rowCount As Integer = DttDatiEsporta2.Rows.Count Dim colCount As Integer = DttDatiEsporta2.Columns.Count ' 定义二维数组,大小=行数+1(多1行存储表头)* 列数 Dim dataArr(rowCount, colCount - 1) As Object ' 写入表头到数组 For i As Integer = 0 To colCount - 1 dataArr(0, i) = DttDatiEsporta2.Columns(i).ColumnName Next ' 批量写入所有行数据到数组 For rowIdx As Integer = 0 To rowCount - 1 For colIdx As Integer = 0 To colCount - 1 dataArr(rowIdx + 1, colIdx) = DttDatiEsporta2.Rows(rowIdx).Item(colIdx) Next Next ' 一次性把整个数组赋值给Excel对应范围 Dim writeRange As Excel.Range = oSheet.Range(oSheet.Cells(1, 1), oSheet.Cells(rowCount + 1, colCount)) writeRange.Value = dataArr ' 原有自动适配列宽的逻辑保留即可 oRange = oSheet.Range(oSheet.Cells(1, 1), oSheet.Cells(rowCount + 1, colCount)) oRange.EntireColumn.AutoFit()
方案2:无Excel依赖的轻量导出方案(更推荐)
如果运行环境没有安装Excel,或者不想处理Interop常见的COM对象泄漏、进程残留问题,可以使用EPPlus、NPOI等开源库直接生成xlsx文件,不需要启动Excel进程,性能比Interop方案更高,代码更简洁。
以EPPlus 4.x(MIT协议可免费商用)为例,核心代码仅需几行:
' 提前引用对应版本的EPPlus.dll Using pck As New ExcelPackage() Dim ws = pck.Workbook.Worksheets.Add("Cootralim") ' 直接加载整个DataTable,第二个参数指定是否自动生成表头 ws.Cells("A1").LoadFromDataTable(DttDatiEsporta2, True) ' 自动适配列宽 ws.Cells(ws.Dimension.Address).AutoFitColumns() ' 直接保存到目标路径 pck.SaveAs(New IO.FileInfo("G:\Fatture PER Gruppi\2021\" + DataAlContrario + "\Cosar\Cosar_Cootralim.xlsx")) End Using
提示:EPPlus 5及以上版本为商用收费协议,非商业场景可免费使用,商业场景建议使用4.5.x及以下的MIT协议版本
内容的提问来源于stack exchange,提问作者Simone
相关产品推荐
相关产品推荐

