如何用Export-CSV对超160万条SQL结果集进行多Sheet分区导出?
解决PowerShell导出超100万条SQL结果到多Sheet Excel的问题
没问题!你遇到的其实是Excel单工作表的行数限制(最多1,048,576行),而Export-CSV导出的CSV文件本身没有这个上限,但用Excel打开时会自动截断超出部分。要实现分Sheet导出,咱们可以用PowerShell的ImportExcel模块(它基于EPPlus库,专门用来处理Excel文件),直接把数据分批次写入不同的工作表。
步骤1:先安装ImportExcel模块
打开PowerShell(建议以管理员身份运行)执行以下命令:
Install-Module -Name ImportExcel -Scope CurrentUser -Force
如果提示信任PowerShell仓库,输入Y确认即可完成安装。
步骤2:修改你的代码实现分Sheet导出
替换你原来的导出逻辑,改成按批次分割数据并写入多Sheet:
# 保留你原有的数据库连接和查询逻辑 $SqlCmd.Connection = $SqlConnection $SqlAdapter = New-Object System.Data.SqlClient.SqlDataAdapter $SqlAdapter.SelectCommand = $SqlCmd $SqlAdapter.SelectCommand.CommandTimeout=1200 $DataSet = New-Object System.Data.DataSet $SqlAdapter.Fill($DataSet) $results = $DataSet.Tables[0] | Select-Object * # 定义Excel单Sheet可容纳的最大数据行数(留1行给表头,所以实际数据行是1048575) $maxRowsPerSheet = 1048575 $totalRows = $results.Count $sheetCount = [math]::Ceiling($totalRows / $maxRowsPerSheet) # 循环将数据分批次写入不同Sheet for ($i=0; $i -lt $sheetCount; $i++) { $startIndex = $i * $maxRowsPerSheet $endIndex = [math]::Min(($i+1)*$maxRowsPerSheet - 1, $totalRows - 1) $batchData = $results[$startIndex..$endIndex] # 写入Excel,每个Sheet命名为"数据_第X页" $batchData | Export-Excel -Path "C:\Users\MX02689\Desktop\DemandaAlta.xlsx" ` -WorksheetName "数据_第$($i+1)页" ` -NoTypeInformation ` -Append } # 关闭数据库连接(注意你原来的代码里return之后的Close不会执行,要放在数据处理完成后) $SqlConnection.Close()
关键细节说明:
- 我们把数据按
1048575行一个批次分割,确保每个Sheet的总行数不超过Excel的上限 - 使用
Export-Excel的-Append参数,能在同一个Excel文件里持续添加新的工作表 - 原代码里的
return会直接终止脚本,导致后续的数据库连接关闭命令无法执行,所以这里调整了逻辑,先处理完数据再关闭连接
这样就能把160万条数据分成2个Sheet(第一个Sheet1048575行,第二个Sheet约55万行)导出到同一个Excel文件里了。
内容的提问来源于stack exchange,提问作者Heber Solis




