使用C#将多个Worksheets合并为单个Worksheet
使用C#合并多个Excel工作表到单个工作表
下面提供两种主流类库的实现方案,都是实际项目中常用的:
方案一:使用EPPlus类库
EPPlus是操作Excel的热门类库,适合处理.xlsx格式文件。
步骤说明
- 安装EPPlus包:在NuGet包管理器中搜索并安装
EPPlus - 核心逻辑:遍历目标工作簿的所有工作表,将每个工作表的数据(仅第一个表保留表头)复制到新工作表中
代码示例
using OfficeOpenXml; using System.IO; class ExcelMerger { static void MergeWorksheets(string sourceFilePath, string outputFilePath) { // EPPlus 5+版本需设置许可证上下文(非商业使用) ExcelPackage.LicenseContext = LicenseContext.NonCommercial; using (var package = new ExcelPackage(new FileInfo(sourceFilePath))) { var mergedWorksheet = package.Workbook.Worksheets.Add("合并结果"); int currentRow = 1; foreach (var worksheet in package.Workbook.Worksheets) { int rowCount = worksheet.Dimension?.Rows ?? 0; int colCount = worksheet.Dimension?.Columns ?? 0; if (rowCount == 0) continue; // 第一个工作表保留表头 if (currentRow == 1) { worksheet.Cells[1, 1, 1, colCount].Copy(mergedWorksheet.Cells[currentRow, 1]); currentRow++; } // 复制数据行(从第2行开始) worksheet.Cells[2, 1, rowCount, colCount].Copy(mergedWorksheet.Cells[currentRow, 1]); currentRow += rowCount - 1; } package.SaveAs(new FileInfo(outputFilePath)); } } // 调用示例 static void Main() { MergeWorksheets(@"C:\source.xlsx", @"C:\merged.xlsx"); } }
方案二:使用NPOI类库
NPOI是免费开源类库,支持.xls和.xlsx格式,适合兼容旧版本Excel的场景。
步骤说明
- 安装NPOI包:在NuGet包管理器中搜索并安装
NPOI和NPOI.OOXML - 核心逻辑:逐行读取各工作表数据,写入合并工作表,避免表头重复
代码示例
using NPOI.SS.UserModel; using NPOI.XSSF.UserModel; using System.IO; class ExcelMerger { static void MergeWorksheets(string sourceFilePath, string outputFilePath) { using (var fs = new FileStream(sourceFilePath, FileMode.Open, FileAccess.Read)) { var workbook = new XSSFWorkbook(fs); var mergedSheet = workbook.CreateSheet("合并结果"); int currentRowNum = 0; bool isFirstSheet = true; foreach (ISheet sheet in workbook) { int rowCount = sheet.LastRowNum; if (rowCount < 0) continue; // 第一个工作表写入表头 if (isFirstSheet) { var headerRow = sheet.GetRow(0); if (headerRow != null) { var newRow = mergedSheet.CreateRow(currentRowNum++); CopyRow(headerRow, newRow); } isFirstSheet = false; } // 写入数据行 for (int i = 1; i <= rowCount; i++) { var sourceRow = sheet.GetRow(i); if (sourceRow == null) continue; var newRow = mergedSheet.CreateRow(currentRowNum++); CopyRow(sourceRow, newRow); } } // 自动调整列宽 for (int i = 0; i < mergedSheet.GetRow(0).LastCellNum; i++) { mergedSheet.AutoSizeColumn(i); } // 保存合并后的文件 using (var outputFs = new FileStream(outputFilePath, FileMode.Create, FileAccess.Write)) { workbook.Write(outputFs); } } } // 辅助方法:复制行数据及样式 static void CopyRow(IRow sourceRow, IRow targetRow) { targetRow.Height = sourceRow.Height; for (int i = sourceRow.FirstCellNum; i < sourceRow.LastCellNum; i++) { var sourceCell = sourceRow.GetCell(i); var targetCell = targetRow.CreateCell(i); if (sourceCell != null) { targetCell.CellStyle = sourceCell.CellStyle; switch (sourceCell.CellType) { case CellType.String: targetCell.SetCellValue(sourceCell.StringCellValue); break; case CellType.Numeric: targetCell.SetCellValue(sourceCell.NumericCellValue); break; case CellType.Boolean: targetCell.SetCellValue(sourceCell.BooleanCellValue); break; case CellType.Formula: targetCell.SetCellFormula(sourceCell.CellFormula); break; default: targetCell.SetCellValue(sourceCell.StringCellValue); break; } } } } // 调用示例 static void Main() { MergeWorksheets(@"C:\source.xlsx", @"C:\merged.xlsx"); } }
注意事项
- 若处理
.xls格式文件,NPOI方案需替换XSSFWorkbook为HSSFWorkbook,并引用NPOI.HSSF.UserModel - 处理超大Excel文件时,建议优化为逐行流式读写,避免内存占用过高
- EPPlus商业使用需购买授权,非商业使用可免费
内容的提问来源于stack exchange,提问作者Yugandhar
相关产品推荐
相关产品推荐

