













在数据分析、报表处理与办公自动化中,Excel 的“列转行”(或称“行列转置”)是一项高频需求。无论是整理原始数据、重构报表结构,还是将纵向的数据明细转换为横向的汇总展示,都需要用到这一技巧。
本文我们将详细介绍 4 种常见的 Excel 内置的行列转置方法,介绍其原理并给出具体操作步骤;同时,针对无 Office 环境、服务端运行以及批量自动化等需求,提供基于 Python 的代码实现方案。
选择性粘贴是将内存中源区域的矩阵行列坐标直接翻转($A_{ij} > A_{ji}$)并写入目标位置。这种方式属于静态复制,适合数据后续不会再发生变动的一性处理场景。
这是去掉步骤小标题并保持排版简洁清晰的版本:
Ctrl + C。(注意:请勿使用 Ctrl + X 剪切,剪切状态下转置功能不可用)。
函数公式法通过在目标单元格与源单元格之间建立动态引用实现转置。当源数据还在持续更新,且希望转换后的数据能够实时同步变化时,可以使用函数公式。
TRANSPOSE 动态数组函数=TRANSPOSE(A1:B7),按 Enter 回车即可。Excel 会自动填充对应的行列数据。D1:J2)。=TRANSPOSE(A1:B7)。
Ctrl + Shift + Enter 组合键完成数组公式填充。INDEX + ROW / COLUMN 坐标函数映射利用 COLUMN() 在公式向右填充时依次递增(1, 2, 3...)的特性,动态改变 INDEX 函数在源列中的行索引,从而将纵向的列映射为横向的行。
=INDEX($A$1:$A$10, COLUMN(A1))。
COLUMN(A1) 会依次变为 COLUMN(B1)、COLUMN(C1),实现动态映射。Power Query(在 Excel 2016 及更高版本中位于数据选项卡中)基于 M 语言进行列式运算与数据重构,适合在处理复杂的二维交叉表或进行数据清洗时使用。


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

VBA 宏通过 COM 接口直接调用 Excel 引擎内置的 WorksheetFunction.Transpose 接口或对数组进行转置处理。如果需要频繁对固定结构的表格进行转置,可以通过编写 VBA 宏脚本将这个功能自动化。
Alt + F11 打开 VBA 编辑器(VBE)。
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 界面绑定按钮执行。.xlsm 文件在企业邮件或系统上传时常被阻止;无法部署在 Linux 服务器或 Docker 容器中静默运行。尽管上述四种方法已经能够覆盖常见的办公需求了,但综合分析以上 4 种内置解法,仍然能够发现它们在应用与服务端自动化场景中,存在以下难点:
因此,在无 MS Office 的服务器或自动化运维环境下,需要一种能够通过 Python 脚本进行独立、高效且批量处理的解决方案。
Spire.XLS for Python 是一个独立运行的 Excel API 组件,支持在不安装 Microsoft Excel 或 WPS 的前提下,在 Python 环境中创建、读取、编辑和转换 Excel 文件。
它在处理行列转置任务时,还能够同时读取数据与单元格的字体、背景色、边框样式,并将其应用到目标转置区域。
在命令行终端中运行以下命令安装:
pip install Spire.XLS
下面的代码展示了如何读取指定列的有效数据及其样式,并将其转置写入目标行中:
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}")

下面的代码示例展示了如何获取第一个工作表的数据并将其全部进行行列转置,转置后的数据仍然放在原表中:
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 的前提下完成相关的自动化需求。
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。