You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何用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

火山引擎 最新活动