
在业务数据处理、报表生成、ETL 开发场景中,Excel 行列互换(转置)属于高频需求。在桌面版 Microsoft Excel 中,可通过复制 + 选择性粘贴‑转置快速实现;而在.NET 程序开发中,经常需要不依赖本地安装 Microsoft Excel,通过代码完成行列转置。
本文将介绍如何使用 Spire.XLS for .NET 在 C# 中转置行列的两种实用方法,从静态复制转置到原生 TRANSPOSE 数组公式,帮助开发者根据业务场景选型。
环境准备
- .NET 项目,支持
.NET Framework/.NET Core/.NET 5+ - 通过 NuGet 包管理器安装 Spire.XLS for .NET
Install-Package Spire.XLS
注意: Spire.XLS 支持 Windows、macOS、Linux 跨平台解析与生成 Excel 文件。
方案 1:通过静态复制转置行列数据
从 Spire.XLS 16.1.4 开始,该库在复制单元格区域时引入了对行列转置的原生支持。它会创建转置数据的独立快照,同时保留单元格格式。
using Spire.Xls;
class Program
{
static void Main()
{
// 1. 创建新工作簿
Workbook workbook = new Workbook();
// 2. 加载现有 Excel 文件
workbook.LoadFromFile(@"F:\销售数据.xlsx");
// 3. 获取第一个工作表
Worksheet sheet = workbook.Worksheets[0];
// 4. 定义源区域(例如 A1:D5)
CellRange sourceRange = sheet.Range["A1:D5"];
// 5. 定义目标单元格(左上角)
CellRange destCell = sheet.Range["F7"];
// 6. 设置转置选项
CopyRangeOptions options = CopyRangeOptions.Transpose | CopyRangeOptions.All;
// 7. 复制区域并转置
sourceRange.Copy(destCell, options);
// 8. 保存结果
workbook.SaveToFile(@"行列转置.xlsx", ExcelVersion.Version2016);
workbook.Dispose();
}
}
工作原理
CopyRangeOptions.Transpose:开启行列互换能力;CopyRangeOptions.All:同时复制单元格值、公式、填充色、边框、字体等全部格式;多个枚举使用按位或|组合;- 只需传入目标左上角单元格,组件会自动根据源区域大小计算完整输出范围。
结果预览:
源区域 A1:D5 被转置到 F7:J10。原始行变为列,原始列变为行。

不复制样式
如果仅需要原始业务数据,不需要格式,移除 CopyRangeOptions.All:
CopyRangeOptions options = CopyRangeOptions.Transpose;
复制到不同工作表
将源工作表的数据,转置粘贴到全新工作表:
Worksheet sourceSheet = workbook.Worksheets[0];
Worksheet destSheet = workbook.Worksheets.Add("TransposedData");
CellRange sourceRange = sourceSheet.Range["A1:D5"];
CellRange destCell = destSheet.Range["A1"];
CopyRangeOptions options = CopyRangeOptions.Transpose | CopyRangeOptions.All;
sourceRange.Copy(destCell, options);
方案 2:通过动态 TRANSPOSE 数组公式转置
Spire.XLS 16.9.2 添加了对 Excel TRANSPOSE 函数的支持。如果希望转置结果与源区域保持动态关联,可以使用此方法:当源数据变化时,转置区域可自动更新(取决于 Excel 的计算设置)。
using Spire.Xls;
class Program
{
static void Main()
{
// 加载现有 Excel 文件
Workbook workbook = new Workbook();
workbook.LoadFromFile(@"F:\销售数据.xlsx");
// 获取第一个工作表
Worksheet sheet = workbook.Worksheets[0];
// 源区域:A1:D5(5 行 × 4 列)
// 转置输出:F7:J10(4 行 × 5 列)
sheet.Range["F7:J10"].FormulaArray = "=TRANSPOSE(A1:D5)";
// 保存结果
workbook.SaveToFile("转置函数.xlsx", ExcelVersion.Version2016);
workbook.Dispose();
}
}
注意事项
- 输出区域尺寸必须匹配:源区域为
m行 × n列,目标区域必须设置为n行 × m列,行列数量严格互换; - 公式需通过
FormulaArray作为数组公式输入,而不是使用普通的Formula属性; - 动态刷新生效前提:用户打开 Excel 文件时开启自动计算;
- 公式模式不会复制源单元格的样式、边框、颜色。
结果预览:

两种转置数据的方法比较
| 功能 | 方案 1:静态复制转置 | 方案 2:TRANSPOSE 数组公式 |
|---|---|---|
| 数据类型 | 静态独立副本(数值 + 格式) | Excel 数组公式转置 |
| 自动更新 | 不支持 | 支持(Excel 开启自动计算) |
| 保留格式 | 完整保留 | 不保留 |
| 单元格内容 | 普通静态值 | 内嵌 Excel 公式 |
| 适用业务场景 | 一次性数据转换,需要保留原有样式 | Excel 模板、动态报表、数据看板 |
结论:如何选择合适的方法
在 C# 中将行转为列、列转为行是十分常见的开发需求,Spire.XLS for .NET 对该功能提供了很好的支持。选择哪种方案取决于你需要静态快照,还是公式驱动的动态结果。
选择方案 1 的场景:
- 需要一份转置后的数据快照
- 需要保留单元格样式、边框、填充等格式
- 用户只查看结果,不会修改源数据
选择方案 2 的场景:
- 制作供用户编辑的 Excel 模板
- 转置区域需要跟随源数据自动刷新
- 追求代码简洁,不需要复制单元格格式
在生产部署之前,请务必使用真实业务数据对导出的 Excel 文件做校验。这些可复用代码片段有助于简化 .NET 应用程序中的行列转换。
常见问题解答
问:可以对单行或者单列做转置吗?
答: 可以。将源区域设置为单行,例如 A1:J1;或是单列,例如 A1:A10。转置后就会变成一列或者一行。
问:CopyRangeOptions.Transpose 是否适用于合并单元格?
答: 合并单元格在转置时行为不可预测。 CopyRangeOptions.Transpose 在部分场景下可以保留合并单元格,但更稳妥的做法是转置前取消单元格合并,或者对输出结果做测试验证。
问:静态转置后,可以独立修改转置后的单元格吗?
答: 可以。静态转置生成的是独立单元格副本,只保存数值和格式,和源单元格没有任何关联。修改转置区域不会影响源数据,修改源数据也不会影响转置结果。
问:可以一次性对多个区域同时转置吗?
答: 不能通过单个内置调用实现。你可以逐个对每个区域执行转置,并将结果放到不同目标位置;也可以先把多块数据合并为一个区域,再执行转置。







