C#代码实现重新排列Excel中的列
适当调整 Excel 中列的顺序可以提高数据的可读性。例如,将日期数据设置为第一列后,我们可以更快速地根据特定日期定位数据。在 Microsoft Excel 中,可以通过按住 Shift 键并拖动列的方式轻松移动列。本文将介绍如何在 C# 和 VB.NET 中以编程方式重新排列 Excel 中的列。
安装所需组件
开始之前,需要在 .NET 项目中添加相关的 Excel 处理库引用。可以通过下载 DLL 文件手动添加,也可以直接通过 NuGet 安装。
PM> Install-Package Spire.XLS
在 C# 和 VB.NET 中重新排列 Excel 列
以下是在 .NET 程序中重新排列 Excel 列的主要步骤:
- 创建
Workbook对象,并使用Workbook.LoadFromFile()方法加载 Excel 文件。 - 通过
Workbook.Worksheets[index]获取目标工作表。 - 使用
int数组指定新的列顺序。 - 创建一个临时工作表,并将目标工作表中的数据复制到该工作表。
- 按照新的列顺序,将临时工作表中的列复制回目标工作表。
- 删除临时工作表。
- 使用
Workbook.SaveToFile()方法保存修改后的 Excel 文件。
完整示例代码如下:
using System.Linq;
using Spire.Xls;
namespace 调整Excel列顺序
{
class Program
{
static void Main(string[] args)
{
// 创建 Workbook 对象
Workbook workbook = new Workbook();
// 加载 Excel 文件
workbook.LoadFromFile(@"C:\Users\Administrator\Desktop\sample.xlsx");
// 获取第一个工作表
Worksheet worksheet = workbook.Worksheets[0];
// 设置新的列顺序(列索引从 0 开始)
int[] newColumnOrder = new int[] { 3, 0, 1, 2, 4, 5 };
// 添加一个临时工作表
Worksheet newSheet = workbook.Worksheets.Add("temp");
// 将第一个工作表中的数据复制到临时工作表
newSheet.CopyFrom(worksheet);
// 遍历 newColumnOrder 数组
for (int i = 0; i < newColumnOrder.Count(); i++)
{
// 将临时工作表中的列复制到第一个工作表
newSheet.Columns[newColumnOrder[i]].Copy(worksheet.Columns[i], true, true);
// 设置目标工作表列宽与临时工作表对应列宽一致
worksheet.Columns[i].ColumnWidth = newSheet.Columns[newColumnOrder[i]].ColumnWidth;
}
// 删除临时工作表
workbook.Worksheets.Remove(newSheet);
// 保存工作簿到新的 Excel 文件
workbook.SaveToFile("MoveColumn.xlsx", FileFormat.Version2016);
}
}
}知识扩展
在 C# 或 VB.NET 中重新排列 Excel 工作表中的列,本质上是将某一列(或某几列)的数据整体移动到新的位置。由于 Excel 没有直接提供“移动列”的 API,我们需要通过 插入空白列 → 复制数据 → 删除原列 或 直接交换列范围 的方式来实现。
下面分别使用 Spire.XLS(免费版可用但有限制)和 EPPlus(开源免费) 演示如何实现。两种方法均适用于 .NET Framework 和 .NET Core。
方法一:使用 Spire.XLS(适用于 .NET,商业库但有免费版)
Spire.XLS 提供了 Columns 集合和 Copy 方法,可以轻松实现列的移动。
核心思路:
- 将目标列的
Column.Copy()到目标位置之前插入的新列。 - 删除原始列。
// C# 示例
using Spire.Xls;
class Program
{
static void Main()
{
// 加载工作簿
Workbook workbook = new Workbook();
workbook.LoadFromFile("input.xlsx");
Worksheet sheet = workbook.Worksheets[0];
// 将第 3 列移动到第 1 列前面(即新的第 1 列)
MoveColumn(sheet, 3, 1);
workbook.SaveToFile("output.xlsx", ExcelVersion.Version2016);
}
static void MoveColumn(Worksheet sheet, int sourceColIndex, int targetColIndex)
{
// 如果源列和目标列相同,直接返回
if (sourceColIndex == targetColIndex) return;
// 获取源列区域
CellRange sourceRange = sheet.Range[1, sourceColIndex, sheet.LastRow, sourceColIndex];
// 在目标位置之前插入一列(如果 targetColIndex=1,则在第一列前插入)
sheet.InsertColumn(targetColIndex);
// 获取新插入的列区域(现在位于 targetColIndex)
CellRange targetRange = sheet.Range[1, targetColIndex, sheet.LastRow, targetColIndex];
// 将源列数据复制到新插入的列
sourceRange.Copy(targetRange);
// 删除原始列(注意:插入列后,原始列的索引会增加 1)
int newSourceColIndex = sourceColIndex + (sourceColIndex >= targetColIndex ? 1 : 0);
sheet.DeleteColumn(newSourceColIndex);
}
}优点:代码简洁,无需处理大量循环。
缺点:Spire.XLS 免费版有导出页数和行数限制,适合小文件或评估。
方法二:使用 EPPlus(开源免费,仅支持 .xlsx)
EPPlus 不直接提供 InsertColumn/DeleteColumn,但可以通过操作 ExcelRange 的 Value 属性来交换或移动列数据。
核心思路:
- 将源列的数据读取到一个二维数组。
- 在目标位置插入一个空白列(通过向右偏移所有列来实现)。
- 将数据写入新位置。
- 删除源列。
由于 EPPlus 没有直接插入列的方法,我们可以通过 将目标列及之后的所有列向右移动一格 来模拟插入。
// C# 示例
using OfficeOpenXml;
using System.IO;
using System.Linq;
class Program
{
static void Main()
{
ExcelPackage.LicenseContext = LicenseContext.NonCommercial; // 开源许可
using var package = new ExcelPackage(new FileInfo("input.xlsx"));
var sheet = package.Workbook.Worksheets[0];
// 将第 3 列移动到第 1 列(1-based 索引)
MoveColumn(sheet, 3, 1);
package.SaveAs(new FileInfo("output.xlsx"));
}
static void MoveColumn(ExcelWorksheet sheet, int sourceCol, int targetCol)
{
if (sourceCol == targetCol) return;
int maxRow = sheet.Dimension.Rows;
// 步骤1:读取源列数据
var sourceData = new object[maxRow];
for (int row = 1; row <= maxRow; row++)
{
sourceData[row - 1] = sheet.Cells[row, sourceCol].Value;
}
// 步骤2:插入空白列到目标位置
// 将 targetCol 及之后的所有列向右移动一列(从右向左移动避免覆盖)
int lastCol = sheet.Dimension.Columns;
for (int col = lastCol; col >= targetCol; col--)
{
for (int row = 1; row <= maxRow; row++)
{
sheet.Cells[row, col + 1].Value = sheet.Cells[row, col].Value;
}
}
// 步骤3:将源列数据写入新的目标列
for (int row = 1; row <= maxRow; row++)
{
sheet.Cells[row, targetCol].Value = sourceData[row - 1];
}
// 步骤4:删除原始列
// 如果源列在目标列之后,删除时需要调整索引(因为已经插入了一列)
int colToDelete = sourceCol >= targetCol ? sourceCol + 1 : sourceCol;
for (int row = 1; row <= maxRow; row++)
{
for (int col = colToDelete; col < sheet.Dimension.Columns; col++)
{
sheet.Cells[row, col].Value = sheet.Cells[row, col + 1].Value;
}
}
// 删除最后一列(已经空了)
sheet.DeleteColumn(sheet.Dimension.Columns);
}
}说明:
- EPPlus 删除列需要手动移位,上述代码通过循环向前覆盖然后删除最后一列来实现。
- 对于大表格,此方法效率较低,建议使用商业库如 Aspose.Cells 或 Spire.XLS。
方法三:使用 Open XML SDK(官方库,无需第三方依赖)
Open XML SDK 直接操作 Excel 文件的 XML 结构,性能最好但代码量最大。下面给出 C# 示例的核心逻辑。
using DocumentFormat.OpenXml.Packaging;
using DocumentFormat.OpenXml.Spreadsheet;
void MoveColumnInOpenXml(string filePath, int sourceCol, int targetCol)
{
using (SpreadsheetDocument doc = SpreadsheetDocument.Open(filePath, true))
{
WorkbookPart workbookPart = doc.WorkbookPart;
WorksheetPart worksheetPart = workbookPart.WorksheetParts.First();
Worksheet worksheet = worksheetPart.Worksheet;
SheetData sheetData = worksheet.GetFirstChild<SheetData>();
// 读取所有行,并重新排列单元格顺序
foreach (Row row in sheetData.Elements<Row>())
{
var cells = row.Elements<Cell>().ToList();
if (cells.Count == 0) continue;
// 找到源列和目标列的 Cell 对象(根据列索引转换 A,B,C...)
// 注意:Open XML 中单元格引用可能不连续,需要处理缺失单元格
// 建议使用辅助方法将列号转换为列名,再通过 CellReference 定位
// 这里省略具体实现,因为代码较冗长。完整实现需要:
// 1. 获取源列和目标列的 Cell(如果不存在则创建空 Cell)
// 2. 交换两者的值、数据类型、样式等属性
// 3. 调整单元格的引用位置
}
worksheet.Save();
}
}优点:完全免费,无外部依赖。
缺点:需要深入理解 Excel Open XML 结构,处理合并单元格、公式、样式等非常复杂。
总结
本文介绍了如何在 C# 和 VB.NET 中以编程方式重新排列 Excel 工作表中的列顺序。通过创建临时工作表并结合列复制操作,可以灵活地按照指定顺序调整列的位置,同时保留原有数据和列宽设置。
这种方法适用于需要批量整理表格结构、优化数据展示顺序或自动化处理 Excel 文件的场景。相比手动拖动列的方式,程序化处理在面对大量文件时更加高效,也更便于集成到数据处理或报表生成流程中。
到此这篇关于C#代码实现重新排列Excel中的列的文章就介绍到这了,更多相关C#重新排列Excel内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!


最新评论