Excel 列转行/行列转换全指南:从 4 种常见解法到 Python 批量自动化
在数据分析、报表处理与办公自动化中,Excel 的“列转行”(或称“行列转置”)是一项高频需求。无论是整理原始数据、重构报表结构,还是将纵向的数据明细转换为横向的汇总展示,都需要用到这一技巧。
本文我们将详细介绍 4 种常见的 Excel 内置的行列转置方法,介绍其原理并给出具体操作步骤;同时,针对无 Office 环境、服务端运行以及批量自动化等需求,提供基于 Python 的代码实现方案。
一、使用 Microsoft Excel 自带的功能实现行列转置
1. 选择性粘贴(静态转置)
选择性粘贴是将内存中源区域的矩阵行列坐标直接翻转($A_{ij} > A_{ji}$)并写入目标位置。这种方式属于静态复制,适合数据后续不会再发生变动的一性处理场景。
- 操作步骤:
这是去掉步骤小标题并保持排版简洁清晰的版本:
- 鼠标拖拽选中需要转换的列数据区域。
- 右键点击选择“复制”,或按下快捷键
Ctrl + C。(注意:请勿使用Ctrl + X剪切,剪切状态下转置功能不可用)。 - 点击空白区域作为放置转置数据的起始单元格。
- 右键点击目标单元格,在粘贴选项中找到转置图标;或者点击选择性粘贴,在弹出的对话框中勾选转置并确认。

- 优点: 操作门槛低,能保留原单元格的字体、背景色等样式。
- 缺点: 适合处理最终的结果文档,因为当源数据发生修改时,转换后的数据无法自动联动更新;若源区域包含合并单元格,直接转置会引发报错。
2. 函数公式法(动态联动)
函数公式法通过在目标单元格与源单元格之间建立动态引用实现转置。当源数据还在持续更新,且希望转换后的数据能够实时同步变化时,可以使用函数公式。
A:TRANSPOSE 动态数组函数
- 操作步骤:
- 对于 Excel 365 / Office 2021 及更新版本:
直接在目标单元格输入公式=TRANSPOSE(A1:B7),按Enter回车即可。Excel 会自动填充对应的行列数据。 - 对于 Excel 2019 及更早版本(传统 CSE 数组公式):
- 计算源数据的行列数(例如源数据为 7 行 2 列)。
- 在目标区域反向选中对应大小的空白格子(即选中 2 行 7 列,如
D1:J2)。 - 保持选中状态,在公式栏输入
=TRANSPOSE(A1:B7)。

- 按下
Ctrl + Shift + Enter组合键完成数组公式填充。
- 优点: 源数据修改后,转置结果实时更新。
- 缺点: 旧版本需手动计算并选中目标区域,操作步骤稍多;且公式转置仅传递数值/计算结果,无法复制原单元格的格式与样式。
B:INDEX + ROW / COLUMN 坐标函数映射
利用 COLUMN() 在公式向右填充时依次递增(1, 2, 3...)的特性,动态改变 INDEX 函数在源列中的行索引,从而将纵向的列映射为横向的行。
- 典型公式与操作:
- 在目标单元格输入公式:
=INDEX($A$1:$A$10, COLUMN(A1))。

- 选中目标单元格,向右拖拽填充柄,公式中的
COLUMN(A1)会依次变为COLUMN(B1)、COLUMN(C1),实现动态映射。
3. Power Query 法(取消列透视 / 逆透视)
Power Query(在 Excel 2016 及更高版本中位于数据选项卡中)基于 M 语言进行列式运算与数据重构,适合在处理复杂的二维交叉表或进行数据清洗时使用。
- 操作步骤:
- 选中源数据区域,点击菜单栏数据 > 自表格/区域(若未建立表,Excel 会自动将其转换为标准数据表)。

- 根据具体需求选择转换方式:
- 在 Power Query 编辑器顶部菜单点击转换选项卡,找到并点击转置,实现整表行列互换。

- 选中无需转换的属性列,右键选择逆透视其他列(或选中需要转换的多列后右键选择逆透视列),将多列属性转换为属性-值的多行纵向结构。

- 点击左上角主页> 关闭并加载,转置后的数据将被写入一张全新的工作表中。
- 优点: 可应对复杂报表的规范化清洗,且支持数据刷新。
- 缺点: 界面交互较重,适合桌面端手动交互,无法直接打包部署为轻量级的后端自动化服务。
4. VBA 宏自动化法(本地脚本自动化)
VBA 宏通过 COM 接口直接调用 Excel 引擎内置的 WorksheetFunction.Transpose 接口或对数组进行转置处理。如果需要频繁对固定结构的表格进行转置,可以通过编写 VBA 宏脚本将这个功能自动化。
- 操作步骤:
- 按
Alt + F11打开 VBA 编辑器(VBE)。 - 在左侧项目工程树中右键点击当前工作簿,选择插入 > 模块。

- 在代码窗口粘贴以下 VBA 代码:
Sub TransposeColumnToRow()
Dim SourceRange As Range
Dim TargetRange As Range
Set SourceRange = Sheet1.Range("A1:A10")
Set TargetRange = Sheet1.Range("C1:L1")
TargetRange.Value = Application.WorksheetFunction.Transpose(SourceRange.Value)
End Sub
- 按
F5运行或在 Excel 界面绑定按钮执行。
- 优点: 在本地 Office 环境中可实现重复任务的批量处理。
- 缺点: 高度依赖 Windows + Microsoft Office 环境;包含宏的
.xlsm文件在企业邮件或系统上传时常被阻止;无法部署在 Linux 服务器或 Docker 容器中静默运行。
二、内置解法的局限
尽管上述四种方法已经能够覆盖常见的办公需求了,但综合分析以上 4 种内置解法,仍然能够发现它们在应用与服务端自动化场景中,存在以下难点:
- 依赖桌面环境: 手动操作、Power Query 与 VBA 都必须依赖本地 Windows/Mac 系统上安装的 Office 软件。在 Linux 服务器、Docker 容器或 Web 后端(如 Django/Flask/FastAPI)中无法运行。
- 批量并发效率较低: 面对包含数百个 Excel 文件的文件夹,依靠手动或调用本地 COM 对象循环打开文件容易导致内存占用过高或卡死。
因此,在无 MS Office 的服务器或自动化运维环境下,需要一种能够通过 Python 脚本进行独立、高效且批量处理的解决方案。
三、Python 自动化实现 Excel 行列转置
Spire.XLS for Python 是一个独立运行的 Excel API 组件,支持在不安装 Microsoft Excel 或 WPS 的前提下,在 Python 环境中创建、读取、编辑和转换 Excel 文件。
它在处理行列转置任务时,还能够同时读取数据与单元格的字体、背景色、边框样式,并将其应用到目标转置区域。
1. 环境准备
在命令行终端中运行以下命令安装:
pip install Spire.XLS
2. 单表列转行(带格式转置)
下面的代码展示了如何读取指定列的有效数据及其样式,并将其转置写入目标行中:
from spire.xls import *
from spire.xls.common import *
# 设置文件路径
INPUT_FILE = "/input/欧洲人口数量前十.xlsx"
OUTPUT_FILE = "/output/转置指定列.xlsx"
SOURCE_COL = 1 # 需要转置的源列索引(1 表示 A 列)
TARGET_ROW = 13 # 转置后写入的目标起始行
TARGET_START_COL = 1 # 转置后写入的目标起始列(1 表示从 A 列开始横向写入)
# 加载文件并获取第一个工作表
workbook = Workbook()
workbook.LoadFromFile(INPUT_FILE)
worksheet = workbook.Worksheets[0]
# 读取指定列数据与样式
column_data = []
max_row = worksheet.LastRow
for row_index in range(1, max_row + 1):
cell = worksheet.Range[row_index, SOURCE_COL]
# 跳过空单元格
if cell.Value is None or str(cell.Value).strip() == "":
continue
# 存储单元格的值与其 Style 样式对象
column_data.append((cell.Value, cell.Style))
# 将列数据横向写入目标行
for idx, (value, source_style) in enumerate(column_data):
target_col = TARGET_START_COL + idx
target_cell = worksheet.Range[TARGET_ROW, target_col]
# 赋值与样式迁移
target_cell.Value = value
target_cell.Style = source_style
# 保存修改后的文件
workbook.SaveToFile(OUTPUT_FILE, ExcelVersion.Version2016)
workbook.Dispose()
print(f"单列转置完成!结果已保存至: {OUTPUT_FILE}")

3. 实战二:转换整个工作表
下面的代码示例展示了如何获取第一个工作表的数据并将其全部进行行列转置,转置后的数据仍然放在原表中:
from spire.xls import *
from spire.xls.common import *
# 设置文件路径
INPUT_FILE = "/input/欧洲人口数量前十.xlsx"
OUTPUT_FILE = "/output/output.xlsx"
# 加载文件并获取第一个工作表
workbook = Workbook()
workbook.LoadFromFile(INPUT_FILE)
worksheet = workbook.Worksheets[0]
# 获取原表动态最大行列数
max_row = worksheet.LastRow
max_col = worksheet.LastColumn
# 读取工作表数据与样式
table_data = []
for r in range(1, max_row + 1):
row_cells = []
for c in range(1, max_col + 1):
cell = worksheet.Range[r, c]
row_cells.append((cell.Value, cell.Style))
table_data.append(row_cells)
# 将原表数据转置写入目标工作表
start_target_row = max_row + 2
for r_idx in range(max_row):
for c_idx in range(max_col):
val, style = table_data[r_idx][c_idx]
# 行列坐标互换:原表[r][c] 映射为 目标表[c][r]
target_cell = worksheet.Range[start_target_row + c_idx, 1 + r_idx]
target_cell.Value = val
target_cell.Style = style
# 保存修改后的文件
workbook.SaveToFile(OUTPUT_FILE, ExcelVersion.Version2016)
workbook.Dispose()
print(f"转置完成!结果已保存至: {OUTPUT_FILE}")

四、你应该选择哪种方案?
下表对上述方案进行了维度对比:
| 选型维度 | 选择性粘贴 | 函数公式法 | Power Query | VBA 宏 | Spire.XLS for Python |
|---|---|---|---|---|---|
| 主要操作方式 | GUI 界面交互 | 公式表达式 | 可视化 ETL / M语言 | VBA 编程 | Python 代码 |
| 数据动态联动 | 否(静态快照) | 是(实时同步) | 是(手动/定时刷新) | 否(需事件触发) | 属于自动化脚本重新生成 |
| 运行环境要求 | 桌面端 Excel | 桌面端 Excel | 桌面端 Excel | 依赖 MS Office | 无第三方依赖 (Windows/Linux/Mac) |
| 批量处理能力 | 仅限单表 | 仅限单表 | 较强 | 受限于本地环境 | 无界面并发处理 |
| 单元格样式保留 | 是 | 否(仅留数据) | 否(转换为标准表样式) | 需编写额外代码 | 是(支持 Style 迁移) |
| 典型适用场景 | 临时单次处理 | 同一表格内数据联动 | 报表清洗与规范化 | 本地 Excel 自动化 | Linux 服务端、Python 后端系统 |
总结
对于日常办公中的单次少量数据,使用选择性粘贴或 TRANSPOSE 公式均可满足需求;在进行二维报表清洗时,Power Query 也是常用的桌面工具。
而在需要进行批量自动化处理或保留原表格样式的场景下,使用 Spire.XLS for Python 等第三方库能够在不需要依赖 Microsoft Office 的前提下完成相关的自动化需求。

浙公网安备 33010602011771号